char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
fa88ae936
char/aliceai-t5-moe
1from __future__import annotations 2 3import re 4from typing import Iterable ,TYPE_CHECKING 5 6import torch 7 8if TYPE_CHECKING : 9from torch import Tensor 10 11from .base import ModelBase ,TextModel ,gguf ,logger 12 13 14@ ModelBase . register ( "CohereForCausalLM" ) 15# [TAG_HF_EXAMPLE_GATED] CohereLabs/c4ai-command-r-v01 is gated 16# [TAG_HF_EXAMPLE_MISSING] 17class CommandR2Model (TextModel ): 18model_arch = gguf .MODEL_ARCH .COMMAND_R 19 20def __init__ (self ,* args ,** kwargs ): 21super ().__init__ (* args ,** kwargs ) 22 23# max_position_embeddings = 8192 in config.json but model was actually 24# trained on 128k context length 25# aya-23 models don't have model_max_length specified 26self .hparams ["max_position_embeddings" ]= self .find_hparam (["model_max_length" ,"max_position_embeddings" ]) 27 28def set_gguf_parameters (self ): 29super ().set_gguf_parameters () 30self .gguf_writer .add_logit_scale (self .hparams ["logit_scale" ]) 31self .gguf_writer .add_rope_scaling_type (gguf .RopeScalingType .NONE ) 32 33 34@ ModelBase . register ( "Cohere2ForCausalLM" ) 35# [TAG_HF_EXAMPLE_GATED] CohereLabs/c4ai-command-r7b-12-2024 is gated 36@ ModelBase . example ( "hf-tiny-v2/tiny-random-Cohere2ForCausalLM" ) 37class Cohere2Model (TextModel ): 38model_arch = gguf .MODEL_ARCH .COHERE2 39 40def set_gguf_parameters (self ): 41super ().set_gguf_parameters () 42 43self .gguf_writer .add_logit_scale (self .hparams ["logit_scale" ]) 44self .gguf_writer .add_sliding_window (self .hparams ["sliding_window" ]) 45self .gguf_writer .add_vocab_size (self .hparams ["vocab_size" ]) 46 47rotary_pct = self .hparams ["rotary_pct" ] 48hidden_size = self .hparams ["hidden_size" ] 49num_attention_heads = self .hparams ["num_attention_heads" ] 50self .gguf_writer .add_rope_dimension_count (int (rotary_pct * (hidden_size // num_attention_heads ))) 51self .gguf_writer .add_rope_scaling_type (gguf .RopeScalingType .NONE ) 52 53def modify_tensors (self ,data_torch :Tensor ,name :str ,bid :int | None )-> Iterable [tuple [str ,Tensor ]]: 54# Cohere2 runtime in llama.cpp expects no bias tensors; 55# the actual weight only contains 0-value tensors as bias, we can skip them 56if name .endswith (".bias" ): 57if torch .any (data_torch != 0 ): 58raise ValueError (f"Bias tensor { name !r } is not zero." ) 59logger .debug (f"Skipping bias tensor { name !r } for Cohere2 conversion." ) 60return 61 62yield from super ().modify_tensors (data_torch ,name ,bid ) 63 64 65@ ModelBase . register ( "Cohere2MoeForCausalLM" ) 66@ ModelBase . example ( "CohereLabs/North-Mini-Code-1.0" ) 67class Cohere2MoeModel (TextModel ): 68model_arch = gguf .MODEL_ARCH .COHERE2MOE 69_n_main_layers :int | None = None 70_expert_tensor_re = re .compile ( 71r"model\.layers\.(\d+)\.mlp\.experts\.(\d+)\.(down_proj|gate_proj|up_proj)\.weight" 72 ) 73 74def __init__ (self ,* args ,** kwargs ): 75super ().__init__ (* args ,** kwargs ) 76if (n_nextn := int (self .hparams .get ("num_nextn_predict_layers" ,0 )or 0 ))> 0 and not self .no_mtp : 77self .block_count += n_nextn 78self .tensor_map = gguf .get_tensor_name_map (self .model_arch ,self .block_count ) 79self ._experts :list [dict [str ,Tensor ]]= [{}for _ in range (self .block_count )] 80 81def _set_vocab_gpt2 (self )-> None : 82tokens ,toktypes ,tokpre = self .get_vocab_base () 83self .gguf_writer .add_tokenizer_model ("gpt2" ) 84self .gguf_writer .add_tokenizer_pre (tokpre ) 85self .gguf_writer .add_token_list (tokens ) 86self .gguf_writer .add_token_types (toktypes ) 87 88special_vocab = gguf .SpecialVocab (self .dir_model ,load_merges = True ) 89special_vocab .add_to_gguf (self .gguf_writer ) 90 91def set_gguf_parameters (self ): 92hparams = self .hparams 93expert_intermediate_size = hparams ["intermediate_size" ] 94mlp_layer_types = hparams .get ("mlp_layer_types" ) 95n_dense_lead = hparams .get ("first_k_dense_replace" ,0 ) 96if mlp_layer_types is not None : 97n_dense_lead = next ((i for i ,t in enumerate (mlp_layer_types )if t != "dense" ),len (mlp_layer_types )) 98 99super ().set_gguf_parameters () 100 101self .gguf_writer .add_logit_scale (hparams ["logit_scale" ]) 102self .gguf_writer .add_sliding_window (hparams ["sliding_window" ]) 103self .gguf_writer .add_sliding_window_pattern ([t == "sliding_attention" for t in hparams ["layer_types" ]]) 104self .gguf_writer .add_vocab_size (hparams ["vocab_size" ]) 105self .gguf_writer .add_expert_feed_forward_length (expert_intermediate_size ) 106self .gguf_writer .add_leading_dense_block_count (n_dense_lead ) 107self .gguf_writer .add_expert_weights_norm (hparams .get ("norm_topk_prob" ,False )) 108if (num_shared_experts := hparams .get ("num_shared_experts" ,0 ))> 0 : 109if hparams .get ("shared_expert_combination_strategy" ,"average" )!= "average" : 110raise ValueError ("Cohere2 MoE only supports average shared expert combination" ) 111self .gguf_writer .add_expert_shared_count (num_shared_experts ) 112self .gguf_writer .add_expert_shared_feed_forward_length (expert_intermediate_size * num_shared_experts ) 113if (n_nextn := hparams .get ("num_nextn_predict_layers" ,0 ))> 0 and not self .no_mtp : 114self .gguf_writer .add_nextn_predict_layers (n_nextn ) 115self .gguf_writer .add_rope_dimension_count (hparams ["head_dim" ]) 116self .gguf_writer .add_rope_scaling_type (gguf .RopeScalingType .NONE ) 117 118def index_tensors (self ,remote_hf_model_id :str | None = None ): 119hparams = {** self .hparams ,** self .hparams .get ("text_config" , {})} 120self ._n_main_layers = hparams .get ("num_hidden_layers" ) 121 type(self )._n_main_layers = self ._n_main_layers 122return super ().index_tensors (remote_hf_model_id = remote_hf_model_id ) 123 124@classmethod 125def filter_tensors (cls ,item ): 126if (titem := super ().filter_tensors (item ))is None : 127return None 128name ,gen = titem 129 130if cls ._n_main_layers is not None : 131is_mtp = (m := re .match (r"model\.layers\.(\d+)\." ,name ))is not None and int (m .group (1 ))>= cls ._n_main_layers 132if is_mtp and cls .no_mtp : 133return None 134if cls .mtp_only and not is_mtp and name not in ( 135"model.embed_tokens.weight" ,"model.norm.weight" ,"lm_head.weight" , 136 ): 137return None 138 139return name ,gen 140 141def modify_tensors (self ,data_torch :Tensor ,name :str ,bid :int | None )-> Iterable [tuple [str ,Tensor ]]: 142if name .endswith (".bias" ): 143if torch .any (data_torch != 0 ): 144raise ValueError (f"Bias tensor { name !r } is not zero." ) 145logger .debug (f"Skipping bias tensor { name !r } ." ) 146return 147 148if (m := self ._expert_tensor_re .fullmatch (name ))is not None : 149n_experts = self .hparams ["num_experts" ] 150layer_idx = int (m .group (1 )) 151assert bid is None or bid == layer_idx 152 153self ._experts [layer_idx ][name ]= data_torch 154 155expected = { 156f"model.layers. { layer_idx } .mlp.experts. { xid } . { w_name } .weight" 157for xid in range (n_experts ) 158for w_name in ("down_proj" ,"gate_proj" ,"up_proj" ) 159 } 160if expected .issubset (self ._experts [layer_idx ]): 161for w_name in ["down_proj" ,"gate_proj" ,"up_proj" ]: 162datas :list [Tensor ]= [] 163 164for xid in range (n_experts ): 165ename = f"model.layers. { layer_idx } .mlp.experts. { xid } . { w_name } .weight" 166datas .append (self ._experts [layer_idx ][ename ]) 167del self ._experts [layer_idx ][ename ] 168 169data_torch = torch .stack (datas ,dim = 0 ) 170merged_name = f"model.layers. { layer_idx } .mlp.experts. { w_name } .weight" 171 172yield from super ().modify_tensors (data_torch ,merged_name ,layer_idx ) 173return 174 175yield from super ().modify_tensors (data_torch ,name ,bid ) 176 177def prepare_tensors (self ): 178super ().prepare_tensors () 179 180experts = [k for d in self ._experts for k in d .keys ()] 181if len (experts )> 0 : 182raise ValueError (f"Unprocessed experts: { experts } " )