@@ -8251,8 +8251,7 @@ def set_gguf_parameters(self):
82518251 self .gguf_writer .add_rope_scaling_orig_ctx_len (rope_scaling .get ("original_max_position_embeddings" , 4096 ))
82528252
82538253
8254- @ModelBase .register ("Lfm2ForCausalLM" )
8255- @ModelBase .register ("LFM2ForCausalLM" )
8254+ @ModelBase .register ("Lfm2ForCausalLM" , "LFM2ForCausalLM" )
82568255class LFM2Model (TextModel ):
82578256 model_arch = gguf .MODEL_ARCH .LFM2
82588257
@@ -8287,13 +8286,55 @@ def set_gguf_parameters(self):
82878286 self ._add_feed_forward_length ()
82888287
82898288 def modify_tensors (self , data_torch : Tensor , name : str , bid : int | None ) -> Iterable [tuple [str , Tensor ]]:
8289+ is_vision_tensor = "vision_tower" in name or "multi_modal_projector" in name
8290+ if is_vision_tensor :
8291+ # skip vision tensors
8292+ return []
8293+
8294+ name = name .replace ("language_model." , "" )
8295+
82908296 # conv op requires 2d tensor
82918297 if 'conv.conv' in name :
82928298 data_torch = data_torch .squeeze (1 )
82938299
82948300 return [(self .map_tensor_name (name ), data_torch )]
82958301
82968302
8303+ @ModelBase .register ("Lfm2VlForConditionalGeneration" )
8304+ class LFM2VLModel (MmprojModel ):
8305+ def __init__ (self , * args , ** kwargs ):
8306+ super ().__init__ (* args , ** kwargs )
8307+ assert self .hparams_vision is not None
8308+ # TODO(tarek): for dynamic resolution image_size is not specified, setting here for compatibility
8309+ self .hparams_vision ["image_size" ] = 256
8310+
8311+ def set_gguf_parameters (self ):
8312+ super ().set_gguf_parameters ()
8313+ self .gguf_writer .add_clip_projector_type (gguf .VisionProjectorType .LFM2 )
8314+ self .gguf_writer .add_vision_attention_layernorm_eps (self .find_vparam (["layer_norm_eps" ]))
8315+ self .gguf_writer .add_vision_projector_scale_factor (self .global_config .get ("downsample_factor" , 2 ))
8316+ self .gguf_writer .add_vision_use_gelu (True )
8317+ # python notation, e.g. for vision_feature_layer == -1, we pick last layer -> vision_feature_layers_to_drop = 0
8318+ vision_feature_layers_to_drop = - (self .global_config .get ("vision_feature_layer" , - 1 ) + 1 )
8319+ self .gguf_writer .add_vision_block_count (self .find_vparam (self .n_block_keys ) - vision_feature_layers_to_drop )
8320+
8321+ def modify_tensors (self , data_torch : Tensor , name : str , bid : int | None ) -> Iterable [tuple [str , Tensor ]]:
8322+ del bid # unused
8323+ is_vision_tensor = "vision_tower" in name or "multi_modal_projector" in name
8324+
8325+ if is_vision_tensor :
8326+ # remove "model." prefix
8327+ name = name .replace ("model.vision_tower." , "vision_tower." )
8328+ name = name .replace ("model.multi_modal_projector." , "multi_modal_projector." )
8329+
8330+ if "patch_embedding.weight" in name :
8331+ data_torch = data_torch .view (data_torch .shape [0 ], 16 , 16 , 3 ).permute (0 , 3 , 1 , 2 )
8332+
8333+ return [(self .map_tensor_name (name ), data_torch )]
8334+
8335+ return [] # skip other tensors
8336+
8337+
82978338@ModelBase .register ("SmallThinkerForCausalLM" )
82988339class SmallThinkerModel (TextModel ):
82998340 model_arch = gguf .MODEL_ARCH .SMALLTHINKER
0 commit comments