char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
98a01afd9
char/aliceai-t5-moe
1#include "llama-model-saver.h" 2 3#include "ggml.h" 4#include "gguf.h" 5 6#include "llama-arch.h" 7#include "llama.h" 8#include "llama-hparams.h" 9#include "llama-model.h" 10#include "llama-vocab.h" 11 12#include <cstdint> 13#include <string> 14 15bool llama_model_saver_supports_arch (llm_arch arch ) { 16switch (arch ) { 17case LLM_ARCH_PLAMO3 : 18case LLM_ARCH_GEMMA3 : 19case LLM_ARCH_GEMMA3N : 20case LLM_ARCH_COHERE2 : 21case LLM_ARCH_COHERE2MOE : 22case LLM_ARCH_OLMO2 : 23case LLM_ARCH_BITNET : 24case LLM_ARCH_T5 : 25case LLM_ARCH_ALICEAI_T5_MOE : 26case LLM_ARCH_EXAONE_MOE : 27case LLM_ARCH_AFMOE : 28case LLM_ARCH_APERTUS : 29case LLM_ARCH_MIMO2 : 30case LLM_ARCH_STEP35 : 31case LLM_ARCH_SPARK2_5 : 32case LLM_ARCH_MUSE_GLIMMER : 33case LLM_ARCH_MELLUM : 34case LLM_ARCH_LAGUNA : 35case LLM_ARCH_GRANITE_SWA : 36case LLM_ARCH_DOTS3NOTE :// TODO: need to handle SWA pattern and MLA+SWA config 37case LLM_ARCH_MAPLE : 38return false; 39default : 40return true; 41 } 42} 43 44llama_model_saver::llama_model_saver (const struct llama_model * model ) : 45gguf_ctx (gguf_init_empty ()),gguf_ctx_owned (true),model (model ),llm_kv (model -> arch ) { 46GGML_ASSERT (llama_model_saver_supports_arch (model -> arch )); 47} 48 49llama_model_saver::llama_model_saver (enum llm_arch arch ,struct gguf_context * gguf_ctx ) : 50gguf_ctx (gguf_ctx == nullptr ?gguf_init_empty () :gguf_ctx ),gguf_ctx_owned (gguf_ctx == nullptr ),model (nullptr ),llm_kv (arch ) {} 51 52llama_model_saver::~llama_model_saver () { 53if (gguf_ctx_owned ) { 54gguf_free (gguf_ctx ); 55 } 56} 57 58void llama_model_saver::add_kv (const enum llm_kv key ,const uint32_t value ) { 59gguf_set_val_u32 (gguf_ctx ,llm_kv (key ).c_str (),value ); 60} 61 62void llama_model_saver::add_kv (const enum llm_kv key ,const int32_t value ) { 63gguf_set_val_i32 (gguf_ctx ,llm_kv (key ).c_str (),value ); 64} 65 66void llama_model_saver::add_kv (const enum llm_kv key ,const uint64_t value ) { 67gguf_set_val_u64 (gguf_ctx ,llm_kv (key ).c_str (),value ); 68} 69 70void llama_model_saver::add_kv (const enum llm_kv key ,const float value ) { 71gguf_set_val_f32 (gguf_ctx ,llm_kv (key ).c_str (),value ); 72} 73 74void llama_model_saver::add_kv (const enum llm_kv key ,const bool value ) { 75gguf_set_val_bool (gguf_ctx ,llm_kv (key ).c_str (),value ); 76} 77 78void llama_model_saver::add_kv (const enum llm_kv key ,const char * value ) { 79gguf_set_val_str (gguf_ctx ,llm_kv (key ).c_str (),value ); 80} 81 82[[noreturn ]] 83void llama_model_saver::add_kv (const enum llm_kv key ,const char value ) { 84GGML_UNUSED (key ); 85GGML_UNUSED (value ); 86GGML_ABORT ("fatal error" );// this should never be called, only needed to make the template below compile 87} 88 89template < typename Container > 90void llama_model_saver::add_kv (const enum llm_kv key ,const Container & value ,const bool per_layer ) { 91GGML_ASSERT (model != nullptr || !per_layer ); 92const size_t n_values = per_layer ?size_t (model -> hparams .n_layer ()) :value .size (); 93GGML_ASSERT (n_values <=value .size ()); 94 95if (n_values == 0 ) { 96return ; 97 } 98 99if (per_layer ) { 100bool all_values_the_same = true; 101for (size_t i = 1 ;i < n_values ;++ i ) { 102if (value [i ]!= value [0 ]) { 103all_values_the_same = false; 104break ; 105 } 106 } 107if (all_values_the_same ) { 108add_kv (key ,value [0 ]); 109return ; 110 } 111 } 112 113if (std::is_same < typename Container ::value_type ,uint8_t > ::value ) { 114gguf_set_arr_data (gguf_ctx ,llm_kv (key ).c_str (),GGUF_TYPE_UINT8 ,value .data (),n_values ); 115 }else if (std::is_same < typename Container ::value_type ,int8_t > ::value ) { 116gguf_set_arr_data (gguf_ctx ,llm_kv (key ).c_str (),GGUF_TYPE_INT8 ,value .data (),n_values ); 117 }else if (std::is_same < typename Container ::value_type ,uint32_t > ::value ) { 118gguf_set_arr_data (gguf_ctx ,llm_kv (key ).c_str (),GGUF_TYPE_UINT32 ,value .data (),n_values ); 119 }else if (std::is_same < typename Container ::value_type ,bool > ::value ) { 120gguf_set_arr_data (gguf_ctx ,llm_kv (key ).c_str (),GGUF_TYPE_BOOL ,value .data (),n_values ); 121 }else if (std::is_same < typename Container ::value_type ,int32_t > ::value ) { 122gguf_set_arr_data (gguf_ctx ,llm_kv (key ).c_str (),GGUF_TYPE_INT32 ,value .data (),n_values ); 123 }else if (std::is_same < typename Container ::value_type ,uint64_t > ::value ) { 124gguf_set_arr_data (gguf_ctx ,llm_kv (key ).c_str (),GGUF_TYPE_UINT64 ,value .data (),n_values ); 125 }else if (std::is_same < typename Container ::value_type ,float > ::value ) { 126gguf_set_arr_data (gguf_ctx ,llm_kv (key ).c_str (),GGUF_TYPE_FLOAT32 ,value .data (),n_values ); 127 }else if (std::is_same < Container , std::string > ::value ) { 128gguf_set_val_str (gguf_ctx ,llm_kv (key ).c_str (),reinterpret_cast < const char *> (value .data ())); 129 }else { 130GGML_ABORT ("fatal error" ); 131 } 132} 133// instantiate for external usage: 134template void llama_model_saver::add_kv < std::vector < uint32_t >> (const enum llm_kv ,const std::vector < uint32_t > & ,const bool ); 135template void llama_model_saver::add_kv < std::vector < float >> (const enum llm_kv ,const std::vector < float > & ,const bool ); 136template void llama_model_saver::add_kv < std::vector < uint64_t >> (const enum llm_kv ,const std::vector < uint64_t > & ,const bool ); 137 138void llama_model_saver::add_kv (const enum llm_kv key ,const std::vector < std::string > & value ) { 139 std::vector < const char *> tmp (value .size ()); 140for (size_t i = 0 ;i < value .size ();++ i ) { 141tmp [i ]= value [i ].c_str (); 142 } 143gguf_set_arr_str (gguf_ctx ,llm_kv (key ).c_str (),tmp .data (),tmp .size ()); 144} 145 146void llama_model_saver::add_tensor (const struct ggml_tensor * tensor ) { 147if (!tensor ) { 148return ; 149 } 150if (gguf_find_tensor (gguf_ctx ,tensor -> name ) >=0 ) { 151const std::string tensor_name = tensor -> name ; 152GGML_ASSERT ( 153tensor_name == "rope_freqs.weight" || tensor_name == "rope_factors_long.weight" || 154tensor_name == "rope_factors_short.weight" );// FIXME 155return ; 156 } 157gguf_add_tensor (gguf_ctx ,tensor ); 158} 159 160void llama_model_saver::add_kv_from_model () { 161const llama_hparams & hparams = model -> hparams ; 162const llama_vocab & vocab = model -> vocab ; 163 164const int32_t n_vocab = vocab .n_tokens (); 165 std::vector < std::string > tokens (n_vocab ); 166 std::vector < float > scores (n_vocab ); 167 std::vector < int32_t > token_types (n_vocab ); 168 169if (vocab .get_type ()!= LLAMA_VOCAB_TYPE_NONE ) { 170for (int32_t id = 0 ;id < n_vocab ;++ id ) { 171const llama_vocab::token_data & token_data = vocab .get_token_data (id ); 172 173tokens [id ]= token_data .text ; 174scores [id ]= token_data .score ; 175 176// FIXME should this be treated as flags? 177switch (token_data .attr ) { 178case LLAMA_TOKEN_ATTR_UNKNOWN :token_types [id ]= LLAMA_TOKEN_TYPE_UNKNOWN ;break ; 179case LLAMA_TOKEN_ATTR_UNUSED :token_types [id ]= LLAMA_TOKEN_TYPE_UNUSED ;break ; 180case LLAMA_TOKEN_ATTR_NORMAL :token_types [id ]= LLAMA_TOKEN_TYPE_NORMAL ;break ; 181case LLAMA_TOKEN_ATTR_CONTROL :token_types [id ]= LLAMA_TOKEN_TYPE_CONTROL ;break ; 182case LLAMA_TOKEN_ATTR_USER_DEFINED :token_types [id ]= LLAMA_TOKEN_TYPE_USER_DEFINED ;break ; 183case LLAMA_TOKEN_ATTR_BYTE :token_types [id ]= LLAMA_TOKEN_TYPE_BYTE ;break ; 184// case LLAMA_TOKEN_ATTR_NORMALIZED: ??? 185// case LLAMA_TOKEN_ATTR_LSTRIP: ??? 186// case LLAMA_TOKEN_ATTR_RSTRIP: ??? 187case LLAMA_TOKEN_ATTR_UNDEFINED : 188default :token_types [id ]= LLAMA_TOKEN_TYPE_UNDEFINED ;break ; 189 } 190 } 191 } 192 193// add_kv(LLM_KV_GENERAL_TYPE, ???); 194add_kv (LLM_KV_GENERAL_ARCHITECTURE ,model -> arch_name ()); 195// add_kv(LLM_KV_GENERAL_QUANTIZATION_VERSION, ???); 196// add_kv(LLM_KV_GENERAL_ALIGNMENT, ???); 197// add_kv(LLM_KV_GENERAL_FILE_TYPE, ???); 198// add_kv(LLM_KV_GENERAL_SAMPLING_SEQUENCE, ???); 199// add_kv(LLM_KV_GENERAL_SAMPLING_TOP_K, ???); 200// add_kv(LLM_KV_GENERAL_SAMPLING_TOP_P, ???); 201// add_kv(LLM_KV_GENERAL_SAMPLING_MIN_P, ???); 202// add_kv(LLM_KV_GENERAL_SAMPLING_XTC_PROBABILITY, ???); 203// add_kv(LLM_KV_GENERAL_SAMPLING_XTC_THRESHOLD, ???); 204// add_kv(LLM_KV_GENERAL_SAMPLING_TEMP, ???); 205// add_kv(LLM_KV_GENERAL_SAMPLING_PENALTY_LAST_N, ???); 206// add_kv(LLM_KV_GENERAL_SAMPLING_PENALTY_REPEAT, ???); 207// add_kv(LLM_KV_GENERAL_SAMPLING_MIROSTAT, ???); 208// add_kv(LLM_KV_GENERAL_SAMPLING_MIROSTAT_TAU, ???); 209// add_kv(LLM_KV_GENERAL_SAMPLING_MIROSTAT_ETA, ???); 210add_kv (LLM_KV_GENERAL_NAME ,model -> name ); 211// add_kv(LLM_KV_GENERAL_AUTHOR, ???); 212// add_kv(LLM_KV_GENERAL_VERSION, ???); 213// add_kv(LLM_KV_GENERAL_URL, ???); 214// add_kv(LLM_KV_GENERAL_DESCRIPTION, ???); 215// add_kv(LLM_KV_GENERAL_LICENSE, ???); 216// add_kv(LLM_KV_GENERAL_SOURCE_URL, ???); 217// add_kv(LLM_KV_GENERAL_SOURCE_HF_REPO, ???); 218 219add_kv (LLM_KV_VOCAB_SIZE ,vocab .n_tokens ()); 220add_kv (LLM_KV_CONTEXT_LENGTH ,hparams .n_ctx_train ); 221add_kv (LLM_KV_EMBEDDING_LENGTH ,hparams .n_embd ); 222if (hparams .n_embd_out_impl > 0 ) { 223add_kv (LLM_KV_EMBEDDING_LENGTH_OUT ,hparams .n_embd_out_impl ); 224 } 225add_kv (LLM_KV_BLOCK_COUNT ,hparams .n_layer_all ); 226add_kv (LLM_KV_LEADING_DENSE_BLOCK_COUNT ,hparams .n_layer_dense_lead ); 227add_kv (LLM_KV_FEED_FORWARD_LENGTH ,hparams .n_ff_arr , true); 228add_kv (LLM_KV_EXPERT_FEED_FORWARD_LENGTH ,hparams .n_ff_exp ()); 229add_kv (LLM_KV_EXPERT_LATENT_LENGTH ,hparams .n_expert_latent ); 230add_kv (LLM_KV_EXPERT_SHARED_FEED_FORWARD_LENGTH ,hparams .n_ff_shexp ); 231add_kv (LLM_KV_EXPERT_CHUNK_FEED_FORWARD_LENGTH ,hparams .n_ff_chexp ); 232add_kv (LLM_KV_SWIGLU_CLAMP_EXP , std::vector < float > ( 233hparams .swiglu_clamp_exp .begin (),hparams .swiglu_clamp_exp .begin ()+ hparams .n_layer_all )); 234add_kv (LLM_KV_SWIGLU_CLAMP_SHEXP , std::vector < float > ( 235hparams .swiglu_clamp_shexp .begin (),hparams .swiglu_clamp_shexp .begin ()+ hparams .n_layer_all )); 236add_kv (LLM_KV_USE_PARALLEL_RESIDUAL ,hparams .use_par_res ); 237// add_kv(LLM_KV_TENSOR_DATA_LAYOUT, ???); 238add_kv (LLM_KV_EXPERT_COUNT ,hparams .n_expert ); 239add_kv (LLM_KV_EXPERT_USED_COUNT ,hparams .n_expert_used ()); 240add_kv (LLM_KV_EXPERT_SHARED_COUNT ,hparams .n_expert_shared ); 241add_kv (LLM_KV_EXPERT_GROUP_COUNT ,hparams .n_expert_groups ); 242add_kv (LLM_KV_EXPERT_GROUP_USED_COUNT ,hparams .n_group_used ); 243add_kv (LLM_KV_EXPERT_WEIGHTS_SCALE ,hparams .expert_weights_scale ); 244add_kv (LLM_KV_EXPERT_WEIGHTS_NORM ,hparams .expert_weights_norm ); 245add_kv (LLM_KV_EXPERT_GATING_FUNC ,hparams .expert_gating_func ); 246add_kv (LLM_KV_EXPERT_GROUP_SCALE ,hparams .expert_group_scale ); 247add_kv (LLM_KV_EXPERTS_PER_GROUP ,hparams .n_group_experts ); 248add_kv (LLM_KV_MOE_EVERY_N_LAYERS ,hparams .moe_every_n_layers ); 249add_kv (LLM_KV_NEXTN_PREDICT_LAYERS ,hparams .n_layer_nextn ); 250add_kv (LLM_KV_NUM_DEEPSTACK_LAYERS ,hparams .n_deepstack_layers ); 251add_kv (LLM_KV_DEEPSTACK_MAPPING ,hparams .deepstack_mapping_arr ); 252add_kv (LLM_KV_POOLING_TYPE ,uint32_t (hparams .pooling_type )); 253add_kv (LLM_KV_LOGIT_SCALE ,hparams .f_logit_scale ); 254add_kv (LLM_KV_DECODER_START_TOKEN_ID ,hparams .dec_start_token_id ); 255add_kv (LLM_KV_DECODER_BLOCK_COUNT ,hparams .dec_n_layer ); 256add_kv (LLM_KV_ATTN_LOGIT_SOFTCAPPING ,hparams .f_attn_logit_softcapping ); 257add_kv (LLM_KV_ROUTER_LOGIT_SOFTCAPPING ,hparams .f_router_logit_softcapping ); 258add_kv (LLM_KV_FINAL_LOGIT_SOFTCAPPING ,hparams .f_final_logit_softcapping ); 259add_kv (LLM_KV_SWIN_NORM ,hparams .swin_norm ); 260add_kv (LLM_KV_RESCALE_EVERY_N_LAYERS ,hparams .rescale_every_n_layers ); 261add_kv (LLM_KV_TIME_MIX_EXTRA_DIM ,hparams .time_mix_extra_dim ); 262add_kv (LLM_KV_TIME_DECAY_EXTRA_DIM ,hparams .time_decay_extra_dim ); 263add_kv (LLM_KV_RESIDUAL_SCALE ,hparams .f_residual_scale ); 264add_kv (LLM_KV_EMBEDDING_SCALE ,hparams .f_embedding_scale ); 265add_kv (LLM_KV_TOKEN_SHIFT_COUNT ,hparams .token_shift_count ); 266add_kv (LLM_KV_INTERLEAVE_MOE_LAYER_STEP ,hparams .n_moe_layer_step ); 267// add_kv(LLM_KV_FULL_ATTENTION_INTERVAL, ???); // saved as LLM_KV_ATTENTION_RECURRENT_LAYERS instead 268 269add_kv (LLM_KV_ATTENTION_HEAD_COUNT ,hparams .n_head_arr , true); 270add_kv (LLM_KV_ATTENTION_HEAD_COUNT_KV ,hparams .n_head_kv_arr , true); 271add_kv (LLM_KV_ATTENTION_MAX_ALIBI_BIAS ,hparams .f_max_alibi_bias ); 272add_kv (LLM_KV_ATTENTION_CLAMP_KQV ,hparams .f_clamp_kqv ); 273add_kv (LLM_KV_ATTENTION_KEY_LENGTH ,hparams .n_embd_head_k_full ); 274add_kv (LLM_KV_ATTENTION_VALUE_LENGTH ,hparams .n_embd_head_v_full ); 275add_kv (LLM_KV_ATTENTION_LAYERNORM_EPS ,hparams .f_norm_eps ); 276add_kv (LLM_KV_ATTENTION_LAYERNORM_RMS_EPS ,hparams .f_norm_rms_eps ); 277add_kv (LLM_KV_ATTENTION_GROUPNORM_EPS ,hparams .f_norm_group_eps ); 278add_kv (LLM_KV_ATTENTION_GROUPNORM_GROUPS ,hparams .n_norm_groups ); 279add_kv (LLM_KV_ATTENTION_CAUSAL ,hparams .causal_attn ); 280add_kv (LLM_KV_ATTENTION_Q_LORA_RANK ,hparams .n_lora_q ); 281add_kv (LLM_KV_ATTENTION_KV_LORA_RANK ,hparams .n_lora_kv ); 282add_kv (LLM_KV_ATTENTION_DECAY_LORA_RANK ,hparams .n_lora_decay ); 283add_kv (LLM_KV_ATTENTION_ICLR_LORA_RANK ,hparams .n_lora_iclr ); 284add_kv (LLM_KV_ATTENTION_VALUE_RESIDUAL_MIX_LORA_RANK ,hparams .n_lora_value_res_mix ); 285add_kv (LLM_KV_ATTENTION_GATE_LORA_RANK ,hparams .n_lora_gate ); 286add_kv (LLM_KV_ATTENTION_RELATIVE_BUCKETS_COUNT ,hparams .n_rel_attn_bkts ); 287add_kv (LLM_KV_ATTENTION_ROPE_PATTERN ,hparams .rope_pattern , true); 288add_kv (LLM_KV_ATTENTION_SLIDING_WINDOW ,hparams .n_swa ); 289// add_kv(LLM_KV_ATTENTION_SLIDING_WINDOW_PATTERN, ???); 290add_kv (LLM_KV_ATTENTION_SCALE ,hparams .f_attention_scale ); 291add_kv (LLM_KV_ATTENTION_OUTPUT_SCALE ,hparams .f_attn_out_scale ); 292add_kv (LLM_KV_ATTENTION_VALUE_SCALE ,hparams .f_attn_value_scale ); 293add_kv (LLM_KV_ATTENTION_TEMPERATURE_LENGTH ,hparams .attn_temp_length ); 294add_kv (LLM_KV_ATTENTION_TEMPERATURE_SCALE ,hparams .f_attn_temp_scale ); 295add_kv (LLM_KV_ATTENTION_KEY_LENGTH_MLA ,hparams .n_embd_head_k_mla_impl ); 296add_kv (LLM_KV_ATTENTION_VALUE_LENGTH_MLA ,hparams .n_embd_head_v_mla_impl ); 297add_kv (LLM_KV_ATTENTION_KEY_LENGTH_SWA ,hparams .n_embd_head_k_swa ); 298add_kv (LLM_KV_ATTENTION_VALUE_LENGTH_SWA ,hparams .n_embd_head_v_swa ); 299add_kv (LLM_KV_ATTENTION_INDEXER_HEAD_COUNT ,hparams .indexer_n_head ); 300add_kv (LLM_KV_ATTENTION_INDEXER_KEY_LENGTH ,hparams .indexer_head_size ); 301add_kv (LLM_KV_ATTENTION_INDEXER_TOP_K ,hparams .indexer_top_k ); 302add_kv (LLM_KV_ATTENTION_INDEXER_BLOCK_SIZE ,hparams .indexer_block_size ); 303add_kv (LLM_KV_ATTENTION_INDEXER_LOCAL_BLOCKS ,hparams .indexer_local_blocks ); 304add_kv (LLM_KV_ATTENTION_INDEXER_TYPES ,hparams .is_indexer_full_impl , true); 305add_kv (LLM_KV_ATTENTION_RECURRENT_LAYERS ,hparams .is_recr_impl , true); 306add_kv (LLM_KV_ATTENTION_OUTPUT_GROUP_COUNT ,hparams .dsv4_o_group_count ); 307add_kv (LLM_KV_ATTENTION_OUTPUT_LORA_RANK ,hparams .dsv4_o_lora_rank ); 308add_kv (LLM_KV_ATTENTION_COMPRESS_ROPE_FREQ_BASE ,hparams .dsv4_compress_rope_base ); 309if (model -> arch == LLM_ARCH_DEEPSEEK4 || hparams .dsv4_hc_mult > 0 ) { 310// the loader requires one compress ratio per layer, including nextn layers 311const std::vector < uint32_t > compress_ratios ( 312hparams .dsv4_compress_ratios .begin (),hparams .dsv4_compress_ratios .begin ()+ hparams .n_layer_all ); 313add_kv (LLM_KV_ATTENTION_COMPRESS_RATIOS ,compress_ratios ); 314 }else { 315add_kv (LLM_KV_ATTENTION_COMPRESS_RATIOS ,hparams .dsv4_compress_ratios , true); 316 } 317add_kv (LLM_KV_HYPER_CONNECTION_COUNT ,hparams .dsv4_hc_mult ); 318add_kv (LLM_KV_HYPER_CONNECTION_SINKHORN_ITERATIONS ,hparams .dsv4_hc_sinkhorn_iters ); 319add_kv (LLM_KV_HYPER_CONNECTION_EPSILON ,hparams .dsv4_hc_eps ); 320add_kv (LLM_KV_HYPER_CONNECTION_MAGNITUDE ,hparams .hc_magnitude ); 321add_kv (LLM_KV_HASH_LAYER_COUNT ,hparams .dsv4_hash_layer_count ); 322add_kv (LLM_KV_HYPER_CONNECTION_LOW_RANK ,hparams .hc_low_rank ); 323 324// the PLE group only means anything whole: write all of it or none 325if (hparams .ple_n_heads > 0 ) { 326 std::vector < uint32_t > ple_layers ; 327for (uint32_t il = 0 ;il < hparams .n_layer_all ;++ il ) { 328if (hparams .is_ple_impl [il ]) { 329ple_layers .push_back (il ); 330 } 331 } 332add_kv (LLM_KV_PLE_LAYERS ,ple_layers ); 333add_kv (LLM_KV_PLE_NGRAM_SIZE ,hparams .ple_ngram_size ); 334add_kv (LLM_KV_PLE_HEADS_PER_NGRAM ,hparams .ple_heads_per_ngram ); 335add_kv (LLM_KV_PLE_CONV_KERNEL ,hparams .ple_conv_kernel ); 336add_kv (LLM_KV_PLE_EOS_TOKEN_ID ,hparams .ple_eos_token_id ); 337add_kv (LLM_KV_EMBEDDING_LENGTH_PER_LAYER ,hparams .ple_head_dim ); 338add_kv (LLM_KV_PLE_LAYER_MULTIPLIERS , std::vector < uint64_t > ( 339hparams .ple_layer_multipliers .begin (), 340hparams .ple_layer_multipliers .begin ()+ hparams .ple_ngram_size )); 341add_kv (LLM_KV_PLE_HEAD_OFFSETS , std::vector < uint64_t > ( 342hparams .ple_head_offsets .begin (), 343hparams .ple_head_offsets .begin ()+ hparams .ple_n_heads )); 344add_kv (LLM_KV_PLE_HEAD_VOCAB_SIZES , std::vector < uint64_t > ( 345hparams .ple_head_vocab_sizes .begin (), 346hparams .ple_head_vocab_sizes .begin ()+ hparams .ple_n_heads )); 347 } 348 349const float rope_scaling_factor = hparams .rope_freq_scale_train == 1.0f ?0.0f :1.0f /hparams .rope_freq_scale_train ; 350 351add_kv (LLM_KV_ROPE_DIMENSION_COUNT ,hparams .n_rot_full ); 352add_kv (LLM_KV_ROPE_DIMENSION_COUNT_SWA ,hparams .n_rot_swa ); 353add_kv (LLM_KV_ROPE_DIMENSION_SECTIONS ,hparams .rope_sections ); 354add_kv (LLM_KV_ROPE_FREQ_BASE ,hparams .rope_freq_base_train ); 355add_kv (LLM_KV_ROPE_FREQ_BASE_SWA ,hparams .rope_freq_base_train_swa ); 356// add_kv(LLM_KV_ROPE_SCALE_LINEAR, rope_scaling_factor); // old name 357add_kv (LLM_KV_ROPE_SCALING_TYPE ,llama_rope_scaling_type_name (hparams .rope_scaling_type_train )); 358add_kv (LLM_KV_ROPE_SCALING_FACTOR ,rope_scaling_factor ); 359add_kv (LLM_KV_ROPE_SCALING_ATTN_FACTOR ,hparams .rope_attn_factor ); 360add_kv (LLM_KV_ROPE_SCALING_ORIG_CTX_LEN ,hparams .n_ctx_orig_yarn ); 361add_kv (LLM_KV_ROPE_SCALING_FINETUNED ,hparams .rope_finetuned ); 362add_kv (LLM_KV_ROPE_SCALING_YARN_LOG_MUL ,hparams .rope_yarn_log_mul ); 363add_kv (LLM_KV_ROPE_SCALING_YARN_EXT_FACTOR ,hparams .yarn_ext_factor ); 364add_kv (LLM_KV_ROPE_SCALING_YARN_ATTN_FACTOR ,hparams .yarn_attn_factor ); 365add_kv (LLM_KV_ROPE_SCALING_YARN_BETA_FAST ,hparams .yarn_beta_fast ); 366add_kv (LLM_KV_ROPE_SCALING_YARN_BETA_SLOW ,hparams .yarn_beta_slow ); 367 368// TODO: implement split file support 369// add_kv(LLM_KV_SPLIT_NO, ???); 370// add_kv(LLM_KV_SPLIT_COUNT, ???); 371// add_kv(LLM_KV_SPLIT_TENSORS_COUNT, ???); 372 373add_kv (LLM_KV_SSM_INNER_SIZE ,hparams .ssm_d_inner ); 374add_kv (LLM_KV_SSM_CONV_KERNEL ,hparams .ssm_d_conv ); 375add_kv (LLM_KV_SSM_STATE_SIZE ,hparams .ssm_d_state ); 376add_kv (LLM_KV_SSM_TIME_STEP_RANK ,hparams .ssm_dt_rank ); 377add_kv (LLM_KV_SSM_GROUP_COUNT ,hparams .ssm_n_group ); 378add_kv (LLM_KV_SSM_DT_B_C_RMS ,hparams .ssm_dt_b_c_rms ); 379 380add_kv (LLM_KV_KDA_HEAD_DIM ,hparams .n_embd_head_kda ); 381add_kv (LLM_KV_KDA_SAFE_GATE ,hparams .kda_safe_gate ); 382add_kv (LLM_KV_KDA_GATE_LOWER_BOUND ,hparams .kda_gate_lower_bound ); 383 384add_kv (LLM_KV_WKV_HEAD_SIZE ,hparams .wkv_head_size ); 385 386add_kv (LLM_KV_TOKENIZER_MODEL ,vocab .get_tokenizer_model ()); 387add_kv (LLM_KV_TOKENIZER_PRE ,vocab .get_tokenizer_pre ()); 388add_kv (LLM_KV_TOKENIZER_LIST ,tokens ); 389add_kv (LLM_KV_TOKENIZER_TOKEN_TYPE ,token_types ); 390add_kv (LLM_KV_TOKENIZER_TOKEN_TYPE_COUNT ,vocab .n_token_types ()); 391add_kv (LLM_KV_TOKENIZER_SCORES ,scores ); 392add_kv (LLM_KV_TOKENIZER_MERGES ,vocab .get_bpe_merges ()); 393// FIXME llama_token is type i32 but when reading in a GGUF file u32 is expected, not an issue for writing though 394add_kv (LLM_KV_TOKENIZER_BOS_ID ,uint32_t (vocab .token_bos ())); 395add_kv (LLM_KV_TOKENIZER_EOS_ID ,uint32_t (vocab .token_eos ())); 396add_kv (LLM_KV_TOKENIZER_EOT_ID ,uint32_t (vocab .token_eot ())); 397add_kv (LLM_KV_TOKENIZER_EOM_ID ,uint32_t (vocab .token_eom ())); 398add_kv (LLM_KV_TOKENIZER_UNK_ID ,uint32_t (vocab .token_unk ())); 399add_kv (LLM_KV_TOKENIZER_SEP_ID ,uint32_t (vocab .token_sep ())); 400add_kv (LLM_KV_TOKENIZER_PAD_ID ,uint32_t (vocab .token_pad ())); 401// add_kv(LLM_KV_TOKENIZER_CLS_ID, uint32_t(vocab.token_bos())); // deprecated 402// add_kv(LLM_KV_TOKENIZER_MASK_ID, ???); 403add_kv (LLM_KV_TOKENIZER_ADD_BOS ,vocab .get_add_bos ()); 404add_kv (LLM_KV_TOKENIZER_ADD_EOS ,vocab .get_add_eos ()); 405add_kv (LLM_KV_TOKENIZER_ADD_SEP ,vocab .get_add_sep ()); 406add_kv (LLM_KV_TOKENIZER_ADD_PREFIX ,vocab .get_add_space_prefix ()); 407add_kv (LLM_KV_TOKENIZER_REMOVE_EXTRA_WS ,vocab .get_remove_extra_whitespaces ()); 408add_kv (LLM_KV_TOKENIZER_PRECOMPILED_CHARSMAP ,vocab .get_precompiled_charsmap ()); 409// add_kv(LLM_KV_TOKENIZER_HF_JSON, ???); 410// add_kv(LLM_KV_TOKENIZER_RWKV, ???); 411add_kv (LLM_KV_TOKENIZER_FIM_PRE_ID ,uint32_t (vocab .token_fim_pre ())); 412add_kv (LLM_KV_TOKENIZER_FIM_SUF_ID ,uint32_t (vocab .token_fim_suf ())); 413add_kv (LLM_KV_TOKENIZER_FIM_MID_ID ,uint32_t (vocab .token_fim_mid ())); 414add_kv (LLM_KV_TOKENIZER_FIM_PAD_ID ,uint32_t (vocab .token_fim_pad ())); 415add_kv (LLM_KV_TOKENIZER_FIM_REP_ID ,uint32_t (vocab .token_fim_rep ())); 416add_kv (LLM_KV_TOKENIZER_FIM_SEP_ID ,uint32_t (vocab .token_fim_sep ())); 417 418// TODO: implement LoRA support 419// add_kv(LLM_KV_ADAPTER_TYPE, ???); 420// add_kv(LLM_KV_ADAPTER_LORA_ALPHA, ???); 421// add_kv(LLM_KV_ADAPTER_LORA_TASK_NAME, ???); 422// add_kv(LLM_KV_ADAPTER_LORA_PROMPT_PREFIX, ???); 423// add_kv(LLM_KV_ADAPTER_ALORA_INVOCATION_TOKENS, ???); 424 425add_kv (LLM_KV_POSNET_EMBEDDING_LENGTH ,hparams .posnet .n_embd ); 426add_kv (LLM_KV_POSNET_BLOCK_COUNT ,hparams .posnet .n_layer ); 427 428add_kv (LLM_KV_CONVNEXT_EMBEDDING_LENGTH ,hparams .convnext .n_embd ); 429add_kv (LLM_KV_CONVNEXT_BLOCK_COUNT ,hparams .convnext .n_layer ); 430 431add_kv (LLM_KV_CLASSIFIER_OUTPUT_LABELS ,model -> classifier_labels ); 432 433add_kv (LLM_KV_SHORTCONV_L_CACHE ,hparams .n_shortconv_l_cache ); 434 435add_kv (LLM_KV_XIELU_ALPHA_N ,hparams .xielu_alpha_n ); 436add_kv (LLM_KV_XIELU_ALPHA_P ,hparams .xielu_alpha_p ); 437add_kv (LLM_KV_XIELU_BETA ,hparams .xielu_beta ); 438add_kv (LLM_KV_XIELU_EPS ,hparams .xielu_eps ); 439 440add_kv (LLM_KV_ATTN_RES_BLOCK_SIZE ,hparams .attn_res_block_size ); 441add_kv (LLM_KV_ACTIVATION_SITU_BETA ,hparams .situ_beta ); 442add_kv (LLM_KV_ACTIVATION_SITU_LINEAR_BETA ,hparams .situ_linear_beta ); 443 444// deprecated 445// add_kv(LLM_KV_TOKENIZER_PREFIX_ID, ???); 446// add_kv(LLM_KV_TOKENIZER_SUFFIX_ID, ???); 447// add_kv(LLM_KV_TOKENIZER_MIDDLE_ID, ???); 448 449add_kv (LLM_KV_DENSE_2_FEAT_IN ,hparams .dense_2_feat_in ); 450add_kv (LLM_KV_DENSE_2_FEAT_OUT ,hparams .dense_2_feat_out ); 451add_kv (LLM_KV_DENSE_3_FEAT_IN ,hparams .dense_3_feat_in ); 452add_kv (LLM_KV_DENSE_3_FEAT_OUT ,hparams .dense_3_feat_out ); 453} 454 455void llama_model_saver::add_tensors_from_model () { 456if (model -> output != nullptr && 457 std::string (model -> output -> name )!= std::string (model -> tok_embd -> name )) { 458add_tensor (model -> tok_embd );// some models use the same tensor for tok_embd and output 459 } 460add_tensor (model -> type_embd ); 461add_tensor (model -> pos_embd ); 462add_tensor (model -> tok_norm ); 463add_tensor (model -> tok_norm_b ); 464add_tensor (model -> output_norm ); 465add_tensor (model -> output_norm_b ); 466add_tensor (model -> output ); 467add_tensor (model -> output_b ); 468add_tensor (model -> output_norm_enc ); 469add_tensor (model -> output_s ); 470add_tensor (model -> output_in_s ); 471add_tensor (model -> output_res_score ); 472add_tensor (model -> nextn_proj_pre ); 473add_tensor (model -> nextn_proj_post ); 474add_tensor (model -> cls ); 475add_tensor (model -> cls_b ); 476add_tensor (model -> cls_out ); 477add_tensor (model -> cls_out_b ); 478add_tensor (model -> cls_norm ); 479add_tensor (model -> hc_head_fn ); 480add_tensor (model -> hc_head_base ); 481add_tensor (model -> hc_head_scale ); 482add_tensor (model -> per_layer_tok_embd ); 483add_tensor (model -> hc_head_norm ); 484add_tensor (model -> hc_head_down ); 485add_tensor (model -> hc_head_up ); 486 487for (const struct llama_layer & layer :model -> layers ) { 488for (size_t i = 0 ;i < sizeof (layer )/sizeof (struct ggml_tensor * );++ i ) { 489add_tensor (reinterpret_cast < const struct ggml_tensor * const *> (& layer )[i ]); 490 } 491 } 492} 493 494void llama_model_saver::save (const std::string & path_model ) { 495gguf_write_to_file (gguf_ctx ,path_model .c_str (), false); 496} 497 498void llama_model_saver::save (FILE * file ) { 499gguf_write_to_file_ptr (gguf_ctx ,file , false); 500}