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 ,Iterable ,TYPE_CHECKING 4 5if TYPE_CHECKING : 6from torch import Tensor 7 8from .base import ModelBase ,TextModel ,gguf 9 10 11@ ModelBase . register ( "OpenELMForCausalLM" ) 12@ ModelBase . example ( "apple/OpenELM-270M" ) 13class OpenELMModel (TextModel ): 14model_arch = gguf .MODEL_ARCH .OPENELM 15 16@staticmethod 17def _make_divisible (v :float | int ,divisor :int )-> int : 18# ref: https://huggingface.co/apple/OpenELM-270M-Instruct/blob/eb111ff2e6724348e5b905984063d4064d4bc579/configuration_openelm.py#L34-L38 19new_v = max (divisor ,int (v + divisor / 2 )// divisor * divisor ) 20# Make sure that round down does not go down by more than 10%. 21if new_v < 0.9 * v : 22new_v += divisor 23return new_v 24 25def __init__ (self ,* args ,** kwargs ): 26super ().__init__ (* args ,** kwargs ) 27 28ffn_multipliers :list [float ]= self .hparams ["ffn_multipliers" ] 29ffn_dim_divisor :int = self .hparams ["ffn_dim_divisor" ] 30self ._n_embd :int = self .hparams ["model_dim" ] 31self ._num_kv_heads :list [int ]= self .hparams ["num_kv_heads" ] 32self ._num_query_heads :list [int ]= self .hparams ["num_query_heads" ] 33self ._ffn_dims :list [int ]= [ 34OpenELMModel ._make_divisible (multiplier * self ._n_embd ,ffn_dim_divisor ) 35for multiplier in ffn_multipliers 36 ] 37assert isinstance (self ._num_kv_heads ,list )and isinstance (self ._num_kv_heads [0 ],int ) 38assert isinstance (self ._num_query_heads ,list )and isinstance (self ._num_query_heads [0 ],int ) 39 40# Uses the tokenizer from meta-llama/Llama-2-7b-hf 41def set_vocab (self ): 42try : 43self ._set_vocab_sentencepiece () 44except FileNotFoundError : 45self ._set_vocab_builtin ("llama-spm" ,self .hparams ["vocab_size" ]) 46 47def set_gguf_parameters (self ): 48n_embd = self ._n_embd 49head_dim = self .hparams ["head_dim" ] 50rot_pct = 1.0 51assert self .block_count == len (self ._num_kv_heads ) 52assert self .block_count == len (self ._num_query_heads ) 53assert self .block_count == len (self ._ffn_dims ) 54 55self .gguf_writer .add_block_count (self .block_count ) 56self .gguf_writer .add_context_length (self .hparams ["max_context_length" ]) 57self .gguf_writer .add_embedding_length (n_embd ) 58self .gguf_writer .add_feed_forward_length (self ._ffn_dims ) 59self .gguf_writer .add_head_count (self ._num_query_heads ) 60self .gguf_writer .add_head_count_kv (self ._num_kv_heads ) 61self .gguf_writer .add_rope_freq_base (self .hparams ["rope_freq_constant" ]) 62# https://huggingface.co/apple/OpenELM-270M-Instruct/blob/c401df2/modeling_openelm.py#L30 63self .gguf_writer .add_layer_norm_rms_eps (1e-6 ) 64self .gguf_writer .add_rope_dimension_count (int (rot_pct * head_dim )) 65self .gguf_writer .add_key_length (head_dim ) 66self .gguf_writer .add_value_length (head_dim ) 67self .gguf_writer .add_file_type (self .ftype ) 68 69def find_hparam (self ,keys :Iterable [str ],optional :bool = False )-> Any : 70if "n_layers" in keys : 71return self .hparams ["num_transformer_layers" ] 72 73return super ().find_hparam (keys ,optional ) 74 75def modify_tensors (self ,data_torch :Tensor ,name :str ,bid :int | None )-> Iterable [tuple [str ,Tensor ]]: 76 77# split ff 78if bid is not None and name == f"transformer.layers. { bid } .ffn.proj_1.weight" : 79ff_dim = self ._ffn_dims [bid ] 80yield (self .format_tensor_name (gguf .MODEL_TENSOR .FFN_GATE ,bid ),data_torch [:ff_dim ]) 81yield (self .format_tensor_name (gguf .MODEL_TENSOR .FFN_UP ,bid ),data_torch [ff_dim :]) 82return 83 84yield (self .map_tensor_name (name ),data_torch )