char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
fa88ae936
char/aliceai-t5-moe
1from __future__import annotations 2 3from typing import Callable ,Iterable ,TYPE_CHECKING 4 5if TYPE_CHECKING : 6from torch import Tensor 7 8from .base import MmprojModel ,ModelBase ,gguf 9 10from .llama import LlamaModel 11 12 13@ ModelBase . register ( "JanusForConditionalGeneration" ) 14@ ModelBase . example ( "deepseek-community/Janus-Pro-1B" ) 15class JanusProModel (LlamaModel ): 16model_arch = gguf .MODEL_ARCH .LLAMA # reuse Llama arch 17 18@classmethod 19def filter_tensors (cls ,item :tuple [str ,Callable [[],Tensor ]])-> tuple [str ,Callable [[],Tensor ]]| None : 20name ,gen = item 21 22# Skip vision, aligner, and generation tensors 23skip_prefixes = ( 24'model.vision_model.' , 25'model.aligner.' , 26'model.vqmodel.' , 27'model.generation_embeddings.' , 28'model.generation_aligner.' , 29'model.generation_head.' , 30 ) 31if name .startswith (skip_prefixes ): 32return None 33 34return super ().filter_tensors (item ) 35 36 37@ ModelBase . register ( "JanusForConditionalGeneration" ) 38@ ModelBase . example ( "deepseek-community/Janus-Pro-1B" ) 39class JanusProVisionModel (MmprojModel ): 40def __init__ (self ,* args ,** kwargs ): 41super ().__init__ (* args ,** kwargs ) 42assert self .hparams_vision is not None 43if "intermediate_size" not in self .hparams_vision : 44mlp_ratio = self .hparams_vision .get ("mlp_ratio" ) 45hidden_size = self .hparams_vision .get ("hidden_size" ) 46if mlp_ratio is not None and hidden_size is not None : 47self .hparams_vision ["intermediate_size" ]= int (round (hidden_size * mlp_ratio )) 48 49def set_gguf_parameters (self ): 50super ().set_gguf_parameters () 51assert self .hparams_vision is not None 52 53self .gguf_writer .add_clip_projector_type (gguf .VisionProjectorType .JANUS_PRO ) 54 55self .gguf_writer .add_vision_attention_layernorm_eps (self .hparams_vision .get ("layer_norm_eps" ,1e-6 )) 56 57hidden_act = str (self .hparams_vision .get ("hidden_act" ,"" )).lower () 58if hidden_act == "gelu" : 59self .gguf_writer .add_vision_use_gelu (True ) 60elif hidden_act == "silu" : 61self .gguf_writer .add_vision_use_silu (True ) 62 63def _map_aligner_tensor (self ,data_torch :Tensor ,name :str )-> Iterable [tuple [str ,Tensor ]]: 64"""Map aligner tensors to projector format""" 65suffix = ".bias" if name .endswith (".bias" )else ".weight" 66 67if name .startswith ("model.aligner." ): 68local_name = name [len ("model.aligner." ):] 69elif name .startswith ("aligner." ): 70local_name = name [len ("aligner." ):] 71else : 72raise ValueError (f"Unsupported Janus aligner prefix: { name } " ) 73 74if local_name .startswith ("fc1." ): 75mm_index = 0 76elif local_name .startswith ("hidden_layers." ): 77parts = local_name .split ("." ,2 ) 78if len (parts )< 3 : 79raise ValueError (f"Unexpected Janus aligner tensor name: { name } " ) 80mm_index = int (parts [1 ])+ 1 81else : 82raise ValueError (f"Unsupported Janus aligner tensor: { name } " ) 83 84tensor_name = self .format_tensor_name (gguf .MODEL_TENSOR .V_MMPROJ ,mm_index ,suffix = suffix ) 85return [(tensor_name ,data_torch )] 86 87@classmethod 88def filter_tensors (cls ,item :tuple [str ,Callable [[],Tensor ]])-> tuple [str ,Callable [[],Tensor ]]| None : 89name ,gen = item 90 91# Skip generation-related components 92skip_generation_prefixes = ( 93'model.vqmodel.' , 94'vqmodel.' , 95'model.generation_embeddings.' , 96'generation_embeddings.' , 97'model.generation_aligner.' , 98'generation_aligner.' , 99'model.generation_head.' , 100'generation_head.' , 101 ) 102if name .startswith (skip_generation_prefixes ): 103return None 104 105return super ().filter_tensors (item ) 106 107def modify_tensors (self ,data_torch :Tensor ,name :str ,bid :int | None )-> Iterable [tuple [str ,Tensor ]]: 108# Handle aligner tensors 109if name .startswith (('model.aligner.' ,'aligner.' )): 110yield from self ._map_aligner_tensor (data_torch ,name ) 111return 112 113# Handle vision tensors 114if name .startswith (('model.vision_model.' ,'vision_model.' )): 115yield from super ().modify_tensors (data_torch ,name ,bid ) 116return 117 118return