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 sys 4 5from typing import Iterable ,TYPE_CHECKING 6 7import torch 8 9if TYPE_CHECKING : 10from torch import Tensor 11 12from .base import ModelBase ,TextModel ,gguf ,logger 13 14 15@ ModelBase . register ( "GrokForCausalLM" , "Grok1ForCausalLM" ) 16@ ModelBase . example ( "keyfan/grok-1-hf" ) 17class GrokModel (TextModel ): 18model_arch = gguf .MODEL_ARCH .GROK 19 20def set_vocab (self ): 21if (self .dir_model / 'tokenizer.model' ).is_file (): 22self ._set_vocab_sentencepiece () 23return 24 25if not (self .dir_model / 'tokenizer.json' ).is_file ()or not (self .dir_model / 'chat_template.jinja' ).is_file (): 26logger .error ('Error: Missing vocab and chat template, download files from https://huggingface.co/alvarobartt/grok-2-tokenizer' ) 27sys .exit (1 ) 28 29self ._set_vocab_gpt2 () 30 31def __init__ (self ,* args ,** kwargs ): 32super ().__init__ (* args ,** kwargs ) 33 34def set_gguf_parameters (self ): 35super ().set_gguf_parameters () 36 37self .gguf_writer .add_attn_logit_softcapping (self .hparams .get ("attn_logit_softcapping" ,30.0 )) 38self .gguf_writer .add_router_logit_softcapping (self .hparams .get ("router_logit_softcapping" ,30.0 )) 39if (final_logit_softcap := self .hparams .get ("final_logit_softcapping" )): 40self .gguf_writer .add_final_logit_softcapping (final_logit_softcap ) 41 42if (rope_dim := self .hparams .get ("head_dim" ))is None : 43rope_dim = self .hparams ["hidden_size" ]// self .hparams ["num_attention_heads" ] 44 45if (moe_intermediate_size := self .hparams .get ("moe_intermediate_size" ))is not None : 46self .gguf_writer .add_expert_feed_forward_length (moe_intermediate_size ) 47 48# Treat "original" as "yarn", seems to have been a mistake 49if self .hparams .get ("rope_type" )in ("yarn" ,"original" ): 50self .gguf_writer .add_rope_scaling_type (gguf .RopeScalingType .YARN ) 51self .gguf_writer .add_rope_scaling_factor (self .hparams ["scaling_factor" ]) 52self .gguf_writer .add_rope_scaling_orig_ctx_len (self .hparams ["original_max_position_embeddings" ]) 53self .gguf_writer .add_rope_scaling_yarn_ext_factor (self .hparams ["extrapolation_factor" ]) 54self .gguf_writer .add_rope_scaling_yarn_attn_factor (self .hparams ["attn_factor" ]) 55self .gguf_writer .add_rope_scaling_yarn_beta_fast (self .hparams ["beta_fast" ]) 56self .gguf_writer .add_rope_scaling_yarn_beta_slow (self .hparams ["beta_slow" ]) 57 58if temp_len := self .hparams .get ("attn_temperature_len" ): 59self .gguf_writer .add_attn_temperature_length (temp_len ) 60 61self .gguf_writer .add_attn_output_scale (self .hparams .get ("attn_output_multiplier" ,rope_dim **- 0.5 )) 62self .gguf_writer .add_embedding_scale (self .hparams ["embedding_multiplier_scale" ]) 63self .gguf_writer .add_logit_scale (self .hparams ["output_multiplier_scale" ]) 64 65_experts :list [dict [str ,list [Tensor ]]]| None = None 66_cur_expert = "" 67 68def modify_tensors (self ,data_torch :Tensor ,name :str ,bid :int | None )-> Iterable [tuple [str ,Tensor ]]: 69deferred :list [tuple [Tensor ,str ,int | None ]]= [] 70is_expert = ".moe." in name or ".block_sparse_moe.experts." in name 71 72if not is_expert : 73deferred .append ((data_torch ,name ,bid )) 74 75# process the experts separately 76if is_expert or self ._cur_expert : 77n_experts = self .hparams ["num_local_experts" ] 78 79assert bid is not None 80 81if self ._experts is None : 82self ._experts = [{}for _ in range (self .block_count )] 83 84# concatenate split tensors 85if name in self ._experts [bid ]: 86self ._cur_expert = name 87self ._experts [bid ][name ].append (data_torch ) 88return 89elif is_expert : 90self ._cur_expert = name 91self ._experts [bid ][name ]= [data_torch ] 92return 93else : 94self ._cur_expert = "" 95 96for bid in range (self .block_count ): 97if len (self ._experts [bid ])>= n_experts * 3 : 98# merge the experts into a single 3d tensor 99for wid in [("linear" ,"w1" ,0 ), ("linear_1" ,"w2" ,1 ), ("linear_v" ,"w3" ,0 )]: 100datas :list [Tensor ]= [] 101 102for xid in range (n_experts ): 103ename = f"transformer.decoder_layer. { bid } .moe. { xid } . { wid [ 0 ] } .weight" 104if ename not in self ._experts [bid ]: 105ename = f"model.layers. { bid } .block_sparse_moe.experts. { xid } . { wid [ 1 ] } .weight" 106tensor_list = self ._experts [bid ][ename ] 107datas .append (torch .cat (tensor_list ,dim = wid [2 ])if len (tensor_list )> 1 else tensor_list [0 ]) 108del self ._experts [bid ][ename ] 109 110data_torch = torch .stack (datas ,dim = 0 ) 111 112merged_name = f"transformer.decoder_layer. { bid } .moe. { wid [ 0 ] } .weight" 113 114yield from super ().modify_tensors (data_torch ,merged_name ,bid ) 115 116for t in deferred : 117yield from super ().modify_tensors (* t )