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 Any ,Callable ,Iterable ,TYPE_CHECKING 4 5if TYPE_CHECKING : 6from torch import Tensor 7 8from .base import MmprojModel ,ModelBase ,TextModel ,gguf 9 10 11@ ModelBase . register ( "UltravoxModel" ) 12@ ModelBase . example ( "fixie-ai/ultravox-v0_5-llama-3_2-1b" ) 13class UltravoxModel (TextModel ): 14model_arch = gguf .MODEL_ARCH .LLAMA # dummy 15 16def __init__ (self ,* args ,** kwargs ): 17super ().__init__ (* args ,** kwargs ) 18raise NotImplementedError ("Ultravox does not have text decoder. Instead, it uses Llama or other models for text. If you want to get the audio encoder, please use --mmproj argument" ) 19 20 21@ ModelBase . register ( "GlmasrModel" ) 22@ ModelBase . example ( "zai-org/GLM-ASR-Nano-2512" ) 23class GlmASRWhisperEncoderModel (MmprojModel ): 24has_vision_encoder = False 25has_audio_encoder = True 26 27def __init__ (self ,* args ,** kwargs ): 28super ().__init__ (* args ,** kwargs ) 29if "hidden_size" not in self .hparams and "intermediate_size" not in self .hparams : 30self .hparams ["hidden_size" ]= self .hparams ["d_model" ] 31self .hparams ["intermediate_size" ]= self .hparams ["encoder_ffn_dim" ] 32self .hparams ["num_attention_heads" ]= self .hparams ["encoder_attention_heads" ] 33 34def set_gguf_parameters (self ): 35super ().set_gguf_parameters () 36self .gguf_writer .add_clip_projector_type (gguf .VisionProjectorType .GLMA ) 37self .gguf_writer .add_audio_num_mel_bins (self .hparams ["num_mel_bins" ]) 38self .gguf_writer .add_audio_attention_layernorm_eps (self .hparams .get ("layer_norm_eps" ,1e-5 )) 39self .gguf_writer .add_audio_stack_factor (self .global_config ["merge_factor" ]) 40 41def tensor_force_quant (self ,name ,new_name ,bid ,n_dims ): 42if ".conv" in name and ".weight" in name : 43return gguf .GGMLQuantizationType .F16 44return super ().tensor_force_quant (name ,new_name ,bid ,n_dims ) 45 46@classmethod 47def filter_tensors (cls ,item :tuple [str ,Callable [[],Tensor ]])-> tuple [str ,Callable [[],Tensor ]]| None : 48name ,gen = item 49 50if name .startswith (("model." ,"lm_head." )): 51# skip language model tensors 52return None 53 54if name .startswith ("audio_encoder.whisper." ): 55name = name .replace ("audio_encoder.whisper." ,"audio_tower." ) 56if "audio_encoder.layer_norm." in name or "audio_encoder.proj." in name : 57name = name .replace ("audio_encoder." ,"audio_encoder.adapting." ) 58if name .startswith ("audio_encoder.adapting." ): 59name = name .replace ("audio_encoder.adapting." ,"audio.multi_modal_projector." ) 60if ".layer_norm." in name : 61name = name .replace (".layer_norm." ,".ln_pre." ) 62if ".0." in name : 63name = name .replace (".0." ,".linear_1." ) 64if ".2." in name : 65name = name .replace (".2." ,".linear_2." ) 66 67return super ().filter_tensors ((name ,gen )) 68 69def modify_tensors (self ,data_torch :Tensor ,name :str ,bid :int | None )-> Iterable [tuple [str ,Tensor ]]: 70if name .startswith ("audio_encoder.audio_bos_eos_token." ): 71yield from super ().modify_tensors (data_torch [0 ],"model.vision.boi" ,bid ) 72yield from super ().modify_tensors (data_torch [1 ],"model.vision.eoi" ,bid ) 73return 74 75if name .startswith ("audio_encoder.adapting." ): 76if ".proj." in name : 77return 78 79if "conv1.bias" in name or "conv2.bias" in name : 80# transpose conv1 and conv2 bias 81data_torch = data_torch .unsqueeze (- 1 ) 82 83yield from super ().modify_tensors (data_torch ,name ,bid ) 84 85 86@ ModelBase . register ( "Qwen2AudioForConditionalGeneration" ) 87@ ModelBase . example ( "Qwen/Qwen2-Audio-7B-Instruct" ) 88class WhisperEncoderModel (MmprojModel ): 89has_vision_encoder = False # no vision encoder 90has_audio_encoder = True 91 92def __init__ (self ,* args ,** kwargs ): 93super ().__init__ (* args ,** kwargs ) 94if "hidden_size" not in self .hparams and "intermediate_size" not in self .hparams : 95self .hparams ["hidden_size" ]= self .hparams ["d_model" ] 96self .hparams ["intermediate_size" ]= self .hparams ["encoder_ffn_dim" ] 97self .hparams ["num_attention_heads" ]= self .hparams ["encoder_attention_heads" ] 98 99def set_gguf_parameters (self ): 100super ().set_gguf_parameters () 101self .gguf_writer .add_clip_projector_type (gguf .VisionProjectorType .QWEN2A ) 102self .gguf_writer .add_audio_num_mel_bins (self .hparams ["num_mel_bins" ]) 103self .gguf_writer .add_audio_attention_layernorm_eps (self .hparams .get ("layer_norm_eps" ,1e-5 )) 104 105def tensor_force_quant (self ,name ,new_name ,bid ,n_dims ): 106if ".conv" in name and ".weight" in name : 107return gguf .GGMLQuantizationType .F16 108return super ().tensor_force_quant (name ,new_name ,bid ,n_dims ) 109 110@classmethod 111def filter_tensors (cls ,item :tuple [str ,Callable [[],Tensor ]])-> tuple [str ,Callable [[],Tensor ]]| None : 112name ,gen = item 113 114# prevent clash naming with vision tensors 115if name .startswith ("multi_modal_projector" ): 116name = "audio." + name 117 118return super ().filter_tensors ((name ,gen )) 119 120def modify_tensors (self ,data_torch :Tensor ,name :str ,bid :int | None )-> Iterable [tuple [str ,Tensor ]]: 121if "conv1.bias" in name or "conv2.bias" in name : 122# transpose conv1 and conv2 bias 123data_torch = data_torch .unsqueeze (- 1 ) 124 125yield from super ().modify_tensors (data_torch ,name ,bid ) 126 127 128@ ModelBase . register ( "UltravoxModel" ) 129@ ModelBase . example ( "fixie-ai/ultravox-v0_5-llama-3_2-1b" ) 130class UltravoxWhisperEncoderModel (WhisperEncoderModel ): 131has_vision_encoder = False # no vision encoder 132has_audio_encoder = True 133 134def set_gguf_parameters (self ): 135super ().set_gguf_parameters () 136self .gguf_writer .add_clip_projector_type (gguf .VisionProjectorType .ULTRAVOX ) 137self .gguf_writer .add_audio_stack_factor (self .global_config ["stack_factor" ]) 138 139 140@ ModelBase . register ( "MERaLiON2ForConditionalGeneration" ) 141@ ModelBase . example ( "MERaLiON/MERaLiON-2-3B" ) 142class MERaLiONWhisperEncoderModel (WhisperEncoderModel ): 143has_vision_encoder = False 144has_audio_encoder = True 145 146def get_audio_config (self )-> dict [str ,Any ]| None : 147return self .global_config .get ("speech_config" ) 148 149def set_gguf_parameters (self ): 150super ().set_gguf_parameters () 151self .gguf_writer .add_clip_projector_type (gguf .VisionProjectorType .MERALION ) 152self .gguf_writer .add_audio_stack_factor (self .global_config .get ("speech_mlp_scale_factor" ,15 )) 153 154@classmethod 155def filter_tensors (cls ,item :tuple [str ,Callable [[],Tensor ]])-> tuple [str ,Callable [[],Tensor ]]| None : 156name ,gen = item 157 158if name .startswith ("text_decoder." ): 159return None 160 161if name .startswith ("speech_encoder." ): 162name = name .replace ("speech_encoder." ,"audio_tower." ) 163 164return super ().filter_tensors ((name ,gen )) 165 166def modify_tensors (self ,data_torch :Tensor ,name :str ,bid :int | None )-> Iterable [tuple [str ,Tensor ]]: 167suffix = "." + name .rsplit ("." ,1 )[- 1 ] 168 169if name .startswith ("ln_speech." ): 170yield (self .format_tensor_name (gguf .MODEL_TENSOR .A_MM_NORM_PRE ,suffix = suffix ),data_torch ) 171return 172 173if name .startswith ("speech_audio_adapter." ): 174if ".mlp_adapter.0." in name : 175yield (self .format_tensor_name (gguf .MODEL_TENSOR .A_MMPROJ ,0 ,suffix = suffix ),data_torch ) 176elif ".gate_proj." in name : 177yield (self .format_tensor_name (gguf .MODEL_TENSOR .A_MMPROJ ,1 ,suffix = suffix ),data_torch ) 178elif ".pool_proj." in name : 179yield (self .format_tensor_name (gguf .MODEL_TENSOR .A_MMPROJ ,2 ,suffix = suffix ),data_torch ) 180elif ".out_proj." in name : 181yield (self .format_tensor_name (gguf .MODEL_TENSOR .A_MMPROJ ,3 ,suffix = suffix ),data_torch ) 182return 183 184yield from super ().modify_tensors (data_torch ,name ,bid ) 185 186 187@ ModelBase . register ( "VoxtralForConditionalGeneration" ) 188@ ModelBase . example ( "mistralai/Voxtral-Mini-3B-2507" ) 189class VoxtralWhisperEncoderModel (WhisperEncoderModel ): 190has_vision_encoder = False # no vision encoder 191has_audio_encoder = True 192 193def set_gguf_parameters (self ): 194super ().set_gguf_parameters () 195self .gguf_writer .add_clip_projector_type (gguf .VisionProjectorType .VOXTRAL ) 196self .gguf_writer .add_audio_stack_factor (4 )# == intermediate_size // hidden_size 197 198 199@ ModelBase . register ( "AudioFlamingo3ForConditionalGeneration" ) 200@ ModelBase . example ( "nvidia/audio-flamingo-3-hf" ) 201class AudioFlamingo3WhisperEncoderModel (WhisperEncoderModel ): 202def set_gguf_parameters (self ): 203super ().set_gguf_parameters () 204self .gguf_writer .add_clip_projector_type (gguf .VisionProjectorType .MUSIC_FLAMINGO ) 205 206def tensor_force_quant (self ,name ,new_name ,bid ,n_dims ): 207if ".conv" in name and ".weight" in name : 208# Was trained in BF16, being safe, avoiding quantizing to FP16 209return gguf .GGMLQuantizationType .F32 210return super ().tensor_force_quant (name ,new_name ,bid ,n_dims )