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 math 4 5from typing import Any ,Iterable ,TYPE_CHECKING 6 7import torch 8 9if TYPE_CHECKING : 10from torch import Tensor 11 12from .base import ModelBase ,TextModel ,gguf 13 14 15@ ModelBase . register ( "DeciLMForCausalLM" ) 16@ ModelBase . example ( "nvidia/Llama-3_1-Nemotron-51B-Instruct" , "Deci/DeciLM-7B" ) 17class DeciModel (TextModel ): 18model_arch = gguf .MODEL_ARCH .DECI 19 20@staticmethod 21def _ffn_mult_to_intermediate_size (ffn_mult :float ,n_embd :int )-> int : 22# DeciLM-specific code 23intermediate_size = int (2 * ffn_mult * n_embd / 3 ) 24return DeciModel ._find_multiple (intermediate_size ,256 ) 25 26@staticmethod 27def _find_multiple (n :int ,k :int )-> int : 28# DeciLM-specific code 29if n % k == 0 : 30return n 31return n + k - (n % k ) 32 33def __init__ (self ,* args ,** kwargs ): 34super ().__init__ (* args ,** kwargs ) 35 36if "block_configs" in self .hparams :# Llama-3_1-Nemotron-51B 37_block_configs :list [dict [str ,Any ]]= self .hparams ["block_configs" ] 38assert self .block_count == len (_block_configs ) 39self ._num_kv_heads = list () 40self ._num_heads = list () 41_ffn_multipliers = list () 42# ***linear attention layer*** 43# if n_heads_in_group is None and replace_with_linear is True 44# then _num_kv_heads[il] is 0 and _num_heads[il] is num_attention_heads 45# ***attention-free layer*** 46# if n_heads_in_group is None and replace_with_linear is False 47# then _num_kv_heads[il] is 0 and _num_heads[il] is 0 48# ***normal attention-layer*** 49# if n_heads_in_group is not None, then 50# _num_kv_heads[il] is num_attention_head // n_heads_in_group and 51# _num_heads[il] is num_attention_head 52# ***dummy layer*** for nemotron 253B 53# if n_heads_in_group is None and ffn_mult is None 54# then _num_kv_heads[il] is 0 and _num_heads[il] is 0 and _ffn_dims is 0 55for il in range (len (_block_configs )): 56if _block_configs [il ]["attention" ]["n_heads_in_group" ]is None : 57if _block_configs [il ]["attention" ]["replace_with_linear" ]is True : 58self ._num_kv_heads .append (0 ) 59self ._num_heads .append (self .hparams ["num_attention_heads" ]) 60else : 61self ._num_kv_heads .append (0 ) 62self ._num_heads .append (0 ) 63else : 64self ._num_kv_heads .append (self .hparams ["num_attention_heads" ]// _block_configs [il ]["attention" ]["n_heads_in_group" ]) 65self ._num_heads .append (self .hparams ["num_attention_heads" ]) 66if _block_configs [il ]["ffn" ]["ffn_mult" ]is None :# dummy layer 67_ffn_multipliers .append (0.0 ) 68else : 69_ffn_multipliers .append (_block_configs [il ]["ffn" ]["ffn_mult" ]) 70assert self .block_count == len (self ._num_kv_heads ) 71assert self .block_count == len (self ._num_heads ) 72assert self .block_count == len (_ffn_multipliers ) 73assert isinstance (self ._num_kv_heads ,list )and isinstance (self ._num_kv_heads [0 ],int ) 74assert isinstance (self ._num_heads ,list )and isinstance (self ._num_heads [0 ],int ) 75assert isinstance (_ffn_multipliers ,list )and isinstance (_ffn_multipliers [0 ],float ) 76self ._ffn_dims :list [int ]= [ 77DeciModel ._ffn_mult_to_intermediate_size (multiplier ,self .hparams ["hidden_size" ]) 78for multiplier in _ffn_multipliers 79 ] 80 81def set_vocab (self ): 82# Please change tokenizer_config.json of Llama-3_1-Nemotron-51B's 83# eos_token from '|eot_id|' to '|end_of_text|' 84if self .hparams .get ("vocab_size" ,128256 )== 128256 : 85tokens ,toktypes ,tokpre = self .get_vocab_base () 86self .gguf_writer .add_tokenizer_model ("gpt2" ) 87self .gguf_writer .add_tokenizer_pre (tokpre ) 88self .gguf_writer .add_token_list (tokens ) 89self .gguf_writer .add_token_types (toktypes ) 90 91special_vocab = gguf .SpecialVocab (self .dir_model ,load_merges = True ) 92special_vocab .add_to_gguf (self .gguf_writer ) 93else : 94# DeciLM-7B 95self ._set_vocab_llama_hf () 96 97def set_gguf_parameters (self ): 98if "block_configs" in self .hparams :# Llama-3_1-Nemotron-51B 99assert self .block_count == len (self ._num_kv_heads ) 100assert self .block_count == len (self ._num_heads ) 101assert self .block_count == len (self ._ffn_dims ) 102if (rope_theta := self .rope_parameters .get ("rope_theta" ))is not None : 103self .gguf_writer .add_rope_freq_base (rope_theta ) 104self .gguf_writer .add_head_count_kv (self ._num_kv_heads ) 105self .gguf_writer .add_head_count (self ._num_heads ) 106self .gguf_writer .add_feed_forward_length (self ._ffn_dims ) 107self .gguf_writer .add_block_count (self .block_count ) 108self .gguf_writer .add_context_length (self .hparams ["max_position_embeddings" ]) 109self .gguf_writer .add_embedding_length (self .hparams ["hidden_size" ]) 110self .gguf_writer .add_layer_norm_rms_eps (self .hparams ["rms_norm_eps" ]) 111self .gguf_writer .add_key_length (self .hparams ["hidden_size" ]// self .hparams ["num_attention_heads" ]) 112self .gguf_writer .add_value_length (self .hparams ["hidden_size" ]// self .hparams ["num_attention_heads" ]) 113self .gguf_writer .add_file_type (self .ftype ) 114else :# DeciLM-7B 115super ().set_gguf_parameters () 116if "num_key_value_heads_per_layer" in self .hparams :# DeciLM-7B 117self ._num_kv_heads :list [int ]= self .hparams ["num_key_value_heads_per_layer" ] 118assert self .block_count == len (self ._num_kv_heads ) 119self .gguf_writer .add_head_count_kv (self ._num_kv_heads ) 120hparams = self .hparams 121self .gguf_writer .add_vocab_size (hparams ["vocab_size" ]) 122 123if (rope_dim := hparams .get ("head_dim" ))is None : 124rope_dim = hparams ["hidden_size" ]// hparams ["num_attention_heads" ] 125self .gguf_writer .add_rope_dimension_count (rope_dim ) 126 127@staticmethod 128def permute (weights :Tensor ,n_head :int ,n_head_kv :int | None ): 129if n_head_kv is not None and n_head != n_head_kv : 130n_head = n_head_kv 131return (weights .reshape (n_head ,2 ,weights .shape [0 ]// n_head // 2 ,* weights .shape [1 :]) 132 .swapaxes (1 ,2 ) 133 .reshape (weights .shape )) 134 135def modify_tensors (self ,data_torch :Tensor ,name :str ,bid :int | None )-> Iterable [tuple [str ,Tensor ]]: 136n_head = self .hparams ["num_attention_heads" ] 137if bid is not None : 138if "num_key_value_heads_per_layer" in self .hparams : 139n_kv_head = self .hparams ["num_key_value_heads_per_layer" ][bid ] 140elif "block_configs" in self .hparams : 141n_kv_head = self ._num_kv_heads [bid ] 142n_head = self ._num_heads [bid ] 143else : 144n_kv_head = self .hparams .get ("num_key_value_heads" ) 145else : 146n_kv_head = self .hparams .get ("num_key_value_heads" ) 147 148if name .endswith (("q_proj.weight" ,"q_proj.bias" )): 149data_torch = DeciModel .permute (data_torch ,n_head ,n_head ) 150if name .endswith (("k_proj.weight" ,"k_proj.bias" )): 151data_torch = DeciModel .permute (data_torch ,n_head ,n_kv_head ) 152yield from super ().modify_tensors (data_torch ,name ,bid ) 153 154def generate_extra_tensors (self )-> Iterable [tuple [str ,Tensor ]]: 155if rope_params := self .rope_parameters .get ("full_attention" ,self .rope_parameters ): 156if rope_params .get ("rope_type" ,'' ).lower ()== "llama3" : 157base = rope_params .get ("rope_theta" ,10000.0 ) 158if (dim := self .hparams .get ("head_dim" ))is None : 159dim = self .hparams ["hidden_size" ]// self .hparams ["num_attention_heads" ] 160freqs = 1.0 / (base ** (torch .arange (0 ,dim ,2 ,dtype = torch .float32 )/ dim )) 161 162factor = rope_params .get ("factor" ,8.0 ) 163low_freq_factor = rope_params .get ("low_freq_factor" ,1.0 ) 164high_freq_factor = rope_params .get ("high_freq_factor" ,4.0 ) 165old_context_len = rope_params .get ("original_max_position_embeddings" ,8192 ) 166 167low_freq_wavelen = old_context_len / low_freq_factor 168high_freq_wavelen = old_context_len / high_freq_factor 169assert low_freq_wavelen != high_freq_wavelen 170 171rope_factors = [] 172for freq in freqs : 173wavelen = 2 * math .pi / freq 174if wavelen < high_freq_wavelen : 175rope_factors .append (1 ) 176elif wavelen > low_freq_wavelen : 177rope_factors .append (factor ) 178else : 179smooth = (old_context_len / wavelen - low_freq_factor )/ (high_freq_factor - low_freq_factor ) 180rope_factors .append (1 / ((1 - smooth )/ factor + smooth )) 181 182yield (self .format_tensor_name (gguf .MODEL_TENSOR .ROPE_FREQS ),torch .tensor (rope_factors ,dtype = torch .float32 )) 183 184def prepare_tensors (self ): 185super ().prepare_tensors ()