char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
98a01afd9
char/aliceai-t5-moe
1#include "llama-model.h" 2 3#include "llama-arch.h" 4#include "llama-ext.h" 5#include "llama-hparams.h" 6#include "llama-impl.h" 7#include "llama-mmap.h" 8#include "llama-cparams.h" 9#include "llama-model-loader.h" 10 11#include "llama-kv-cache.h" 12#include "llama-kv-cache-iswa.h" 13#include "llama-kv-cache-dsa.h" 14#include "llama-kv-cache-dsa-iswa.h" 15#include "llama-kv-cache-msa.h" 16#include "llama-kv-cache-dsv4.h" 17#include "llama-memory-hybrid.h" 18#include "llama-memory-hybrid-iswa.h" 19#include "llama-memory-hybrid-idx.h" 20#include "llama-memory-recurrent.h" 21 22#include "llama.h" 23#include "models/models.h" 24 25#include "ggml.h" 26#include "ggml-cpp.h" 27 28#include <algorithm> 29#include <cassert> 30#include <cfloat> 31#include <cstdint> 32#include <cstring> 33#include <cmath> 34#include <functional> 35#include <map> 36#include <numeric> 37#include <regex> 38#include <sstream> 39#include <stdexcept> 40#include <string> 41#include <vector> 42 43static llama_model * llama_model_mapping (llm_arch arch ,const llama_model_params & params ) { 44switch (arch ) { 45case LLM_ARCH_CLIP : 46return new llama_model_clip (params ); 47case LLM_ARCH_LLAMA : 48return new llama_model_llama (params ); 49case LLM_ARCH_LLAMA4 : 50return new llama_model_llama4 (params ); 51case LLM_ARCH_LLAMA_EMBED : 52return new llama_model_llama_embed (params ); 53case LLM_ARCH_MAINCODER : 54return new llama_model_maincoder (params ); 55case LLM_ARCH_TALKIE : 56return new llama_model_talkie (params ); 57case LLM_ARCH_DECI : 58return new llama_model_deci (params ); 59case LLM_ARCH_BAICHUAN : 60return new llama_model_baichuan (params ); 61case LLM_ARCH_FALCON : 62return new llama_model_falcon (params ); 63case LLM_ARCH_GROK : 64return new llama_model_grok (params ); 65case LLM_ARCH_STARCODER : 66return new llama_model_starcoder (params ); 67case LLM_ARCH_REFACT : 68return new llama_model_refact (params ); 69case LLM_ARCH_BERT : 70return new llama_model_bert (params ); 71case LLM_ARCH_JINA_BERT_V2 : 72return new llama_model_jina_bert_v2 (params ); 73case LLM_ARCH_JINA_BERT_V3 : 74return new llama_model_jina_bert_v3 (params ); 75case LLM_ARCH_NOMIC_BERT : 76return new llama_model_nomic_bert (params ); 77case LLM_ARCH_NOMIC_BERT_MOE : 78return new llama_model_nomic_bert_moe (params ); 79case LLM_ARCH_MODERN_BERT : 80return new llama_model_modern_bert (params ); 81case LLM_ARCH_NEO_BERT : 82return new llama_model_neo_bert (params ); 83case LLM_ARCH_EUROBERT : 84return new llama_model_eurobert (params ); 85case LLM_ARCH_BLOOM : 86return new llama_model_bloom (params ); 87case LLM_ARCH_MPT : 88return new llama_model_mpt (params ); 89case LLM_ARCH_STABLELM : 90return new llama_model_stablelm (params ); 91case LLM_ARCH_MELLUM : 92return new llama_model_mellum (params ); 93case LLM_ARCH_NANBEIGE : 94return new llama_model_nanbeige (params ); 95case LLM_ARCH_QWEN : 96return new llama_model_qwen (params ); 97case LLM_ARCH_QWEN2 : 98return new llama_model_qwen2 (params ); 99case LLM_ARCH_DREAM : 100return new llama_model_dream (params ); 101case LLM_ARCH_LLADA : 102return new llama_model_llada (params ); 103case LLM_ARCH_LLADA_MOE : 104return new llama_model_llada_moe (params ); 105case LLM_ARCH_RND1 : 106return new llama_model_rnd1 (params ); 107case LLM_ARCH_QWEN2VL : 108return new llama_model_qwen2vl (params ); 109case LLM_ARCH_QWEN2MOE : 110return new llama_model_qwen2moe (params ); 111case LLM_ARCH_QWEN3 : 112return new llama_model_qwen3 (params ); 113case LLM_ARCH_QWEN3MOE : 114return new llama_model_qwen3moe (params ); 115case LLM_ARCH_QWEN3VL : 116return new llama_model_qwen3vl (params ); 117case LLM_ARCH_QWEN3VLMOE : 118return new llama_model_qwen3vlmoe (params ); 119case LLM_ARCH_QWEN3TTS : 120return new llama_model_qwen3tts (params ); 121case LLM_ARCH_POCKETTTS : 122return new llama_model_pockettts (params ); 123case LLM_ARCH_PHI2 : 124return new llama_model_phi2 (params ); 125case LLM_ARCH_PHI3 : 126return new llama_model_phi3 (params ); 127case LLM_ARCH_PHIMOE : 128return new llama_model_phimoe (params ); 129case LLM_ARCH_PLAMO : 130return new llama_model_plamo (params ); 131case LLM_ARCH_PLAMO2 : 132return new llama_model_plamo2 (params ); 133case LLM_ARCH_PLAMO3 : 134return new llama_model_plamo3 (params ); 135case LLM_ARCH_GPT2 : 136return new llama_model_gpt2 (params ); 137case LLM_ARCH_CODESHELL : 138return new llama_model_codeshell (params ); 139case LLM_ARCH_ORION : 140return new llama_model_orion (params ); 141case LLM_ARCH_INTERNLM2 : 142return new llama_model_internlm2 (params ); 143case LLM_ARCH_MINICPM3 : 144return new llama_model_minicpm3 (params ); 145case LLM_ARCH_GEMMA : 146return new llama_model_gemma (params ); 147case LLM_ARCH_GEMMA2 : 148return new llama_model_gemma2 (params ); 149case LLM_ARCH_GEMMA3 : 150return new llama_model_gemma3 (params ); 151case LLM_ARCH_GEMMA3N : 152return new llama_model_gemma3n (params ); 153case LLM_ARCH_GEMMA4 : 154return new llama_model_gemma4 (params ); 155case LLM_ARCH_GEMMA4_ASSISTANT : 156return new llama_model_gemma4_assistant (params ); 157case LLM_ARCH_GEMMA_EMBEDDING : 158return new llama_model_gemma_embedding (params ); 159case LLM_ARCH_STARCODER2 : 160return new llama_model_starcoder2 (params ); 161case LLM_ARCH_MAMBA : 162return new llama_model_mamba (params ); 163case LLM_ARCH_MAMBA2 : 164return new llama_model_mamba2 (params ); 165case LLM_ARCH_MAPLE : 166return new llama_model_maple (params ); 167case LLM_ARCH_JAMBA : 168return new llama_model_jamba (params ); 169case LLM_ARCH_XVERSE : 170return new llama_model_xverse (params ); 171case LLM_ARCH_COMMAND_R : 172return new llama_model_command_r (params ); 173case LLM_ARCH_COHERE2 : 174return new llama_model_cohere2 (params ); 175case LLM_ARCH_COHERE2MOE : 176return new llama_model_cohere2moe (params ); 177case LLM_ARCH_DBRX : 178return new llama_model_dbrx (params ); 179case LLM_ARCH_OLMO : 180return new llama_model_olmo (params ); 181case LLM_ARCH_OLMO2 : 182return new llama_model_olmo2 (params ); 183case LLM_ARCH_OLMOE : 184return new llama_model_olmoe (params ); 185case LLM_ARCH_MUSE_GLIMMER : 186return new llama_model_muse_glimmer (params ); 187case LLM_ARCH_OPENELM : 188return new llama_model_openelm (params ); 189case LLM_ARCH_GPTNEOX : 190return new llama_model_gptneox (params ); 191case LLM_ARCH_ARCTIC : 192return new llama_model_arctic (params ); 193case LLM_ARCH_DEEPSEEK : 194return new llama_model_deepseek (params ); 195case LLM_ARCH_DEEPSEEK2 : 196return new llama_model_deepseek2 (params ); 197case LLM_ARCH_DEEPSEEK2OCR : 198return new llama_model_deepseek2ocr (params ); 199case LLM_ARCH_DEEPSEEK32 : 200return new llama_model_deepseek32 (params ); 201case LLM_ARCH_DOTS3NOTE : 202return new llama_model_dots3note (params ); 203case LLM_ARCH_DEEPSEEK4 : 204return new llama_model_deepseek4 (params ); 205case LLM_ARCH_GLM_DSA : 206return new llama_model_glm_dsa (params ); 207case LLM_ARCH_MISTRAL4 : 208return new llama_model_mistral4 (params ); 209case LLM_ARCH_CHATGLM : 210return new llama_model_chatglm (params ); 211case LLM_ARCH_GLM4 : 212return new llama_model_glm4 (params ); 213case LLM_ARCH_GLM4_MOE : 214return new llama_model_glm4_moe (params ); 215case LLM_ARCH_BITNET : 216return new llama_model_bitnet (params ); 217case LLM_ARCH_T5 : 218return new llama_model_t5 (params ); 219case LLM_ARCH_ALICEAI_T5_MOE : 220return new llama_model_aliceai_t5_moe (params ); 221case LLM_ARCH_T5ENCODER : 222return new llama_model_t5encoder (params ); 223case LLM_ARCH_JAIS : 224return new llama_model_jais (params ); 225case LLM_ARCH_JAIS2 : 226return new llama_model_jais2 (params ); 227case LLM_ARCH_NEMOTRON : 228return new llama_model_nemotron (params ); 229case LLM_ARCH_NEMOTRON_H : 230return new llama_model_nemotron_h (params ); 231case LLM_ARCH_NEMOTRON_H_MOE : 232return new llama_model_nemotron_h_moe (params ); 233case LLM_ARCH_EXAONE : 234return new llama_model_exaone (params ); 235case LLM_ARCH_EXAONE4 : 236return new llama_model_exaone4 (params ); 237case LLM_ARCH_EXAONE_MOE : 238return new llama_model_exaone_moe (params ); 239case LLM_ARCH_RWKV6 : 240return new llama_model_rwkv6 (params ); 241case LLM_ARCH_RWKV6QWEN2 : 242return new llama_model_rwkv6qwen2 (params ); 243case LLM_ARCH_RWKV7 : 244return new llama_model_rwkv7 (params ); 245case LLM_ARCH_ARWKV7 : 246return new llama_model_arwkv7 (params ); 247case LLM_ARCH_GRANITE : 248return new llama_model_granite (params ); 249case LLM_ARCH_GRANITE_MOE : 250return new llama_model_granite_moe (params ); 251case LLM_ARCH_GRANITE_SWITCH : 252return new llama_model_granite_switch (params ); 253case LLM_ARCH_MINICPM : 254return new llama_model_minicpm (params ); 255case LLM_ARCH_GRANITE_HYBRID : 256return new llama_model_granite_hybrid (params ); 257case LLM_ARCH_GRANITE_SWA : 258return new llama_model_granite_swa (params ); 259case LLM_ARCH_CHAMELEON : 260return new llama_model_chameleon (params ); 261case LLM_ARCH_WAVTOKENIZER_DEC : 262return new llama_model_wavtokenizer_dec (params ); 263case LLM_ARCH_PLM : 264return new llama_model_plm (params ); 265case LLM_ARCH_BAILINGMOE : 266return new llama_model_bailingmoe (params ); 267case LLM_ARCH_BAILINGMOE2 : 268return new llama_model_bailingmoe2 (params ); 269case LLM_ARCH_BAILINGMOE3 : 270return new llama_model_bailingmoe3 (params ); 271case LLM_ARCH_SEED_OSS : 272return new llama_model_seed_oss (params ); 273case LLM_ARCH_DOTS1 : 274return new llama_model_dots1 (params ); 275case LLM_ARCH_ARCEE : 276return new llama_model_arcee (params ); 277case LLM_ARCH_AFMOE : 278return new llama_model_afmoe (params ); 279case LLM_ARCH_LAGUNA : 280return new llama_model_laguna (params ); 281case LLM_ARCH_ERNIE4_5 : 282return new llama_model_ernie4_5 (params ); 283case LLM_ARCH_ERNIE4_5_MOE : 284return new llama_model_ernie4_5_moe (params ); 285case LLM_ARCH_PADDLEOCR : 286return new llama_model_paddleocr (params ); 287case LLM_ARCH_HUNYUAN_MOE : 288return new llama_model_hunyuan_moe (params ); 289case LLM_ARCH_HUNYUAN_VL : 290return new llama_model_hunyuan_vl (params ); 291case LLM_ARCH_HUNYUAN_DENSE : 292return new llama_model_hunyuan_dense (params ); 293case LLM_ARCH_HY_V3 : 294return new llama_model_hy_v3 (params ); 295case LLM_ARCH_HY_V4 : 296return new llama_model_hy_v4 (params ); 297case LLM_ARCH_SMOLLM3 : 298return new llama_model_smollm3 (params ); 299case LLM_ARCH_OPENAI_MOE : 300return new llama_model_openai_moe (params ); 301case LLM_ARCH_FALCON_H1 : 302return new llama_model_falcon_h1 (params ); 303case LLM_ARCH_LFM2 : 304return new llama_model_lfm2 (params ); 305case LLM_ARCH_LFM2MOE : 306return new llama_model_lfm2moe (params ); 307case LLM_ARCH_SMALLTHINKER : 308return new llama_model_smallthinker (params ); 309case LLM_ARCH_GROVEMOE : 310return new llama_model_grovemoe (params ); 311case LLM_ARCH_APERTUS : 312return new llama_model_apertus (params ); 313case LLM_ARCH_MINIMAX_01 : 314return new llama_model_minimax_01 (params ); 315case LLM_ARCH_MINIMAX_M2 : 316return new llama_model_minimax_m2 (params ); 317case LLM_ARCH_MINIMAX_M3 : 318return new llama_model_minimax_m3 (params ); 319case LLM_ARCH_COGVLM : 320return new llama_model_cogvlm (params ); 321case LLM_ARCH_PANGU_EMBED : 322return new llama_model_pangu_embed (params ); 323case LLM_ARCH_QWEN3NEXT : 324return new llama_model_qwen3next (params ); 325case LLM_ARCH_QWEN35 : 326return new llama_model_qwen35 (params ); 327case LLM_ARCH_QWEN35MOE : 328return new llama_model_qwen35moe (params ); 329case LLM_ARCH_QWEN4EXP : 330return new llama_model_qwen4exp (params ); 331case LLM_ARCH_MISTRAL3 : 332return new llama_model_mistral3 (params ); 333case LLM_ARCH_EAGLE3 : 334return new llama_model_eagle3 (params ); 335case LLM_ARCH_DFLASH : 336return new llama_model_dflash (params ); 337case LLM_ARCH_MIMO2 : 338return new llama_model_mimo2 (params ); 339case LLM_ARCH_KIMI_LINEAR : 340return new llama_model_kimi_linear (params ); 341case LLM_ARCH_KIMI_K3 : 342return new llama_model_kimi_k3 (params ); 343case LLM_ARCH_STEP35 : 344return new llama_model_step35 (params ); 345case LLM_ARCH_SPARK2_5 : 346return new llama_model_spark2_5 (params ); 347default : 348throw std::runtime_error (std::string ("unsupported model architecture: '" )+ llm_arch_name (arch )+ "'" ); 349 } 350 351} 352 353llama_model * llama_model_create (llm_arch arch ,const llama_model_params & params ) { 354llama_model * model = llama_model_mapping (arch ,params ); 355 356if (model != nullptr ) { 357model -> arch = arch ; 358if (params .split_mode == LLAMA_SPLIT_MODE_TENSOR && !llm_arch_supports_sm_tensor (arch )) { 359throw std::runtime_error (std::string ("LLAMA_SPLIT_MODE_TENSOR not implemented for architecture '" )+ llm_arch_name (arch )+ "'" ); 360 } 361 } 362 363return model ; 364} 365 366llama_model * llama_model_create (llama_model_loader & ml ,const llama_model_params & params ) { 367llm_arch arch = ml .get_arch (); 368if (arch == LLM_ARCH_UNKNOWN ) { 369throw std::runtime_error ("unknown model architecture: '" + ml .get_arch_name ()+ "'" ); 370 } 371 372return llama_model_create (arch ,params ); 373} 374 375struct ggml_backend_meta_split_state llama_meta_device_get_split_state (const struct ggml_tensor * tensor ,void * userdata ) { 376const llama_meta_device_get_split_state_userdata * ud = (const llama_meta_device_get_split_state_userdata * )userdata ; 377const llama_hparams & hparams = ud -> model -> hparams ; 378const std::string tensor_name = tensor -> name ; 379const bool is_dsv4 = ud -> model -> arch == LLM_ARCH_DEEPSEEK4 || 380 (ud -> model -> arch == LLM_ARCH_DFLASH && hparams .dsv4_hc_mult > 0 ); 381 382static const std::regex pattern_q_weight ("blk\\.\\d*\\.attn_q.weight" ); 383static const std::regex pattern_kv_weight ("blk\\.\\d*\\.attn_(k|v).weight" ); 384static const std::regex pattern_qkv_weight ("blk\\.\\d*\\.attn_qkv.weight" ); 385static const std::regex pattern_q_bias ("blk\\.\\d*\\.attn_q\\.bias" ); 386static const std::regex pattern_kv_bias ("blk\\.\\d*\\.attn_(k|v)\\.bias" ); 387static const std::regex pattern_qkv_bias ("blk\\.\\d*\\.attn_qkv.bias" ); 388static const std::regex pattern_qk_norm ("blk\\.\\d*\\.attn_(q|k)_norm\\.weight" ); 389static const std::regex pattern_kv_cache ("cache_(k|v)_l\\d*" ); 390static const std::regex pattern_idx_cache ("cache_idx_(k|v)_l\\d*" ); 391static const std::regex pattern_dsv4_state ("dsv4_(csa|hca|lid)_state_(kv|score)_l\\d*" ); 392static const std::regex pattern_attn_sinks ("blk\\.\\d*\\.attn_sinks.weight" ); 393static const std::regex pattern_attn_out_weight ("blk\\.\\d*\\.attn_output.weight" ); 394static const std::regex pattern_attn_out_bias ("blk\\.\\d*\\.attn_output.bias" ); 395static const std::regex pattern_attn_out_a_weight ("blk\\.\\d*\\.attn_output_a\\.weight" ); 396static const std::regex pattern_attn_out_b_weight ("blk\\.\\d*\\.attn_output_b\\.weight" ); 397static const std::regex pattern_attn_q_b_weight ("blk\\.\\d*\\.attn_q_b\\.weight" ); 398static const std::regex pattern_attn_gate_weight ("blk\\.\\d*\\.attn_gate.weight" ); 399 400static const std::regex pattern_ssm_dt ("blk\\.\\d*\\.ssm_dt.bias" ); 401static const std::regex pattern_ssm_a ("blk\\.\\d*\\.ssm_a" ); 402static const std::regex pattern_ssm_alpha ("blk\\.\\d*\\.ssm_alpha.weight" ); 403static const std::regex pattern_ssm_beta ("blk\\.\\d*\\.ssm_beta.weight" ); 404static const std::regex pattern_ssm_beta_alpha ("blk\\.\\d*\\.ssm_ba.weight" ); 405static const std::regex pattern_r_cache ("cache_r_l\\d*" ); 406static const std::regex pattern_ple_r_cache ("cache_ple_r_l\\d*" ); 407static const std::regex pattern_s_cache ("cache_s_l\\d*" ); 408static const std::regex pattern_ssm_conv1d ("blk\\.\\d*\\.ssm_conv1d.weight" ); 409static const std::regex pattern_ssm_out_weight ("blk\\.\\d*\\.ssm_out.weight" ); 410 411static const std::regex pattern_ffn_up_weight ("blk\\.\\d*\\.ffn_up(_exps)?.weight" ); 412static const std::regex pattern_ffn_up_bias ("blk\\.\\d*\\.ffn_up(_exps)?.bias" ); 413static const std::regex pattern_ffn_gate_weight ("blk\\.\\d*\\.ffn_gate(_exps)?.weight" ); 414static const std::regex pattern_ffn_gate_bias ("blk\\.\\d*\\.ffn_gate(_exps)?.bias" ); 415static const std::regex pattern_ffn_gate_up_weight ("blk\\.\\d*\\.ffn_gate_up(_exps)?.weight" ); 416static const std::regex pattern_ffn_down_weight ("blk\\.\\d*\\.ffn_down(_exps)?.weight" ); 417static const std::regex pattern_ffn_down_bias ("blk\\.\\d*\\.ffn_down.bias" ); 418static const std::regex pattern_ffn_down_exps_bias ("blk\\.\\d*\\.ffn_down_exps.bias" ); 419static const std::regex pattern_ffn_up_shexp_weight ("blk\\.\\d*\\.ffn_up_shexp.weight" ); 420static const std::regex pattern_ffn_gate_shexp_weight ("blk\\.\\d*\\.ffn_gate_shexp.weight" ); 421static const std::regex pattern_ffn_down_shexp_weight ("blk\\.\\d*\\.ffn_down_shexp.weight" ); 422 423static const std::regex pattern_output_weight ("output\\.weight" ); 424static const std::regex pattern_output_bias ("output\\.bias" ); 425 426struct tensor_config { 427ggml_backend_meta_split_axis axis ; 428 429const ggml_tensor * tensor_axis_0 ; 430 431uint32_t il ; 432size_t rotation ;// when assigning tensor slices, rotate how the rounding is done for more even allocation 433 }; 434 435auto get_tensor_config_impl = [& ]( 436const ggml_backend_meta_split_axis axis ,const std::string & suffix = "" ,const std::string & suffix_fallback = "" )-> tensor_config { 437// the layers in a tensor can be inhomogeneous, if the pattern is cleanly divided by the number of GPUs there can be aliasing effects, 438// count only the same type of previous layers to avoid this 439auto get_il_eff = [& ](const size_t il ){ 440size_t ret = 0 ; 441const bool il_is_recr = hparams .is_recr (il ); 442const bool il_is_swa = hparams .is_swa (il ); 443for (size_t il_prev = 0 ;il_prev < il ;il_prev ++ ) { 444ret += hparams .is_recr (il_prev )== il_is_recr && hparams .is_swa (il_prev )== il_is_swa ; 445 } 446return ret ; 447 }; 448 449uint32_t il ; 450 std::string prefix ; 451size_t rotation ; 452if (tensor_name .substr (0 ,4 )== "blk." ) { 453const size_t length_prefix = tensor_name .find ('.' ,4 ); 454GGML_ASSERT (length_prefix != std::string::npos ); 455prefix = tensor_name .substr (0 ,length_prefix + 1 ); 456il = std::stoull (tensor_name .substr (4 ,length_prefix )); 457rotation = get_il_eff (il ) %ud -> n_devices ; 458 }else if (tensor_name .substr (0 ,6 )== "cache_" ) { 459const size_t layer_index_start = tensor_name .find ("_l" ,6 ); 460GGML_ASSERT (layer_index_start != std::string::npos ); 461il = std::stoull (tensor_name .substr (layer_index_start + 2 )); 462prefix = "blk." + std::to_string (il )+ "." ; 463rotation = get_il_eff (il ) %ud -> n_devices ; 464 }else { 465il = 0 ; 466rotation = hparams .n_layer () %ud -> n_devices ; 467 } 468const ggml_tensor * tensor_axis_0 = suffix .empty () ?tensor :ud -> model -> get_tensor ((prefix + suffix ).c_str ()); 469if (tensor_axis_0 == nullptr ) { 470GGML_ASSERT (!suffix_fallback .empty ()); 471tensor_axis_0 = ud -> model -> get_tensor ((prefix + suffix_fallback ).c_str ()); 472 } 473GGML_ASSERT (tensor_axis_0 != nullptr ); 474return {axis ,tensor_axis_0 ,il ,rotation }; 475 }; 476 477auto get_tensor_config = [& ]()-> tensor_config { 478if (is_dsv4 ) { 479if (std::regex_match (tensor_name ,pattern_kv_cache )|| 480 std::regex_match (tensor_name ,pattern_dsv4_state )) { 481return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_MIRRORED ); 482 } 483if (std::regex_match (tensor_name ,pattern_attn_sinks )) { 484return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_0 ,"attn_output_a.weight" ); 485 } 486if (std::regex_match (tensor_name ,pattern_attn_q_b_weight )) { 487return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_1 ,"attn_output_a.weight" ); 488 } 489if (std::regex_match (tensor_name ,pattern_attn_out_a_weight )) { 490return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_2 ); 491 } 492if (std::regex_match (tensor_name ,pattern_attn_out_b_weight )) { 493return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_0 ); 494 } 495if (std::regex_match (tensor_name ,pattern_ffn_up_shexp_weight )|| 496 std::regex_match (tensor_name ,pattern_ffn_gate_shexp_weight )) { 497return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_1 ,"ffn_down_shexp.weight" ); 498 } 499if (std::regex_match (tensor_name ,pattern_ffn_down_shexp_weight )) { 500return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_0 ,"ffn_down_shexp.weight" ); 501 } 502 } 503 504// the qsa indexer has one key head and its projections are mirrored, so its cache cannot be split 505if (std::regex_match (tensor_name ,pattern_idx_cache )) { 506return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_MIRRORED ); 507 } 508 509// the PLE table is model-level and its conv is mirrored, so every device runs the whole conv and needs the whole history 510if (std::regex_match (tensor_name ,pattern_ple_r_cache )) { 511return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_MIRRORED ); 512 } 513 514// standard attention 515if (std::regex_match (tensor_name ,pattern_q_weight )|| std::regex_match (tensor_name ,pattern_kv_weight )) { 516return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_1 ,"attn_output.weight" ,"ssm_out.weight" ); 517 } 518if (std::regex_match (tensor_name ,pattern_q_bias )|| std::regex_match (tensor_name ,pattern_kv_bias )) { 519return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_0 ,"attn_output.weight" ,"ssm_out.weight" ); 520 } 521if (std::regex_match (tensor_name ,pattern_qkv_weight )) { 522return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_1 ,"attn_output.weight" ,"ssm_out.weight" ); 523 } 524if ( std::regex_match (tensor_name ,pattern_qkv_bias )) { 525return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_0 ,"attn_output.weight" ,"ssm_out.weight" ); 526 } 527if (std::regex_match (tensor_name ,pattern_qk_norm )) { 528return get_tensor_config_impl (tensor -> ne [1 ]== 1 ?GGML_BACKEND_SPLIT_AXIS_MIRRORED :GGML_BACKEND_SPLIT_AXIS_1 ,"attn_output.weight" ); 529 } 530if (std::regex_match (tensor_name ,pattern_kv_cache )|| std::regex_match (tensor_name ,pattern_attn_sinks )) { 531return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_0 ,"attn_output.weight" ); 532 } 533if (std::regex_match (tensor_name ,pattern_attn_out_weight )) { 534return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_0 ); 535 } 536if (std::regex_match (tensor_name ,pattern_attn_out_bias )) { 537return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_MIRRORED ); 538 } 539 540if (std::regex_match (tensor_name ,pattern_attn_gate_weight )) { 541return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_1 ,"attn_output.weight" ,"ssm_out.weight" ); 542 } 543if (std::regex_match (tensor_name ,pattern_ssm_dt )|| std::regex_match (tensor_name ,pattern_ssm_a )) { 544return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_0 ,"ssm_out.weight" ); 545 } 546if (std::regex_match (tensor_name ,pattern_ssm_alpha )|| std::regex_match (tensor_name ,pattern_ssm_beta )|| 547 std::regex_match (tensor_name ,pattern_ssm_beta_alpha )) { 548return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_1 ,"ssm_out.weight" ); 549 } 550if (std::regex_match (tensor_name ,pattern_r_cache )|| std::regex_match (tensor_name ,pattern_s_cache )) { 551if (ud -> model -> arch == LLM_ARCH_LFM2 || ud -> model -> arch == LLM_ARCH_LFM2MOE ) { 552// the LFM2 shortconv block runs fully mirrored, so its conv state must be mirrored too 553return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_MIRRORED ,"" ); 554 } 555return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_0 ,"ssm_out.weight" ); 556 } 557if (std::regex_match (tensor_name ,pattern_ssm_conv1d )) { 558return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_1 ,"ssm_out.weight" ); 559 } 560if (std::regex_match (tensor_name ,pattern_ssm_out_weight )) { 561return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_0 ); 562 } 563 564// FFN 565if (std::regex_match (tensor_name ,pattern_ffn_up_weight )|| std::regex_match (tensor_name ,pattern_ffn_gate_weight )) { 566return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_1 ,"ffn_down.weight" ,"ffn_down_exps.weight" ); 567 } 568if (std::regex_match (tensor_name ,pattern_ffn_up_bias )|| std::regex_match (tensor_name ,pattern_ffn_gate_bias )) { 569return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_0 ,"ffn_down.weight" ,"ffn_down_exps.weight" ); 570 } 571if (std::regex_match (tensor_name ,pattern_ffn_gate_up_weight )) { 572return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_1 ,"ffn_down.weight" ,"ffn_down_exps.weight" ); 573 } 574if (std::regex_match (tensor_name ,pattern_ffn_down_weight )) { 575return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_0 ,"ffn_down.weight" ,"ffn_down_exps.weight" ); 576 } 577if (std::regex_match (tensor_name ,pattern_ffn_down_bias )) { 578return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_MIRRORED ); 579 } 580if (std::regex_match (tensor_name ,pattern_ffn_down_exps_bias )) { 581return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_PARTIAL ,"ffn_down_exps.weight" ); 582 } 583 584// output 585if (std::regex_match (tensor_name ,pattern_output_weight )) { 586if (is_dsv4 ) { 587return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_MIRRORED ); 588 } 589return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_1 ); 590 } 591if (std::regex_match (tensor_name ,pattern_output_bias )) { 592const ggml_tensor * output_weight = ud -> model -> get_tensor ("output.weight" ); 593GGML_ASSERT (output_weight != nullptr ); 594return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_0 ); 595 } 596 597// everything else 598return get_tensor_config_impl (GGML_BACKEND_SPLIT_AXIS_MIRRORED ); 599 }; 600 601auto get_split_segments = [& ](int axis ,uint32_t il )-> std::vector < std::pair < int64_t ,uint32_t >> { 602if (ud -> model -> arch == LLM_ARCH_QWEN3NEXT || ud -> model -> arch == LLM_ARCH_QWEN35 || ud -> model -> arch == LLM_ARCH_QWEN35MOE || 603ud -> model -> arch == LLM_ARCH_QWEN4EXP ) { 604const int64_t head_k_dim = hparams .ssm_d_state ; 605const int64_t head_v_dim = hparams .ssm_d_state ; 606const int64_t n_k_heads = hparams .ssm_n_group ; 607const int64_t n_v_heads = hparams .ssm_dt_rank ; 608const int64_t key_dim = head_k_dim * n_k_heads ; 609const int64_t value_dim = head_v_dim * n_v_heads ; 610 611// both Qwen 3 Next and Qwen 3.5 support n_v_heads > n_k_heads but the broadcasting pattern is different: 612// - Qwen 3 Next: [k0_v0, k0_v1, k1_v2, k1_v3] (this is the default split pattern) 613// - Qwen 3.5: [k0_v0, k1_v1, k0_v2, k1_v3] (needs segmenting of V on the scale of K to get the correct pattern) 614if (ud -> model -> arch == LLM_ARCH_QWEN3NEXT ) { 615if (std::regex_match (tensor_name ,pattern_qkv_weight )|| std::regex_match (tensor_name ,pattern_ssm_conv1d )) { 616GGML_ASSERT (tensor -> ne [axis ]== 2 * key_dim + value_dim ); 617return {{key_dim ,2 }, {value_dim ,1 }}; 618 } 619if (std::regex_match (tensor_name ,pattern_r_cache )) { 620return {{key_dim * (hparams .ssm_d_conv - 1 ),2 }, {value_dim * (hparams .ssm_d_conv - 1 ),1 }}; 621 } 622 }else { 623const int64_t head_ratio = n_v_heads /n_k_heads ; 624if (std::regex_match (tensor_name ,pattern_qkv_weight )|| std::regex_match (tensor_name ,pattern_ssm_conv1d )) { 625GGML_ASSERT (tensor -> ne [axis ]== 2 * key_dim + value_dim ); 626return {{key_dim ,2 + head_ratio }}; 627 } 628if (std::regex_match (tensor_name ,pattern_attn_gate_weight )|| std::regex_match (tensor_name ,pattern_ssm_out_weight )) { 629return {{key_dim ,head_ratio }}; 630 } 631if (std::regex_match (tensor_name ,pattern_ssm_dt )|| std::regex_match (tensor_name ,pattern_ssm_a )|| 632 std::regex_match (tensor_name ,pattern_ssm_alpha )|| std::regex_match (tensor_name ,pattern_ssm_beta )) { 633return {{n_k_heads ,head_ratio }}; 634 } 635if (std::regex_match (tensor_name ,pattern_r_cache )) { 636return {{key_dim * (hparams .ssm_d_conv - 1 ),2 + head_ratio }}; 637 } 638if (std::regex_match (tensor_name ,pattern_s_cache )) { 639return {{n_k_heads * head_v_dim * head_v_dim ,head_ratio }}; 640 } 641 } 642 643// the FFN is the same for Qwen 3 Next and Qwen 3.5: 644if (std::regex_match (tensor_name ,pattern_ffn_gate_up_weight )) { 645const int64_t n_ff_exp = hparams .n_ff_exp (il ); 646GGML_ASSERT (tensor -> ne [axis ]== 2 * n_ff_exp ); 647return {{n_ff_exp ,2 }}; 648 } 649return {{tensor -> ne [axis ],1 }}; 650 } 651 652if (std::regex_match (tensor_name ,pattern_qkv_weight )|| std::regex_match (tensor_name ,pattern_qkv_bias )) { 653const int64_t n_embd = hparams .n_embd ; 654const int64_t n_embd_gqa = hparams .n_embd_v_gqa (il ); 655GGML_ASSERT (hparams .n_embd_k_gqa ()== n_embd_gqa ); 656GGML_ASSERT (tensor -> ne [axis ]== n_embd + 2 * n_embd_gqa ); 657return {{n_embd ,1 }, {n_embd_gqa ,2 }}; 658 } 659if (std::regex_match (tensor_name ,pattern_ffn_up_weight )|| std::regex_match (tensor_name ,pattern_ffn_up_bias )) { 660const int64_t n_ff = hparams .n_ff (il ); 661// some models such as Phi 3 have fused up + gate tensors named "up" tensors, which need to be segmented 662if (tensor -> ne [axis ]== 2 * n_ff ) { 663return {{n_ff ,2 }}; 664 } 665return {{tensor -> ne [axis ],1 }}; 666 } 667if (std::regex_match (tensor_name ,pattern_ffn_gate_up_weight )) { 668const int64_t n_ff_exp = hparams .n_ff_exp (il ); 669GGML_ASSERT (tensor -> ne [axis ]== 2 * n_ff_exp ); 670return {{n_ff_exp ,2 }}; 671 } 672return {{tensor -> ne [axis ],1 }}; 673 }; 674 675auto get_split_granularity = [& ](int64_t blck_size ,uint32_t il ,const std::vector < std::pair < int64_t ,uint32_t >> & segments )-> std::vector < int64_t > { 676// for better performance it may make sense to round up blck_size to a higher power of 2 so that more efficient kernels can be used 677if (hparams .is_recr (il )) { 678// linear attention 679const int64_t head_dim = hparams .ssm_d_state ; 680const int64_t blck_size_perf = std::lcm (blck_size ,128 ); 681const int64_t granularity_qkv = std::lcm (blck_size_perf ,head_dim ); 682if (std::regex_match (tensor_name ,pattern_qkv_weight )|| std::regex_match (tensor_name ,pattern_attn_gate_weight )|| 683 std::regex_match (tensor_name ,pattern_ssm_conv1d )|| std::regex_match (tensor_name ,pattern_ssm_out_weight )) { 684return std::vector < int64_t > (segments .size (),granularity_qkv ); 685 } 686if (std::regex_match (tensor_name ,pattern_ssm_dt )|| std::regex_match (tensor_name ,pattern_ssm_a )|| 687 std::regex_match (tensor_name ,pattern_ssm_alpha )|| std::regex_match (tensor_name ,pattern_ssm_beta )) { 688return std::vector < int64_t > (segments .size (),granularity_qkv /head_dim ); 689 } 690if (std::regex_match (tensor_name ,pattern_ssm_beta_alpha )) { 691return std::vector < int64_t > (segments .size (),2 * (granularity_qkv /head_dim )); 692 } 693if (std::regex_match (tensor_name ,pattern_r_cache )) { 694return std::vector < int64_t > (segments .size (),granularity_qkv * (hparams .ssm_d_conv - 1 )); 695 } 696if (std::regex_match (tensor_name ,pattern_s_cache )) { 697return std::vector < int64_t > (segments .size (),granularity_qkv * head_dim ); 698 } 699 }else { 700// regular attention 701const uint32_t n_gqa = hparams .n_gqa (il ); 702const uint32_t n_embd_q = n_gqa * hparams .n_embd_head_k (il ); 703 704// to handle head sizes like 80, only increase granularity while it doesn't cause underutilization 705int64_t blck_size_perf = blck_size ; 706while (blck_size_perf < 128 && blck_size_perf * ud -> n_devices < n_embd_q ) { 707blck_size_perf *=2 ; 708 } 709 710const int64_t granularity_q = std::lcm (n_embd_q ,blck_size_perf ); 711const int64_t granularity_head = granularity_q /hparams .n_embd_head_k (il );// for tensors with one value per head 712if (std::regex_match (tensor_name ,pattern_attn_sinks )) { 713GGML_ASSERT (segments .size ()== 1 ); 714if (is_dsv4 ) { 715return {hparams .n_head (il ) /hparams .dsv4_o_group_count }; 716 } 717return {granularity_head }; 718 } 719 720if (is_dsv4 ) { 721if (std::regex_match (tensor_name ,pattern_attn_q_b_weight )) { 722GGML_ASSERT (segments .size ()== 1 ); 723// the grouped output projection requires each device to hold whole groups of heads 724const int64_t n_head_group = hparams .n_head (il ) /hparams .dsv4_o_group_count ; 725return {n_head_group * hparams .n_embd_head_k (il )}; 726 } 727if (std::regex_match (tensor_name ,pattern_attn_out_a_weight )) { 728GGML_ASSERT (segments .size ()== 1 ); 729return {1 }; 730 } 731if (std::regex_match (tensor_name ,pattern_attn_out_b_weight )) { 732GGML_ASSERT (segments .size ()== 1 ); 733// the boundaries must align with wo_a's per-group split, so quant blocks must not straddle groups 734GGML_ASSERT (hparams .dsv4_o_lora_rank %blck_size == 0 ); 735return {hparams .dsv4_o_lora_rank }; 736 } 737 } 738if (std::regex_match (tensor_name ,pattern_q_weight )|| std::regex_match (tensor_name ,pattern_q_bias )) { 739GGML_ASSERT (segments .size ()== 1 ); 740// some models have Q gate tensors, for those cases the granularity needs to be doubled: 741if (ud -> model -> arch == LLM_ARCH_QWEN3NEXT || ud -> model -> arch == LLM_ARCH_QWEN35 || ud -> model -> arch == LLM_ARCH_QWEN35MOE || 742ud -> model -> arch == LLM_ARCH_QWEN4EXP ) { 743return {std::lcm (2 * n_embd_q ,blck_size_perf )}; 744 } 745return {granularity_q }; 746 } 747if (std::regex_match (tensor_name ,pattern_attn_out_weight )) { 748GGML_ASSERT (segments .size ()== 1 ); 749return {granularity_q }; 750 } 751if (std::regex_match (tensor_name ,pattern_attn_gate_weight )) { 752GGML_ASSERT (segments .size ()== 1 ); 753if (tensor -> ne [1 ]== hparams .n_head (il )) { 754return {granularity_head }; 755 } 756return {granularity_q }; 757 } 758 759const int64_t granularity_kv = granularity_q /n_gqa ; 760if (std::regex_match (tensor_name ,pattern_kv_weight )|| 761 std::regex_match (tensor_name ,pattern_kv_bias )|| 762 std::regex_match (tensor_name ,pattern_kv_cache )) { 763GGML_ASSERT (segments .size ()== 1 ); 764return {granularity_kv }; 765 } 766if (std::regex_match (tensor_name ,pattern_qkv_weight )|| std::regex_match (tensor_name ,pattern_qkv_bias )) { 767GGML_ASSERT (segments .size ()== 2 ); 768return {granularity_q ,granularity_kv }; 769 } 770 } 771 772// FFN 773if (std::regex_match (tensor_name ,pattern_ffn_up_weight )|| std::regex_match (tensor_name ,pattern_ffn_up_bias )|| 774 std::regex_match (tensor_name ,pattern_ffn_gate_weight )|| std::regex_match (tensor_name ,pattern_ffn_gate_bias )|| 775 std::regex_match (tensor_name ,pattern_ffn_gate_up_weight )|| 776 std::regex_match (tensor_name ,pattern_ffn_down_weight )|| 777 std::regex_match (tensor_name ,pattern_ffn_up_shexp_weight )|| 778 std::regex_match (tensor_name ,pattern_ffn_gate_shexp_weight )|| 779 std::regex_match (tensor_name ,pattern_ffn_down_shexp_weight )) { 780const int64_t blck_size_perf = std::lcm (blck_size ,128 ); 781GGML_ASSERT (segments .size ()== 1 ); 782return {blck_size_perf }; 783 } 784 785// everything else 786GGML_ASSERT (segments .size ()== 1 ); 787return {1 }; 788 }; 789 790ggml_backend_meta_split_state split_state ; 791memset (& split_state ,0 ,sizeof (split_state )); 792tensor_config tc = get_tensor_config (); 793split_state .axis = tc .axis ; 794if (split_state .axis >=0 && split_state .axis < GGML_MAX_DIMS ) { 795const int64_t blck_size = ggml_blck_size (tc .tensor_axis_0 -> type ); 796const float * tensor_split = ud -> model -> tensor_split (); 797 std::vector < float > tensor_split_scan ; 798tensor_split_scan .reserve (ud -> n_devices ); 799for (size_t j = 0 ;j < ud -> n_devices ;j ++ ) { 800tensor_split_scan .push_back (tensor_split == nullptr ?0.0f :tensor_split [(j + tc .rotation ) %ud -> n_devices ]); 801if (j > 0 ) { 802tensor_split_scan [j ]+= tensor_split_scan [j - 1 ]; 803 } 804 } 805const std::vector < std::pair < int64_t ,uint32_t >> segments = get_split_segments (split_state .axis ,tc .il ); 806const std::vector < int64_t > granularity = get_split_granularity (blck_size ,tc .il ,segments ); 807for (size_t is = 0 ;is < segments .size ();is ++ ) { 808const int64_t ne_s = segments [is ].first ; 809const uint32_t nr_s = segments [is ].second ; 810const int64_t g_s = granularity [is ]; 811int64_t low = 0 ; 812size_t j = 0 ; 813for (;j < ud -> n_devices - 1 ;j ++ ) { 814int64_t high = tensor_split_scan .back ()== 0.0f ? 815ne_s * (j + 1 )/ud -> n_devices :ne_s * tensor_split_scan [j ]/tensor_split_scan .back (); 816if (high %g_s != 0 ) { 817high -= high %g_s ; 818 } 819split_state .ne [is * ud -> n_devices + (j + tc .rotation ) %ud -> n_devices ]= high - low ; 820low = high ; 821 } 822split_state .ne [is * ud -> n_devices + (j + tc .rotation ) %ud -> n_devices ]= ne_s - low ; 823split_state .nr [is ]= nr_s ; 824 } 825split_state .n_segments = segments .size (); 826 }else { 827memset (split_state .ne ,0 ,sizeof (split_state .ne )); 828split_state .nr [0 ]= 1 ; 829split_state .n_segments = 1 ; 830if (split_state .axis == GGML_BACKEND_SPLIT_AXIS_PARTIAL ) { 831GGML_ASSERT (tc .tensor_axis_0 != tensor ); 832const ggml_backend_meta_split_state source_split_state = llama_meta_device_get_split_state (tc .tensor_axis_0 ,userdata ); 833GGML_ASSERT (source_split_state .axis >=0 && source_split_state .axis < GGML_MAX_DIMS ); 834for (size_t j = 0 ;j < ud -> n_devices ;j ++ ) { 835for (size_t is = 0 ;is < source_split_state .n_segments ;is ++ ) { 836split_state .ne [j ]+= source_split_state .ne [is * ud -> n_devices + j ]* source_split_state .nr [is ]; 837 } 838 } 839 } 840 } 841return split_state ; 842GGML_UNUSED (userdata ); 843} 844 845const char * llm_type_name (llm_type type ) { 846switch (type ) { 847case LLM_TYPE_14M :return "14M" ; 848case LLM_TYPE_17M :return "17M" ; 849case LLM_TYPE_22M :return "22M" ; 850case LLM_TYPE_33M :return "33M" ; 851case LLM_TYPE_47M :return "47M" ; 852case LLM_TYPE_60M :return "60M" ; 853case LLM_TYPE_70M :return "70M" ; 854case LLM_TYPE_80M :return "80M" ; 855case LLM_TYPE_109M :return "109M" ; 856case LLM_TYPE_137M :return "137M" ; 857case LLM_TYPE_140M :return "140M" ; 858case LLM_TYPE_149M :return "149M" ; 859case LLM_TYPE_160M :return "160M" ; 860case LLM_TYPE_190M :return "190M" ; 861case LLM_TYPE_220M :return "220M" ; 862case LLM_TYPE_230M :return "230M" ; 863case LLM_TYPE_250M :return "250M" ; 864case LLM_TYPE_256M :return "256M" ; 865case LLM_TYPE_270M :return "270M" ; 866case LLM_TYPE_335M :return "335M" ; 867case LLM_TYPE_350M :return "350M" ; 868case LLM_TYPE_360M :return "360M" ; 869case LLM_TYPE_395M :return "395M" ; 870case LLM_TYPE_410M :return "410M" ; 871case LLM_TYPE_450M :return "450M" ; 872case LLM_TYPE_475M :return "475M" ; 873case LLM_TYPE_558M :return "558M" ; 874case LLM_TYPE_700M :return "700M" ; 875case LLM_TYPE_770M :return "770M" ; 876case LLM_TYPE_780M :return "780M" ; 877case LLM_TYPE_950M :return "950M" ; 878case LLM_TYPE_0_3B :return "0.3B" ; 879case LLM_TYPE_0_5B :return "0.5B" ; 880case LLM_TYPE_0_6B :return "0.6B" ; 881case LLM_TYPE_0_8B :return "0.8B" ; 882case LLM_TYPE_1B :return "1B" ; 883case LLM_TYPE_1_2B :return "1.2B" ; 884case LLM_TYPE_1_3B :return "1.3B" ; 885case LLM_TYPE_1_4B :return "1.4B" ; 886case LLM_TYPE_1_5B :return "1.5B" ; 887case LLM_TYPE_1_6B :return "1.6B" ; 888case LLM_TYPE_1_7B :return "1.7B" ; 889case LLM_TYPE_1_8B :return "1.8B" ; 890case LLM_TYPE_2B :return "2B" ; 891case LLM_TYPE_2_6B :return "2.6B" ; 892case LLM_TYPE_2_8B :return "2.8B" ; 893case LLM_TYPE_2_9B :return "2.9B" ; 894case LLM_TYPE_3B :return "3B" ; 895case LLM_TYPE_4B :return "4B" ; 896case LLM_TYPE_6B :return "6B" ; 897case LLM_TYPE_6_9B :return "6.9B" ; 898case LLM_TYPE_7B :return "7B" ; 899case LLM_TYPE_8B :return "8B" ; 900case LLM_TYPE_9B :return "9B" ; 901case LLM_TYPE_11B :return "11B" ; 902case LLM_TYPE_12B :return "12B" ; 903case LLM_TYPE_13B :return "13B" ; 904case LLM_TYPE_14B :return "14B" ; 905case LLM_TYPE_15B :return "15B" ; 906case LLM_TYPE_16B :return "16B" ; 907case LLM_TYPE_20B :return "20B" ; 908case LLM_TYPE_26B :return "26B" ; 909case LLM_TYPE_27B :return "27B" ; 910case LLM_TYPE_30B :return "30B" ; 911case LLM_TYPE_31B :return "31B" ; 912case LLM_TYPE_32B :return "32B" ; 913case LLM_TYPE_34B :return "34B" ; 914case LLM_TYPE_35B :return "35B" ; 915case LLM_TYPE_36B :return "36B" ; 916case LLM_TYPE_40B :return "40B" ; 917case LLM_TYPE_65B :return "65B" ; 918case LLM_TYPE_70B :return "70B" ; 919case LLM_TYPE_120B :return "120B" ; 920case LLM_TYPE_142B :return "142B" ; 921case LLM_TYPE_236B :return "236B" ; 922case LLM_TYPE_290B :return "290B" ; 923case LLM_TYPE_314B :return "314B" ; 924case LLM_TYPE_405B :return "405B" ; 925case LLM_TYPE_456B :return "456B" ; 926case LLM_TYPE_671B :return "671B" ; 927case LLM_TYPE_SMALL :return "0.1B" ; 928case LLM_TYPE_MEDIUM :return "0.4B" ; 929case LLM_TYPE_LARGE :return "0.8B" ; 930case LLM_TYPE_XL :return "1.5B" ; 931case LLM_TYPE_A1_7B :return "A1.7B" ; 932case LLM_TYPE_A2_7B :return "A2.7B" ; 933case LLM_TYPE_8x7B :return "8x7B" ; 934case LLM_TYPE_8x22B :return "8x22B" ; 935case LLM_TYPE_16x12B :return "16x12B" ; 936case LLM_TYPE_16x3_8B :return "16x3.8B" ; 937case LLM_TYPE_10B_128x3_66B :return "10B+128x3.66B" ; 938case LLM_TYPE_57B_A14B :return "57B.A14B" ; 939case LLM_TYPE_17B_16E :return "17Bx16E (Scout)" ; 940case LLM_TYPE_17B_128E :return "17Bx128E (Maverick)" ; 941case LLM_TYPE_A13B :return "A13B" ; 942case LLM_TYPE_1B_A400M :return "1B.A400M" ; 943case LLM_TYPE_3B_A800M :return "3B.A800M" ; 944case LLM_TYPE_7B_A1B :return "7B.A1B" ; 945case LLM_TYPE_8B_A1B :return "8B.A1B" ; 946case LLM_TYPE_7_9B_A1_3B :return "7.9B.A1.3B" ; 947case LLM_TYPE_12B_A2_5B :return "12B.A2.5B" ; 948case LLM_TYPE_16B_A1B :return "16B.A1B" ; 949case LLM_TYPE_21B_A3B :return "21B.A3B" ; 950case LLM_TYPE_24B_A2B :return "24B.A2B" ; 951case LLM_TYPE_26B_A4B :return "26B.A4B" ; 952case LLM_TYPE_30B_A3B :return "30B.A3B" ; 953case LLM_TYPE_31B_A3_5B :return "31B.A3.5B" ; 954case LLM_TYPE_32B_A9B :return "32B.A9B" ; 955case LLM_TYPE_35B_A3B :return "35B.A3B" ; 956case LLM_TYPE_48B_A3B :return "48B.A3B" ; 957case LLM_TYPE_75B_A9B :return "75B.A9B" ; 958case LLM_TYPE_80B_A3B :return "80B.A3B" ; 959case LLM_TYPE_A3B :return "A3B" ; 960case LLM_TYPE_100B_A6B :return "100B.A6B" ; 961case LLM_TYPE_102B_A12B :return "102B.A12B" ; 962case LLM_TYPE_106B_A12B :return "106B.A12B" ; 963case LLM_TYPE_118B_A8B :return "118B.A8B" ; 964case LLM_TYPE_120B_A12B :return "120B.A12B" ; 965case LLM_TYPE_122B_A10B :return "122B.A10B" ; 966case LLM_TYPE_124B_A5_1B :return "124B.A5.1B" ; 967case LLM_TYPE_196B_A11B :return "196B.A11B" ; 968case LLM_TYPE_230B_A10B :return "230B.A10B" ; 969case LLM_TYPE_428B_A23B :return "428B.A23B" ; 970case LLM_TYPE_235B_A22B :return "235B.A22B" ; 971case LLM_TYPE_288B_A19B :return "288B.A19B" ; 972case LLM_TYPE_300B_A47B :return "300B.A47B" ; 973case LLM_TYPE_310B_A15B :return "310B.A15B" ; 974case LLM_TYPE_355B_A32B :return "355B.A32B" ; 975case LLM_TYPE_397B_A17B :return "397B.A17B" ; 976case LLM_TYPE_685B_A37B :return "685B.A37B" ; 977case LLM_TYPE_744B_A40B :return "744B.A40B" ; 978case LLM_TYPE_2_8T_A50B :return "2.8T.A50B" ; 979case LLM_TYPE_E2B :return "E2B" ; 980case LLM_TYPE_E4B :return "E4B" ; 981default :return "?B" ; 982 } 983} 984 985static const char * llama_expert_gating_func_name (llama_expert_gating_func_type type ) { 986switch (type ) { 987case LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX :return "softmax" ; 988case LLAMA_EXPERT_GATING_FUNC_TYPE_SIGMOID :return "sigmoid" ; 989case LLAMA_EXPERT_GATING_FUNC_TYPE_SQRT_SOFTPLUS :return "sqrtsoftplus" ; 990default :return "unknown" ; 991 } 992} 993 994static const std::map < llama_rope_scaling_type ,const char *> LLAMA_ROPE_SCALING_TYPES = { 995 {LLAMA_ROPE_SCALING_TYPE_NONE ,"none" }, 996 {LLAMA_ROPE_SCALING_TYPE_LINEAR ,"linear" }, 997 {LLAMA_ROPE_SCALING_TYPE_YARN ,"yarn" }, 998 {LLAMA_ROPE_SCALING_TYPE_LONGROPE ,"longrope" }, 999}; 1000 1001std::string llama_rope_scaling_type_name (llama_rope_scaling_type rope_scaling_type ) { 1002return LLAMA_ROPE_SCALING_TYPES .at (rope_scaling_type ); 1003} 1004 1005static llama_rope_scaling_type llama_rope_scaling_type_from_string (const std::string & name ) { 1006for (const auto & kv :LLAMA_ROPE_SCALING_TYPES ) { 1007if (kv .second == name ) { 1008return (llama_rope_scaling_type )kv .first ; 1009 } 1010 } 1011 1012return LLAMA_ROPE_SCALING_TYPE_UNSPECIFIED ; 1013} 1014 1015// Maps the GGUF `<arch>.hidden_activation` string to the FFN op type used by the 1016// graph builders. Only gated activations that map cleanly to llm_ffn_op_type are 1017// listed; unrecognized values fall back to GeGLU, which matches the historical 1018// default for ModernBert-style architectures. 1019static const std::map < std::string ,llm_ffn_op_type > LLM_FFN_OP_TYPES_FROM_STRING = { 1020 {"gelu" ,LLM_FFN_GEGLU }, 1021 {"geglu" ,LLM_FFN_GEGLU }, 1022 {"silu" ,LLM_FFN_SWIGLU }, 1023 {"swish" ,LLM_FFN_SWIGLU }, 1024 {"swiglu" ,LLM_FFN_SWIGLU }, 1025 {"relu" ,LLM_FFN_RELU }, 1026 {"reglu" ,LLM_FFN_REGLU }, 1027}; 1028 1029llm_ffn_op_type llm_ffn_op_type_from_string (const std::string & name ,llm_ffn_op_type fallback ) { 1030const auto it = LLM_FFN_OP_TYPES_FROM_STRING .find (name ); 1031if (it != LLM_FFN_OP_TYPES_FROM_STRING .end ()) { 1032return it -> second ; 1033 } 1034return fallback ; 1035} 1036 1037// CPU: ACCEL -> GPU host -> CPU extra -> CPU 1038static buft_list_t make_cpu_buft_list (const std::vector < llama_device > & devices ,bool use_extra_bufts ,bool no_host ) { 1039buft_list_t buft_list ; 1040 1041// add ACCEL buffer types 1042for (size_t i = 0 ;i < ggml_backend_dev_count ();++ i ) { 1043ggml_backend_dev_t dev = ggml_backend_dev_get (i ); 1044if (ggml_backend_dev_type (dev )== GGML_BACKEND_DEVICE_TYPE_ACCEL ) { 1045auto * buft = ggml_backend_dev_buffer_type (dev ); 1046// skip 1047if (buft != ggml_backend_cpu_buffer_type ()) { 1048buft_list .emplace_back (dev ,buft ); 1049 } 1050 } 1051 } 1052 1053// add a host buffer type 1054// storing the tensors in a host buffer is useful when the processing of large batches 1055// is offloaded to a GPU device, since it reduces the time spent on data transfers 1056// generally, this will be done using the first device in the list 1057// a better approach would be to handle this on a weight-by-weight basis using the offload_op 1058// function of the device to determine if it would benefit from being stored in a host buffer 1059if (!no_host ) { 1060for (const auto & dev :devices ) { 1061ggml_backend_buffer_type_t buft = ggml_backend_dev_host_buffer_type (dev .dev ); 1062if (buft ) { 1063buft_list .emplace_back (dev .dev ,buft ); 1064break ; 1065 } 1066 } 1067 } 1068 1069// add extra buffer types 1070if (use_extra_bufts ) { 1071auto * cpu_dev = ggml_backend_dev_by_type (GGML_BACKEND_DEVICE_TYPE_CPU ); 1072if (cpu_dev == nullptr ) { 1073throw std::runtime_error (format ("%s: no CPU backend found" ,__func__ )); 1074 } 1075 1076auto * cpu_reg = ggml_backend_dev_backend_reg (cpu_dev ); 1077auto ggml_backend_dev_get_extra_bufts_fn = (ggml_backend_dev_get_extra_bufts_t ) 1078ggml_backend_reg_get_proc_address (cpu_reg ,"ggml_backend_dev_get_extra_bufts" ); 1079if (ggml_backend_dev_get_extra_bufts_fn ) { 1080ggml_backend_buffer_type_t * extra_bufts = ggml_backend_dev_get_extra_bufts_fn (cpu_dev ); 1081while (extra_bufts && * extra_bufts ) { 1082buft_list .emplace_back (cpu_dev ,* extra_bufts ); 1083++ extra_bufts ; 1084 } 1085 } 1086 } 1087 1088// add the CPU buffer type 1089for (size_t i = 0 ;i < ggml_backend_dev_count ();++ i ) { 1090ggml_backend_dev_t dev = ggml_backend_dev_get (i ); 1091if (ggml_backend_dev_type (dev )== GGML_BACKEND_DEVICE_TYPE_CPU ) { 1092buft_list .emplace_back (dev ,ggml_backend_dev_buffer_type (dev )); 1093 } 1094 } 1095 1096return buft_list ; 1097} 1098 1099// GPU: split if LLAMA_SPLIT_MODE_ROW -> GPU 1100static buft_list_t make_gpu_buft_list (ggml_backend_dev_t dev ,llama_split_mode split_mode ,const float * tensor_split ) { 1101buft_list_t buft_list ; 1102 1103// add the device split buffer type if requested and available 1104if (split_mode == LLAMA_SPLIT_MODE_ROW ) { 1105ggml_backend_reg_t reg = ggml_backend_dev_backend_reg (dev ); 1106auto ggml_backend_split_buffer_type_fn = (ggml_backend_split_buffer_type_t ) 1107ggml_backend_reg_get_proc_address (reg ,"ggml_backend_split_buffer_type" ); 1108if (ggml_backend_split_buffer_type_fn ) { 1109size_t dev_index = [& ]() { 1110auto * reg = ggml_backend_dev_backend_reg (dev ); 1111for (size_t i = 0 ;i < ggml_backend_reg_dev_count (reg );++ i ) { 1112if (ggml_backend_reg_dev_get (reg ,i )== dev ) { 1113return i ; 1114 } 1115 } 1116throw std::runtime_error (format ("device %s not found in its backend reg" ,ggml_backend_dev_name (dev ))); 1117 }(); 1118auto * buft = ggml_backend_split_buffer_type_fn (dev_index ,tensor_split ); 1119if (buft != nullptr ) { 1120buft_list .emplace_back (dev ,buft ); 1121 } 1122 }else { 1123throw std::runtime_error (format ("device %s does not support split buffers" ,ggml_backend_dev_name (dev ))); 1124 } 1125 } 1126 1127// add the device default buffer type 1128buft_list .emplace_back (dev ,ggml_backend_dev_buffer_type (dev )); 1129 1130// add the device extra buffer type (if any) 1131ggml_backend_reg_t reg = ggml_backend_dev_backend_reg (dev ); 1132if (reg ) { 1133auto ggml_backend_dev_get_extra_bufts_fn = (ggml_backend_dev_get_extra_bufts_t ) 1134ggml_backend_reg_get_proc_address (reg ,"ggml_backend_dev_get_extra_bufts" ); 1135 1136if (ggml_backend_dev_get_extra_bufts_fn ) { 1137ggml_backend_buffer_type_t * extra_bufts = ggml_backend_dev_get_extra_bufts_fn (dev ); 1138while (extra_bufts && * extra_bufts ) { 1139buft_list .emplace_back (dev ,* extra_bufts ); 1140++ extra_bufts ; 1141 } 1142 } 1143 } 1144 1145return buft_list ; 1146} 1147 1148struct llama_model::impl { 1149impl ()= default ; 1150 ~impl ()= default ; 1151 1152uint64_t n_elements = 0 ; 1153 1154size_t n_bytes = 0 ; 1155 1156 std::string desc_str ; 1157 1158llama_ftype ftype = LLAMA_FTYPE_ALL_F32 ; 1159 1160// model memory mapped files 1161llama_mmaps mappings ; 1162 1163// objects representing data potentially being locked in memory 1164llama_mlocks mlock_bufs ; 1165llama_mlocks mlock_mmaps ; 1166 1167// contexts where the model tensors metadata is stored as well as the corresponding buffers: 1168 std::vector < std::pair < ggml_context_ptr , std::vector < ggml_backend_buffer_ptr >>> ctxs_bufs ; 1169 1170buft_list_t cpu_buft_list ; 1171 std::map < ggml_backend_dev_t ,buft_list_t > gpu_buft_list ; 1172 1173struct layer_dev { 1174ggml_backend_dev_t dev ; 1175buft_list_t * buft_list ; 1176 }; 1177 1178layer_dev dev_input = {}; 1179layer_dev dev_output = {}; 1180 std::vector < layer_dev > dev_layer ; 1181 1182bool has_tensor_overrides ; 1183 1184 std::vector < float > tensor_split_owned ; 1185}; 1186 1187llama_model::llama_model (const llama_model_params & params ) :params (params ),pimpl (std::make_unique < impl > ()) { 1188if (params .tensor_split != nullptr ) { 1189// llama_model_params stores tensor_split as a borrowed pointer, but the model 1190// may need it later for tensor-parallel KV-cache split metadata. 1191pimpl -> tensor_split_owned .assign (params .tensor_split ,params .tensor_split + llama_max_devices ()); 1192this -> params .tensor_split = pimpl -> tensor_split_owned .data (); 1193 } 1194pimpl -> has_tensor_overrides = params .tensor_buft_overrides && params .tensor_buft_overrides [0 ].pattern ; 1195} 1196 1197llama_model::~llama_model () { 1198for (auto * lora :loras ) { 1199delete lora ; 1200 } 1201} 1202 1203void llama_model_base::load_stats (llama_model_loader & ml ) { 1204pimpl -> n_elements = ml .n_elements ; 1205pimpl -> n_bytes = ml .n_bytes ; 1206} 1207 1208void llama_model_base::load_hparams (llama_model_loader & ml ) { 1209const gguf_context * ctx = ml .metadata ; 1210 1211// get metadata as string 1212for (int i = 0 ;i < gguf_get_n_kv (ctx );i ++ ) { 1213gguf_type type = gguf_get_kv_type (ctx ,i ); 1214if (type == GGUF_TYPE_ARRAY ) { 1215continue ; 1216 } 1217const char * name = gguf_get_key (ctx ,i ); 1218const std::string value = gguf_kv_to_str (ctx ,i ); 1219gguf_kv .emplace (name ,value ); 1220 } 1221 1222// get general kv 1223ml .get_key (LLM_KV_GENERAL_NAME ,name , false); 1224 1225// everything past this point is not vocab-related 1226// for CLIP models, we only need to load tensors, no hparams 1227if (hparams .vocab_only || ml .get_arch ()== LLM_ARCH_CLIP ) { 1228return ; 1229 } 1230 1231ml .get_key (LLM_KV_CONTEXT_LENGTH ,hparams .n_ctx_train ); 1232ml .get_key (LLM_KV_EMBEDDING_LENGTH ,hparams .n_embd ); 1233ml .get_key (LLM_KV_EMBEDDING_LENGTH_OUT ,hparams .n_embd_out_impl , false); 1234ml .get_key (LLM_KV_ATTENTION_CAUSAL ,hparams .causal_attn , false); 1235ml .get_key (LLM_KV_POOLING_TYPE ,hparams .pooling_type , false); 1236ml .get_key (LLM_KV_BLOCK_COUNT ,hparams .n_layer_all ); 1237GGML_ASSERT (hparams .n_layer_all > 0 && hparams .n_layer_all <=LLAMA_MAX_LAYERS ); 1238ml .get_key (LLM_KV_NEXTN_PREDICT_LAYERS ,hparams .n_layer_nextn , false); 1239GGML_ASSERT (hparams .n_layer_nextn <=hparams .n_layer_all ); 1240ml .get_key (LLM_KV_EXPERT_COUNT ,hparams .n_expert , false); 1241 std::fill (hparams .n_expert_used_arr .begin (),hparams .n_expert_used_arr .end (),0 ); 1242ml .get_key_or_arr (LLM_KV_EXPERT_USED_COUNT ,hparams .n_expert_used_arr ,hparams .n_layer_all , false); 1243ml .get_key (LLM_KV_EXPERT_GROUP_COUNT ,hparams .n_expert_groups , false); 1244ml .get_key (LLM_KV_EXPERT_GROUP_USED_COUNT ,hparams .n_group_used , false); 1245 1246if (arch == LLM_ARCH_HUNYUAN_VL || arch == LLM_ARCH_HUNYUAN_DENSE ) { 1247if (hparams .n_expert <=1 ) { 1248hparams .n_expert = 0 ; 1249 std::fill (hparams .n_expert_used_arr .begin (),hparams .n_expert_used_arr .end (),0 ); 1250 } 1251 } 1252 1253if (arch == LLM_ARCH_WAVTOKENIZER_DEC ) { 1254ml .get_key (LLM_KV_FEATURES_LENGTH ,hparams .n_embd ); 1255ml .get_key (LLM_KV_EMBEDDING_LENGTH ,hparams .n_embd_out_impl ); 1256 1257ml .get_key (LLM_KV_POSNET_EMBEDDING_LENGTH ,hparams .posnet .n_embd ); 1258ml .get_key (LLM_KV_POSNET_BLOCK_COUNT ,hparams .posnet .n_layer ); 1259 1260ml .get_key (LLM_KV_CONVNEXT_EMBEDDING_LENGTH ,hparams .convnext .n_embd ); 1261ml .get_key (LLM_KV_CONVNEXT_BLOCK_COUNT ,hparams .convnext .n_layer ); 1262 1263GGML_ASSERT (hparams .posnet .n_layer <=hparams .n_layer_all ); 1264GGML_ASSERT (hparams .convnext .n_layer <=hparams .n_layer_all ); 1265 } 1266 1267// models may route a different number of experts per layer, so validate the maximum 1268uint32_t n_expert_used_max = hparams .n_expert_used_max (); 1269 1270GGML_ASSERT (hparams .n_expert <=LLAMA_MAX_EXPERTS ); 1271GGML_ASSERT (n_expert_used_max <=hparams .n_expert ); 1272if (hparams .n_expert > 0 ) { 1273GGML_ASSERT (n_expert_used_max > 0 ); 1274GGML_ASSERT (hparams .n_expert_groups < hparams .n_expert ); 1275if (hparams .n_expert_groups > 1 ) { 1276GGML_ASSERT (hparams .n_expert %hparams .n_expert_groups == 0 ); 1277GGML_ASSERT (hparams .n_group_used > 0 ); 1278GGML_ASSERT (hparams .n_group_used < hparams .n_expert_groups ); 1279 } 1280 }else { 1281GGML_ASSERT (n_expert_used_max == 0 ); 1282GGML_ASSERT (hparams .n_expert_groups == 0 ); 1283 } 1284 1285 std::fill (hparams .n_head_arr .begin (),hparams .n_head_arr .end (),0 ); 1286 std::fill (hparams .n_head_kv_arr .begin (),hparams .n_head_kv_arr .end (),0 ); 1287 std::fill (hparams .n_ff_arr .begin (),hparams .n_ff_arr .end (),0 ); 1288 std::fill (hparams .n_ff_exp_arr .begin (),hparams .n_ff_exp_arr .end (),0 ); 1289 1290 std::fill (hparams .rope_sections .begin (),hparams .rope_sections .end (),0 ); 1291 std::fill (hparams .rope_pattern .begin (),hparams .rope_pattern .end (),1 ); 1292 std::fill (hparams .is_swa_impl .begin (),hparams .is_swa_impl .end (),0 ); 1293 std::fill (hparams .is_recr_impl .begin (),hparams .is_recr_impl .end (),llm_arch_is_recurrent (ml .get_arch ()) ?1 :0 ); 1294 std::fill (hparams .is_indexer_full_impl .begin (),hparams .is_indexer_full_impl .end (),0 ); 1295 1296 std::fill (hparams .xielu_alpha_n .begin (),hparams .xielu_alpha_n .end (),0.0f ); 1297 std::fill (hparams .xielu_alpha_p .begin (),hparams .xielu_alpha_p .end (),0.0f ); 1298 std::fill (hparams .xielu_beta .begin (),hparams .xielu_beta .end (),0.0f ); 1299 std::fill (hparams .xielu_eps .begin (),hparams .xielu_eps .end (),0.0f ); 1300 1301 std::fill (hparams .swiglu_clamp_exp .begin (),hparams .swiglu_clamp_exp .end (),0.0f ); 1302 std::fill (hparams .swiglu_clamp_shexp .begin (),hparams .swiglu_clamp_shexp .end (),0.0f ); 1303 1304ml .get_key_or_arr (LLM_KV_FEED_FORWARD_LENGTH ,hparams .n_ff_arr ,hparams .n_layer_all , false); 1305ml .get_key_or_arr (LLM_KV_ATTENTION_HEAD_COUNT ,hparams .n_head_arr ,hparams .n_layer_all , false); 1306 1307// Populate deepstack_mapping_arr - initialized to -1 (no deepstack) 1308 std::fill (hparams .deepstack_mapping_arr .begin (),hparams .deepstack_mapping_arr .end (),-1 ); 1309 1310// n_head_kv is optional, default to n_head 1311hparams .n_head_kv_arr = hparams .n_head_arr ; 1312 1313ml .get_key_or_arr (LLM_KV_ATTENTION_HEAD_COUNT_KV ,hparams .n_head_kv_arr ,hparams .n_layer_all , false); 1314 1315bool rope_finetuned = false; 1316ml .get_key (LLM_KV_ROPE_SCALING_FINETUNED ,rope_finetuned , false); 1317hparams .rope_finetuned = rope_finetuned ; 1318 1319hparams .n_ctx_orig_yarn = hparams .n_ctx_train ; 1320ml .get_key (LLM_KV_ROPE_SCALING_ORIG_CTX_LEN ,hparams .n_ctx_orig_yarn , false); 1321 1322// rope_freq_base (optional) 1323hparams .rope_freq_base_train = 10000.0f ; 1324ml .get_key (LLM_KV_ROPE_FREQ_BASE ,hparams .rope_freq_base_train , false); 1325 1326 std::string rope_scaling ("linear" ); 1327ml .get_key (LLM_KV_ROPE_SCALING_TYPE ,rope_scaling , false); 1328hparams .rope_scaling_type_train = llama_rope_scaling_type_from_string (rope_scaling ); 1329GGML_ASSERT (hparams .rope_scaling_type_train != LLAMA_ROPE_SCALING_TYPE_UNSPECIFIED ); 1330 1331// TODO: Handle SWA metadata similarly when models start implementing it 1332// rope_freq_scale (inverse of the kv) is optional 1333float ropescale = 0.0f ; 1334if (!ml .get_key (LLM_KV_ROPE_SCALING_FACTOR ,ropescale , false)) { 1335// try the old key name 1336ml .get_key (LLM_KV_ROPE_SCALE_LINEAR ,ropescale , false); 1337 } 1338hparams .rope_freq_scale_train = ropescale == 0.0f ?1.0f :1.0f /ropescale ; 1339 1340ml .get_key (LLM_KV_ROPE_SCALING_ATTN_FACTOR ,hparams .rope_attn_factor , false); 1341ml .get_key (LLM_KV_ROPE_SCALING_ALPHA ,hparams .rope_scaling_alpha , false); 1342 1343// non-transformer models do not have attention heads 1344if (hparams .n_head ()> 0 ) { 1345// gpt-neox n_rot = rotary_pct * (n_embd / n_head) 1346// gpt-j n_rot = rotary_dim 1347 1348hparams .n_embd_head_k_full = hparams .n_embd /hparams .n_head (); 1349ml .get_key (LLM_KV_ATTENTION_KEY_LENGTH ,hparams .n_embd_head_k_full , false); 1350 1351hparams .n_embd_head_v_full = hparams .n_embd /hparams .n_head (); 1352ml .get_key (LLM_KV_ATTENTION_VALUE_LENGTH ,hparams .n_embd_head_v_full , false); 1353 1354// sanity check for n_rot (optional) 1355hparams .n_rot_full = hparams .n_embd_head_k_full ; 1356 1357ml .get_key (LLM_KV_ROPE_DIMENSION_COUNT ,hparams .n_rot_full , false); 1358 1359if (arch == LLM_ARCH_LLAMA || arch == LLM_ARCH_DECI || arch == LLM_ARCH_FALCON || arch == LLM_ARCH_LLAMA_EMBED ) { 1360if (hparams .n_rot_full != hparams .n_embd_head_k_full ) { 1361throw std::runtime_error (format ("invalid n_rot: %u, expected %u" ,hparams .n_rot_full ,hparams .n_embd_head_k_full )); 1362 } 1363 } 1364 }else { 1365hparams .n_rot_full = 0 ; 1366hparams .n_embd_head_k_full = 0 ; 1367hparams .n_embd_head_v_full = 0 ; 1368 } 1369 1370// head size and n_rot for SWA layers 1371 { 1372hparams .n_embd_head_k_swa = hparams .n_embd_head_k_full ; 1373hparams .n_embd_head_v_swa = hparams .n_embd_head_v_full ; 1374ml .get_key (LLM_KV_ATTENTION_KEY_LENGTH_SWA ,hparams .n_embd_head_k_swa , false); 1375ml .get_key (LLM_KV_ATTENTION_VALUE_LENGTH_SWA ,hparams .n_embd_head_v_swa , false); 1376 1377hparams .n_rot_swa = hparams .n_rot_full ; 1378ml .get_key (LLM_KV_ROPE_DIMENSION_COUNT_SWA ,hparams .n_rot_swa , false); 1379 } 1380 1381// for classifier models 1382ml .get_arr (LLM_KV_CLASSIFIER_OUTPUT_LABELS ,classifier_labels , false); 1383if (!classifier_labels .empty ()) { 1384hparams .n_cls_out = classifier_labels .size (); 1385 } 1386 1387// per-arch hparams 1388load_arch_hparams (ml ); 1389 1390pimpl -> n_bytes = ml .n_bytes ; 1391 1392pimpl -> desc_str = arch_name ()+ " " + type_name ()+ " " + ml .ftype_name (); 1393 1394pimpl -> ftype = ml .ftype ; 1395 1396if (hparams .f_max_alibi_bias > 0.0f ) { 1397hparams .use_alibi = true; 1398 } 1399 1400hparams .rope_type = llama_model_rope_type (this ); 1401} 1402 1403void llama_model_base::load_vocab (llama_model_loader & ml ) { 1404const auto kv = LLM_KV (arch ); 1405 1406vocab .load (ml ,kv ); 1407} 1408 1409bool llama_model_base::load_tensors (llama_model_loader & ml ) { 1410const auto & split_mode = params .split_mode ; 1411const bool use_mlock = params .load_mode == LLAMA_LOAD_MODE_MLOCK || params .load_mode == LLAMA_LOAD_MODE_MMAP_MLOCK ; 1412const auto & tensor_split = params .tensor_split ; 1413 1414const int n_layer_all = hparams .n_layer_all ; 1415const int n_gpu_layers = this -> n_gpu_layers (); 1416 1417const bool use_mmap_buffer = true; 1418 1419this -> ml = & ml ;// to be used by create_tensor() and load_arch_tensors() 1420 1421if (ml .use_mmap && params .load_mode == LLAMA_LOAD_MODE_AUTO ) { 1422for (const auto & dev :devices ) { 1423ggml_backend_dev_props props ; 1424ggml_backend_dev_get_props (dev .dev ,& props ); 1425if (!props .caps .mmap_support ) { 1426ml .use_mmap = false; 1427break ; 1428 } 1429 } 1430 } 1431 1432// resolve AUTO on systems without mmap support (e.g. iGPUs): fall back to OFF; see #28160 1433if (ml .lazy .mode == LLAMA_LAZY_MODE_AUTO ) { 1434for (const auto & dev :devices ) { 1435ggml_backend_dev_props props ; 1436ggml_backend_dev_get_props (dev .dev ,& props ); 1437if (!props .caps .mmap_support ) { 1438ml .lazy .mode = LLAMA_LAZY_MODE_OFF ; 1439break ; 1440 } 1441 } 1442 } 1443 1444const char * load_mode_name = params .load_mode == LLAMA_LOAD_MODE_AUTO 1445 ?llama_load_mode_name (ml .use_mmap ?LLAMA_LOAD_MODE_MMAP :LLAMA_LOAD_MODE_NONE ) 1446 :llama_load_mode_name (params .load_mode ); 1447 1448LLAMA_LOG_INFO ("%s: loading model tensors, this can take a while... (load_mode = %s)\n" , 1449__func__ ,load_mode_name ); 1450 1451// build a list of buffer types for the CPU and GPU devices 1452pimpl -> cpu_buft_list = make_cpu_buft_list (devices ,params .use_extra_bufts ,params .no_host ); 1453for (const auto & dev :devices ) { 1454buft_list_t buft_list = make_gpu_buft_list (dev .dev ,split_mode ,tensor_split ); 1455// add CPU buffer types as a fallback 1456buft_list .insert (buft_list .end (),pimpl -> cpu_buft_list .begin (),pimpl -> cpu_buft_list .end ()); 1457pimpl -> gpu_buft_list .emplace (dev .dev , std::move (buft_list )); 1458 } 1459 1460ggml_backend_dev_t cpu_dev = ggml_backend_dev_by_type (GGML_BACKEND_DEVICE_TYPE_CPU ); 1461if (cpu_dev == nullptr ) { 1462throw std::runtime_error (format ("%s: no CPU backend found" ,__func__ )); 1463 } 1464 1465// calculate the split points 1466bool all_zero = tensor_split == nullptr || std::all_of (tensor_split ,tensor_split + n_devices (), [](float x ) {return x == 0.0f ; }); 1467 std::vector < float > splits (n_devices ()); 1468if (all_zero ) { 1469// default split, by free memory 1470for (size_t i = 0 ;i < n_devices ();++ i ) { 1471ggml_backend_dev_t dev = devices [i ].dev ; 1472size_t total ; 1473size_t free ; 1474ggml_backend_dev_memory (dev ,& free ,& total ); 1475 1476// devices can return 0 bytes for free and total memory if they do not 1477// have any to report. in this case, we will use the host memory as a fallback 1478// fixes: https://github.com/ggml-org/llama.cpp/issues/18577 1479if (free == 0 && total == 0 ) { 1480ggml_backend_dev_memory (cpu_dev ,& free ,& total ); 1481 } 1482splits [i ]= free ; 1483 } 1484 }else { 1485 std::copy (tensor_split ,tensor_split + n_devices (),splits .begin ()); 1486 } 1487 1488// sum and normalize the splits to get the split points 1489float split_sum = 0.0f ; 1490for (size_t i = 0 ;i < n_devices ();++ i ) { 1491split_sum += splits [i ]; 1492splits [i ]= split_sum ; 1493 } 1494for (size_t i = 0 ;i < n_devices ();++ i ) { 1495splits [i ] /=split_sum ; 1496 } 1497 1498const int i_gpu_start = std::max (n_layer_all + 1 - n_gpu_layers ,0 ); 1499const int act_gpu_layers = devices .empty () ?0 : std::min (n_gpu_layers ,n_layer_all + 1 ); 1500auto get_layer_buft_list = [& ](int il )-> llama_model::impl::layer_dev { 1501const bool is_swa = il < n_layer_all && hparams .is_swa (il ); 1502if (il < i_gpu_start || (il - i_gpu_start ) >=act_gpu_layers ) { 1503LLAMA_LOG_DEBUG ("load_tensors: layer %3d assigned to device %s, is_swa = %d\n" ,il ,ggml_backend_dev_name (cpu_dev ),is_swa ); 1504return {cpu_dev ,& pimpl -> cpu_buft_list }; 1505 } 1506const int layer_gpu = std::upper_bound (splits .begin (),splits .begin ()+ n_devices (),float (il - i_gpu_start )/act_gpu_layers )- splits .begin (); 1507auto * dev = devices .at (layer_gpu ).dev ; 1508LLAMA_LOG_DEBUG ("load_tensors: layer %3d assigned to device %s, is_swa = %d\n" ,il ,ggml_backend_dev_name (dev ),is_swa ); 1509return {dev ,& pimpl -> gpu_buft_list .at (dev )}; 1510 }; 1511 1512// assign the input layer 1513// there is very little benefit to offloading the input layer, so always keep it on the CPU 1514pimpl -> dev_input = {cpu_dev ,& pimpl -> cpu_buft_list }; 1515 1516// assign the repeating layers to the devices according to the splits 1517pimpl -> dev_layer .resize (n_layer_all ); 1518for (int il = 0 ;il < n_layer_all ;++ il ) { 1519pimpl -> dev_layer [il ]= get_layer_buft_list (il ); 1520 } 1521 1522// assign the output layer 1523pimpl -> dev_output = get_layer_buft_list (n_layer_all ); 1524 1525const auto TENSOR_NOT_REQUIRED = llama_model_loader::TENSOR_NOT_REQUIRED ; 1526 1527// create tensors for the weights 1528 { 1529// TODO: move to a separate function 1530const auto tn = LLM_TN (arch ); 1531 1532const int64_t n_expert = hparams .n_expert ; 1533 1534if (n_expert > 0 && hparams .n_expert_used_max ()== 0 ) { 1535throw std::runtime_error ("model has expert layers but no expert layers are used" ); 1536 } 1537 1538layers .resize (n_layer_all ); 1539 1540// call the per-model loading function 1541load_arch_tensors (ml ); 1542 1543// generic pass: load optional per-tensor/per-expert ".scale" tensors (e.g. NVFP4 scale2) 1544// this avoids having to add scale loading to every architecture 1545for (int i = 0 ;i < n_layer_all ;++ i ) { 1546auto & layer = layers [i ]; 1547 1548// attention weight scales (per-tensor, shape {1}) 1549if (!layer .wq_s && layer .wq ) { 1550layer .wq_s = create_tensor (tn (LLM_TENSOR_ATTN_Q ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1551 } 1552if (!layer .wk_s && layer .wk ) { 1553layer .wk_s = create_tensor (tn (LLM_TENSOR_ATTN_K ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1554 } 1555if (!layer .wv_s && layer .wv ) { 1556layer .wv_s = create_tensor (tn (LLM_TENSOR_ATTN_V ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1557 } 1558if (!layer .wo_s && layer .wo ) { 1559layer .wo_s = create_tensor (tn (LLM_TENSOR_ATTN_OUT ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1560 } 1561if (!layer .wqkv_s && layer .wqkv ) { 1562layer .wqkv_s = create_tensor (tn (LLM_TENSOR_ATTN_QKV ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1563 } 1564if (!layer .wqkv_gate_s && layer .wqkv_gate ) { 1565layer .wqkv_gate_s = create_tensor (tn (LLM_TENSOR_ATTN_GATE ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1566 } 1567 1568// dense FFN weight scales (per-tensor, shape {1}) 1569if (!layer .ffn_gate_s && layer .ffn_gate ) { 1570layer .ffn_gate_s = create_tensor (tn (LLM_TENSOR_FFN_GATE ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1571 } 1572if (!layer .ffn_down_s && layer .ffn_down ) { 1573layer .ffn_down_s = create_tensor (tn (LLM_TENSOR_FFN_DOWN ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1574 } 1575if (!layer .ffn_up_s && layer .ffn_up ) { 1576layer .ffn_up_s = create_tensor (tn (LLM_TENSOR_FFN_UP ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1577 } 1578if (!layer .ffn_gate_shexp_s && layer .ffn_gate_shexp ) { 1579layer .ffn_gate_shexp_s = create_tensor (tn (LLM_TENSOR_FFN_GATE_SHEXP ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1580 } 1581if (!layer .ffn_down_shexp_s && layer .ffn_down_shexp ) { 1582layer .ffn_down_shexp_s = create_tensor (tn (LLM_TENSOR_FFN_DOWN_SHEXP ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1583 } 1584if (!layer .ffn_up_shexp_s && layer .ffn_up_shexp ) { 1585layer .ffn_up_shexp_s = create_tensor (tn (LLM_TENSOR_FFN_UP_SHEXP ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1586 } 1587 1588// MoE expert weight scales (per-expert, shape {n_expert}) 1589if (!layer .ffn_gate_exps_s && layer .ffn_gate_exps ) { 1590layer .ffn_gate_exps_s = create_tensor (tn (LLM_TENSOR_FFN_GATE_EXPS ,"scale" ,i ), {n_expert },TENSOR_NOT_REQUIRED ); 1591 } 1592if (!layer .ffn_down_exps_s && layer .ffn_down_exps ) { 1593layer .ffn_down_exps_s = create_tensor (tn (LLM_TENSOR_FFN_DOWN_EXPS ,"scale" ,i ), {n_expert },TENSOR_NOT_REQUIRED ); 1594 } 1595if (!layer .ffn_up_exps_s && layer .ffn_up_exps ) { 1596layer .ffn_up_exps_s = create_tensor (tn (LLM_TENSOR_FFN_UP_EXPS ,"scale" ,i ), {n_expert },TENSOR_NOT_REQUIRED ); 1597 } 1598 1599// recurrent / linear-attention weight scales (per-tensor, shape {1}) 1600if (!layer .ssm_in_s && layer .ssm_in ) { 1601layer .ssm_in_s = create_tensor (tn (LLM_TENSOR_SSM_IN ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1602 } 1603if (!layer .ssm_out_s && layer .ssm_out ) { 1604layer .ssm_out_s = create_tensor (tn (LLM_TENSOR_SSM_OUT ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1605 } 1606if (!layer .ssm_alpha_s && layer .ssm_alpha ) { 1607layer .ssm_alpha_s = create_tensor (tn (LLM_TENSOR_SSM_ALPHA ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1608 } 1609if (!layer .ssm_beta_s && layer .ssm_beta ) { 1610layer .ssm_beta_s = create_tensor (tn (LLM_TENSOR_SSM_BETA ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1611 } 1612if (!layer .nextn .eh_proj_s && layer .nextn .eh_proj ) { 1613layer .nextn .eh_proj_s = create_tensor (tn (LLM_TENSOR_NEXTN_EH_PROJ ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1614 } 1615if (!layer .nextn .shared_head_head_s && layer .nextn .shared_head_head ) { 1616layer .nextn .shared_head_head_s = create_tensor (tn (LLM_TENSOR_NEXTN_SHARED_HEAD_HEAD ,"scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1617 } 1618 1619// input scales 1620if (!layer .wq_in_s && layer .wq ) { 1621layer .wq_in_s = create_tensor (tn (LLM_TENSOR_ATTN_Q ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1622 } 1623if (!layer .wk_in_s && layer .wk ) { 1624layer .wk_in_s = create_tensor (tn (LLM_TENSOR_ATTN_K ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1625 } 1626if (!layer .wv_in_s && layer .wv ) { 1627layer .wv_in_s = create_tensor (tn (LLM_TENSOR_ATTN_V ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1628 } 1629if (!layer .wo_in_s && layer .wo ) { 1630layer .wo_in_s = create_tensor (tn (LLM_TENSOR_ATTN_OUT ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1631 } 1632if (!layer .wqkv_in_s && layer .wqkv ) { 1633layer .wqkv_in_s = create_tensor (tn (LLM_TENSOR_ATTN_QKV ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1634 } 1635if (!layer .wqkv_gate_in_s && layer .wqkv_gate ) { 1636layer .wqkv_gate_in_s = create_tensor (tn (LLM_TENSOR_ATTN_GATE ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1637 } 1638if (!layer .ffn_gate_in_s && layer .ffn_gate ) { 1639layer .ffn_gate_in_s = create_tensor (tn (LLM_TENSOR_FFN_GATE ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1640 } 1641if (!layer .ffn_down_in_s && layer .ffn_down ) { 1642layer .ffn_down_in_s = create_tensor (tn (LLM_TENSOR_FFN_DOWN ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1643 } 1644if (!layer .ffn_up_in_s && layer .ffn_up ) { 1645layer .ffn_up_in_s = create_tensor (tn (LLM_TENSOR_FFN_UP ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1646 } 1647if (!layer .ffn_gate_exps_in_s && layer .ffn_gate_exps ) { 1648layer .ffn_gate_exps_in_s = create_tensor (tn (LLM_TENSOR_FFN_GATE_EXPS ,"input_scale" ,i ), {n_expert },TENSOR_NOT_REQUIRED ); 1649 } 1650if (!layer .ffn_down_exps_in_s && layer .ffn_down_exps ) { 1651layer .ffn_down_exps_in_s = create_tensor (tn (LLM_TENSOR_FFN_DOWN_EXPS ,"input_scale" ,i ), {n_expert },TENSOR_NOT_REQUIRED ); 1652 } 1653if (!layer .ffn_up_exps_in_s && layer .ffn_up_exps ) { 1654layer .ffn_up_exps_in_s = create_tensor (tn (LLM_TENSOR_FFN_UP_EXPS ,"input_scale" ,i ), {n_expert },TENSOR_NOT_REQUIRED ); 1655 } 1656if (!layer .ffn_gate_shexp_in_s && layer .ffn_gate_shexp ) { 1657layer .ffn_gate_shexp_in_s = create_tensor (tn (LLM_TENSOR_FFN_GATE_SHEXP ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1658 } 1659if (!layer .ffn_down_shexp_in_s && layer .ffn_down_shexp ) { 1660layer .ffn_down_shexp_in_s = create_tensor (tn (LLM_TENSOR_FFN_DOWN_SHEXP ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1661 } 1662if (!layer .ffn_up_shexp_in_s && layer .ffn_up_shexp ) { 1663layer .ffn_up_shexp_in_s = create_tensor (tn (LLM_TENSOR_FFN_UP_SHEXP ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1664 } 1665if (!layer .ssm_in_in_s && layer .ssm_in ) { 1666layer .ssm_in_in_s = create_tensor (tn (LLM_TENSOR_SSM_IN ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1667 } 1668if (!layer .ssm_out_in_s && layer .ssm_out ) { 1669layer .ssm_out_in_s = create_tensor (tn (LLM_TENSOR_SSM_OUT ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1670 } 1671if (!layer .ssm_alpha_in_s && layer .ssm_alpha ) { 1672layer .ssm_alpha_in_s = create_tensor (tn (LLM_TENSOR_SSM_ALPHA ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1673 } 1674if (!layer .ssm_beta_in_s && layer .ssm_beta ) { 1675layer .ssm_beta_in_s = create_tensor (tn (LLM_TENSOR_SSM_BETA ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1676 } 1677if (!layer .nextn .eh_proj_in_s && layer .nextn .eh_proj ) { 1678layer .nextn .eh_proj_in_s = create_tensor (tn (LLM_TENSOR_NEXTN_EH_PROJ ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1679 } 1680if (!layer .nextn .shared_head_head_in_s && layer .nextn .shared_head_head ) { 1681layer .nextn .shared_head_head_in_s = create_tensor (tn (LLM_TENSOR_NEXTN_SHARED_HEAD_HEAD ,"input_scale" ,i ), {1 },TENSOR_NOT_REQUIRED ); 1682 } 1683 } 1684// output scales 1685if (output && output -> type == GGML_TYPE_NVFP4 ) { 1686// weight scale 1687if (!output_s ) { 1688output_s = create_tensor (tn (LLM_TENSOR_OUTPUT ,"scale" ), {1 },TENSOR_NOT_REQUIRED ); 1689 } 1690// input scale 1691if (!output_in_s ) { 1692output_in_s = create_tensor (tn (LLM_TENSOR_OUTPUT ,"input_scale" ), {1 },TENSOR_NOT_REQUIRED ); 1693 } 1694 } 1695 } 1696ml .done_getting_tensors (); 1697 1698// Tied NVFP4 output is valid when no separate LM-head scale tensors are present. 1699// If sidecar scales exist, the output weight must be an actual output tensor. 1700GGML_ASSERT (!(output && tok_embd && 1701strcmp (output -> name ,tok_embd -> name )== 0 && 1702output -> type == GGML_TYPE_NVFP4 && 1703 (output_s || output_in_s ))); 1704// populate tensors_by_name 1705for (auto & [_ ,ctx_ptr ] :ml .ctx_map ) { 1706for (auto * cur = ggml_get_first_tensor (ctx_ptr .get ());cur != NULL ;cur = ggml_get_next_tensor (ctx_ptr .get (),cur )) { 1707tensors_by_name .emplace_back (ggml_get_name (cur ),cur ); 1708 } 1709 } 1710 1711ml .init_mappings (true,use_mlock ?& pimpl -> mlock_mmaps :nullptr ); 1712pimpl -> mappings .reserve (ml .mappings .size ()); 1713 1714// create the backend buffers 1715 std::vector < std::pair < ggml_context * ,llama_buf_map >> ctx_buf_maps ; 1716ctx_buf_maps .reserve (ml .ctx_map .size ()); 1717 1718// Ensure we have enough capacity for the maximum backend buffer we will potentially create 1719const size_t n_max_backend_buffer = ml .ctx_map .size ()* ml .files .size (); 1720pimpl -> ctxs_bufs .reserve (n_max_backend_buffer ); 1721 1722for (auto & [ctx_key ,ctx_ptr ] :ml .ctx_map ) { 1723ggml_backend_buffer_type_t buft = ctx_key .buft ; 1724ggml_context * ctx = ctx_ptr .get (); 1725 1726// skip contexts without tensors 1727if (ggml_get_first_tensor (ctx )== nullptr ) { 1728continue ; 1729 } 1730 1731llama_buf_map buf_map ; 1732buf_map .reserve (n_max_backend_buffer ); 1733 1734// check if it is possible to use buffer_from_host_ptr with this buffer type 1735ggml_backend_dev_t dev = ggml_backend_buft_get_device (buft ); 1736if (!dev ) { 1737// FIXME: workaround for CPU backend buft having a NULL device 1738dev = ggml_backend_dev_by_type (GGML_BACKEND_DEVICE_TYPE_CPU ); 1739if (!dev ) { 1740throw std::runtime_error (format ("%s: no CPU backend found" ,__func__ )); 1741 } 1742 } 1743ggml_backend_dev_props props ; 1744ggml_backend_dev_get_props (dev ,& props ); 1745bool buffer_from_host_ptr_supported = props .caps .buffer_from_host_ptr ; 1746bool is_default_buft = buft == ggml_backend_dev_buffer_type (dev ); 1747 1748 std::vector < ggml_backend_buffer_ptr > bufs ; 1749 1750// a lazy context is mapped whatever the load mode, but the memory-fit pass maps nothing 1751const bool is_lazy_mapped = ctx_key .lazy && !ml .no_alloc ; 1752 1753if ((ml .use_mmap || is_lazy_mapped )&& use_mmap_buffer && buffer_from_host_ptr_supported && is_default_buft ) { 1754GGML_ASSERT (!ml .no_alloc ); 1755for (uint32_t idx = 0 ;idx < ml .files .size ();idx ++ ) { 1756// only the mmap region containing the tensors in the model is mapped to the backend buffer 1757// this is important for metal with apple silicon: if the entire model could be mapped to a metal buffer, 1758// then we could just use metal for all layers 1759// this allows using partial offloading when the model size exceeds the metal buffer size, but not the RAM size 1760void * addr = nullptr ; 1761size_t first ,last ;// NOLINT 1762ml .get_mapping_range (& first ,& last ,& addr ,idx ,ctx ); 1763if (first >=last ) { 1764continue ; 1765 } 1766const size_t max_size = ggml_get_max_tensor_size (ctx ); 1767ggml_backend_buffer_t buf = ggml_backend_dev_buffer_from_host_ptr (dev , (char * )addr + first ,last - first ,max_size ); 1768if (buf == nullptr ) { 1769throw std::runtime_error (format ("unable to allocate %s buffer" ,ggml_backend_buft_name (buft ))); 1770 } 1771bufs .emplace_back (buf ); 1772buf_map .emplace (idx ,buf ); 1773 } 1774 }else { 1775ggml_backend_buffer_t buf ; 1776if (ml .no_alloc ) { 1777buf = ggml_backend_buft_alloc_buffer (buft ,/*size =*/ 0 );// dummy buffer 1778for (ggml_tensor * t = ggml_get_first_tensor (ctx );t != nullptr ;t = ggml_get_next_tensor (ctx ,t )) { 1779t -> buffer = buf ;// set dummy buffer for weights so that the backend scheduler won't try to allocate them 1780 } 1781 }else { 1782buf = ggml_backend_alloc_ctx_tensors_from_buft (ctx ,buft );// real buffer 1783 } 1784if (buf == nullptr ) { 1785throw std::runtime_error (format ("unable to allocate %s buffer" ,ggml_backend_buft_name (buft ))); 1786 } 1787if (use_mlock && ggml_backend_buffer_is_host (buf )) { 1788pimpl -> mlock_bufs .emplace_back (new llama_mlock ); 1789auto & mlock_buf = pimpl -> mlock_bufs .back (); 1790mlock_buf -> init (ggml_backend_buffer_get_base (buf )); 1791mlock_buf -> grow_to (ggml_backend_buffer_get_size (buf )); 1792 } 1793bufs .emplace_back (buf ); 1794for (uint32_t idx = 0 ;idx < ml .files .size ();idx ++ ) { 1795buf_map .emplace (idx ,buf ); 1796 } 1797 } 1798 1799for (auto & buf :bufs ) { 1800// indicate that this buffer contains weights 1801// this is used by ggml_backend_sched to improve op scheduling: ops that use a weight are preferably scheduled to the backend that contains the weight 1802ggml_backend_buffer_set_usage (buf .get (),GGML_BACKEND_BUFFER_USAGE_WEIGHTS ); 1803 } 1804 1805pimpl -> ctxs_bufs .emplace_back (std::move (ctx_ptr ), std::move (bufs )); 1806 1807ctx_buf_maps .emplace_back (ctx ,buf_map ); 1808 } 1809 1810if (llama_supports_gpu_offload ()) { 1811const int n_gpu = std::min (n_gpu_layers ,n_layer_all ); 1812 1813int n_repeating = n_gpu ; 1814if (n_repeating > 0 ) { 1815LLAMA_LOG_INFO ("%s: offloading output layer to GPU\n" ,__func__ ); 1816n_repeating -- ; 1817 } 1818LLAMA_LOG_INFO ("%s: offloading %d repeating layers to GPU\n" ,__func__ ,n_repeating ); 1819 1820const int max_backend_supported_layers = n_layer_all + 1 ; 1821const int max_offloadable_layers = n_layer_all + 1 ; 1822 1823LLAMA_LOG_INFO ("%s: offloaded %d/%d layers to GPU\n" ,__func__ , std::min (n_gpu_layers ,max_offloadable_layers ),max_backend_supported_layers ); 1824 } 1825 1826// print memory requirements per buffer type 1827for (auto & [_ ,bufs ] :pimpl -> ctxs_bufs ) { 1828for (auto & buf :bufs ) { 1829LLAMA_LOG_INFO ("%s: %12s model buffer size = %8.2f MiB\n" , 1830__func__ ,ggml_backend_buffer_name (buf .get ()),ggml_backend_buffer_get_size (buf .get ()) /1024.0 /1024.0 ); 1831 } 1832 } 1833 1834if (ml .no_alloc ) { 1835return true; 1836 } 1837 1838// without mmap, load non-host buffers first: their tensors go through a staging buffer, which is cheapest while the fewest weights are resident 1839if (!ml .use_mmap ) { 1840 std::stable_partition (ctx_buf_maps .begin (),ctx_buf_maps .end (), [](const auto & ctx_buf_map ) { 1841const auto & buf_map = ctx_buf_map .second ; 1842return !buf_map .empty ()&& !ggml_backend_buffer_is_host (buf_map .begin ()-> second ); 1843 }); 1844 } 1845 1846// load tensor data 1847for (auto & [ctx ,buf_map ] :ctx_buf_maps ) { 1848if (!ml .load_all_data (ctx ,buf_map ,use_mlock ?& pimpl -> mlock_mmaps :NULL ,params .progress_callback ,params .progress_callback_user_data )) { 1849return false; 1850 } 1851 } 1852 1853if (use_mmap_buffer ) { 1854for (auto & mapping :ml .mappings ) { 1855pimpl -> mappings .emplace_back (std::move (mapping )); 1856 } 1857 } 1858 1859return true; 1860} 1861 1862ggml_tensor * llama_model_base::create_tensor (llama_model_loader & ml ,const LLM_TN_IMPL & tn ,const std::initializer_list < int64_t > & ne ,int flags ) { 1863const buft_list_t * buft_list_layer = tn .bid == -1 ?nullptr :pimpl -> dev_layer .at (tn .bid ).buft_list ; 1864return ml .create_tensor ( 1865hparams ,& pimpl -> cpu_buft_list ,pimpl -> dev_input .buft_list ,pimpl -> dev_output .buft_list ,buft_list_layer , 1866tn ,ne ,flags ); 1867} 1868 1869std::string llama_model::arch_name ()const { 1870return llm_arch_name (arch ); 1871} 1872 1873std::string llama_model::type_name ()const { 1874return llm_type_name (type ); 1875} 1876 1877std::string llama_model::desc ()const { 1878return pimpl -> desc_str ; 1879} 1880 1881llama_ftype llama_model::ftype ()const { 1882return pimpl -> ftype ; 1883} 1884 1885size_t llama_model::size ()const { 1886return pimpl -> n_bytes ; 1887} 1888 1889size_t llama_model::n_tensors ()const { 1890return tensors_by_name .size (); 1891} 1892 1893size_t llama_model::n_devices ()const { 1894return devices .size (); 1895} 1896 1897const float * llama_model::tensor_split ()const { 1898return params .tensor_split ; 1899} 1900 1901uint32_t llama_model::n_gpu_layers ()const { 1902// note: plus 1 for the "output" layer 1903return params .n_gpu_layers >=0 ?params .n_gpu_layers :hparams .n_layer_all + 1 ; 1904} 1905 1906llama_split_mode llama_model::split_mode ()const { 1907return params .split_mode ; 1908} 1909 1910std::map < ggml_backend_buffer_type_t ,size_t > llama_model::memory_breakdown ()const { 1911 std::map < ggml_backend_buffer_type_t ,size_t > ret ; 1912for (const auto & [ctx ,bufs ] :pimpl -> ctxs_bufs ) { 1913if (hparams .no_alloc ) { 1914GGML_ASSERT (bufs .size ()== 1 ); 1915ggml_backend_buffer_t buf = bufs [0 ].get (); 1916GGML_ASSERT (ggml_backend_buffer_get_base (buf )== nullptr ); 1917ggml_backend_buffer_type_t buft = ggml_backend_buffer_get_type (buf ); 1918ret [buft ]+= ggml_backend_alloc_ctx_tensors_from_buft_size (ctx .get (),buft ); 1919 }else { 1920for (const auto & buf :bufs ) { 1921// GGML_ASSERT(ggml_backend_buffer_get_base(buf.get()) != nullptr); // multi_buffer does not have a defined base 1922ret [ggml_backend_buffer_get_type (buf .get ())]+= ggml_backend_buffer_get_size (buf .get ()); 1923 } 1924 } 1925 } 1926return ret ; 1927} 1928 1929uint64_t llama_model::n_elements ()const { 1930return pimpl -> n_elements ; 1931} 1932 1933void llama_model::print_info ()const { 1934const std::string rope_scaling_type = llama_rope_scaling_type_name (hparams .rope_scaling_type_train ); 1935 1936auto print_f = [](const std::function < int32_t (uint32_t )> & f ,uint32_t n ) { 1937bool is_var = false; 1938 1939 std::vector < int32_t > v ; 1940for (uint32_t i = 0 ;i < n ;++ i ) { 1941v .push_back (f (i )); 1942if (v [i ]!= v [0 ]) { 1943is_var = true; 1944 } 1945 } 1946 1947 std::stringstream ss ; 1948 1949if (is_var ) { 1950ss <<"[" ; 1951for (uint32_t i = 0 ;i < n ;++ i ) { 1952ss <<v [i ]; 1953if (i < n - 1 ) { 1954ss <<", " ; 1955 } 1956 } 1957ss <<"]" ; 1958 }else { 1959ss <<v [0 ]; 1960 } 1961 1962return ss .str (); 1963 }; 1964 1965// hparams 1966LLAMA_LOG_INFO ("%s: arch = %s\n" ,__func__ ,arch_name ().c_str ()); 1967LLAMA_LOG_INFO ("%s: vocab_only = %d\n" ,__func__ ,hparams .vocab_only ); 1968LLAMA_LOG_INFO ("%s: no_alloc = %d\n" ,__func__ ,hparams .no_alloc ); 1969 1970if (!hparams .vocab_only ) { 1971LLAMA_LOG_INFO ("%s: n_ctx_train = %u\n" ,__func__ ,hparams .n_ctx_train ); 1972LLAMA_LOG_INFO ("%s: n_embd_inp = %u\n" ,__func__ ,hparams .n_embd_inp ()); 1973LLAMA_LOG_INFO ("%s: n_embd = %u\n" ,__func__ ,hparams .n_embd ); 1974LLAMA_LOG_INFO ("%s: n_embd_out = %u\n" ,__func__ ,hparams .n_embd_out ()); 1975LLAMA_LOG_INFO ("%s: n_layer = %u\n" ,__func__ ,hparams .n_layer ()); 1976LLAMA_LOG_INFO ("%s: n_layer_all = %u\n" ,__func__ ,hparams .n_layer_all ); 1977LLAMA_LOG_INFO ("%s: n_head = %s\n" ,__func__ ,print_f ([& ](uint32_t il ) {return hparams .n_head (il ); },hparams .n_layer_all ).c_str ()); 1978LLAMA_LOG_INFO ("%s: n_head_kv = %s\n" ,__func__ ,print_f ([& ](uint32_t il ) {return hparams .n_head_kv (il ); },hparams .n_layer_all ).c_str ()); 1979LLAMA_LOG_INFO ("%s: n_rot = %u\n" ,__func__ ,hparams .n_rot_full ); 1980LLAMA_LOG_INFO ("%s: n_swa = %u\n" ,__func__ ,hparams .n_swa ); 1981LLAMA_LOG_INFO ("%s: is_swa_any = %u\n" ,__func__ ,hparams .is_swa_any ()); 1982LLAMA_LOG_INFO ("%s: non_causal_type = %d\n" ,__func__ ,hparams .non_causal_type ); 1983LLAMA_LOG_INFO ("%s: n_embd_head_k = %u\n" ,__func__ ,hparams .n_embd_head_k_full ); 1984LLAMA_LOG_INFO ("%s: n_embd_head_v = %u\n" ,__func__ ,hparams .n_embd_head_v_full ); 1985LLAMA_LOG_INFO ("%s: n_gqa = %s\n" ,__func__ ,print_f ([& ](uint32_t il ) {return hparams .n_gqa (il ); },hparams .n_layer_all ).c_str ()); 1986LLAMA_LOG_INFO ("%s: n_embd_k_gqa = %s\n" ,__func__ ,print_f ([& ](uint32_t il ) {return hparams .n_embd_k_gqa (il ); },hparams .n_layer_all ).c_str ()); 1987LLAMA_LOG_INFO ("%s: n_embd_v_gqa = %s\n" ,__func__ ,print_f ([& ](uint32_t il ) {return hparams .n_embd_v_gqa (il ); },hparams .n_layer_all ).c_str ()); 1988LLAMA_LOG_INFO ("%s: f_norm_eps = %.1e\n" ,__func__ ,hparams .f_norm_eps ); 1989LLAMA_LOG_INFO ("%s: f_norm_rms_eps = %.1e\n" ,__func__ ,hparams .f_norm_rms_eps ); 1990LLAMA_LOG_INFO ("%s: f_clamp_kqv = %.1e\n" ,__func__ ,hparams .f_clamp_kqv ); 1991LLAMA_LOG_INFO ("%s: f_max_alibi_bias = %.1e\n" ,__func__ ,hparams .f_max_alibi_bias ); 1992LLAMA_LOG_INFO ("%s: f_logit_scale = %.1e\n" ,__func__ ,hparams .f_logit_scale ); 1993LLAMA_LOG_INFO ("%s: f_attn_scale = %.1e\n" ,__func__ ,hparams .f_attention_scale ); 1994LLAMA_LOG_INFO ("%s: f_attn_value_scale = %.4f\n" ,__func__ ,hparams .f_attn_value_scale ); 1995LLAMA_LOG_INFO ("%s: n_ff = %s\n" ,__func__ ,print_f ([& ](uint32_t il ) {return hparams .n_ff (il ); },hparams .n_layer_all ).c_str ()); 1996LLAMA_LOG_INFO ("%s: n_expert = %u\n" ,__func__ ,hparams .n_expert ); 1997LLAMA_LOG_INFO ("%s: n_expert_used = %u\n" ,__func__ ,hparams .n_expert_used ()); 1998LLAMA_LOG_INFO ("%s: n_expert_groups = %d\n" ,__func__ ,hparams .n_expert_groups ); 1999LLAMA_LOG_INFO ("%s: n_group_used = %d\n" ,__func__ ,hparams .n_group_used ); 2000LLAMA_LOG_INFO ("%s: causal attn = %d\n" ,__func__ ,hparams .causal_attn ); 2001LLAMA_LOG_INFO ("%s: pooling type = %d\n" ,__func__ ,hparams .pooling_type ); 2002LLAMA_LOG_INFO ("%s: rope type = %d\n" ,__func__ ,hparams .rope_type ); 2003LLAMA_LOG_INFO ("%s: rope scaling = %s\n" ,__func__ ,rope_scaling_type .c_str ()); 2004LLAMA_LOG_INFO ("%s: freq_base_train = %.1f\n" ,__func__ ,hparams .rope_freq_base_train ); 2005LLAMA_LOG_INFO ("%s: freq_scale_train = %g\n" ,__func__ ,hparams .rope_freq_scale_train ); 2006if (hparams .swa_type != LLAMA_SWA_TYPE_NONE ) { 2007LLAMA_LOG_INFO ("%s: freq_base_swa = %.1f\n" ,__func__ ,hparams .rope_freq_base_train_swa ); 2008LLAMA_LOG_INFO ("%s: freq_scale_swa = %g\n" ,__func__ ,hparams .rope_freq_scale_train_swa ); 2009LLAMA_LOG_INFO ("%s: n_embd_head_k_swa = %u\n" ,__func__ ,hparams .n_embd_head_k_swa ); 2010LLAMA_LOG_INFO ("%s: n_embd_head_v_swa = %u\n" ,__func__ ,hparams .n_embd_head_v_swa ); 2011LLAMA_LOG_INFO ("%s: n_rot_swa = %u\n" ,__func__ ,hparams .n_rot_swa ); 2012 } 2013LLAMA_LOG_INFO ("%s: n_ctx_orig_yarn = %u\n" ,__func__ ,hparams .n_ctx_orig_yarn ); 2014LLAMA_LOG_INFO ("%s: rope_yarn_log_mul = %.4f\n" ,__func__ ,hparams .rope_yarn_log_mul ); 2015LLAMA_LOG_INFO ("%s: rope_finetuned = %s\n" ,__func__ ,hparams .rope_finetuned ?"yes" :"unknown" ); 2016if (arch == LLM_ARCH_GRANITE && 2017 std::any_of (hparams .deepstack_mapping_arr .begin (), 2018hparams .deepstack_mapping_arr .end (), 2019 [](const auto & entry ) {return entry >=0 ; })) { 2020LLAMA_LOG_INFO ("%s: deepstack_mapping_arr = %s\n" ,__func__ , 2021print_f ([& ](uint32_t il ) {return hparams .deepstack_mapping_arr [il ]; }, 2022hparams .n_layer_all ).c_str ()); 2023 } 2024// MRoPE (Multi-axis Rotary Position Embedding) sections 2025if (const auto & s = hparams .rope_sections ;s [0 ]|| s [1 ]|| s [2 ]|| s [3 ]) { 2026LLAMA_LOG_INFO ("%s: mrope sections = [%d, %d, %d, %d]\n" ,__func__ ,s [0 ],s [1 ],s [2 ],s [3 ]); 2027 } 2028if (!classifier_labels .empty ()) { 2029LLAMA_LOG_INFO ("%s: n_cls_out = %u\n" ,__func__ ,hparams .n_cls_out ); 2030 2031size_t i = 0 ; 2032for (const auto & label :classifier_labels ) { 2033LLAMA_LOG_INFO ("%s: cls_label[%2zu] = %s\n" ,__func__ ,i ++ ,label .c_str ()); 2034 } 2035 } 2036 2037if (arch == LLM_ARCH_MAMBA || 2038arch == LLM_ARCH_MAMBA2 || 2039arch == LLM_ARCH_JAMBA || 2040arch == LLM_ARCH_FALCON_H1 || 2041arch == LLM_ARCH_PLAMO2 || 2042arch == LLM_ARCH_GRANITE_HYBRID || 2043arch == LLM_ARCH_QWEN3NEXT || 2044arch == LLM_ARCH_QWEN35 || 2045arch == LLM_ARCH_QWEN35MOE || 2046arch == LLM_ARCH_NEMOTRON_H || 2047arch == LLM_ARCH_NEMOTRON_H_MOE ) { 2048LLAMA_LOG_INFO ("%s: ssm_d_conv = %u\n" ,__func__ ,hparams .ssm_d_conv ); 2049LLAMA_LOG_INFO ("%s: ssm_d_inner = %u\n" ,__func__ ,hparams .ssm_d_inner ); 2050LLAMA_LOG_INFO ("%s: ssm_d_state = %u\n" ,__func__ ,hparams .ssm_d_state ); 2051LLAMA_LOG_INFO ("%s: ssm_dt_rank = %u\n" ,__func__ ,hparams .ssm_dt_rank ); 2052LLAMA_LOG_INFO ("%s: ssm_n_group = %u\n" ,__func__ ,hparams .ssm_n_group ); 2053LLAMA_LOG_INFO ("%s: ssm_dt_b_c_rms = %d\n" ,__func__ ,hparams .ssm_dt_b_c_rms ); 2054 } 2055 2056LLAMA_LOG_INFO ("%s: model type = %s\n" ,__func__ ,type_name ().c_str ()); 2057if (pimpl -> n_elements >=1e12 ) { 2058LLAMA_LOG_INFO ("%s: model params = %.2f T\n" ,__func__ ,pimpl -> n_elements * 1e-12 ); 2059 }else if (pimpl -> n_elements >=1e9 ) { 2060LLAMA_LOG_INFO ("%s: model params = %.2f B\n" ,__func__ ,pimpl -> n_elements * 1e-9 ); 2061 }else if (pimpl -> n_elements >=1e6 ) { 2062LLAMA_LOG_INFO ("%s: model params = %.2f M\n" ,__func__ ,pimpl -> n_elements * 1e-6 ); 2063 }else { 2064LLAMA_LOG_INFO ("%s: model params = %.2f K\n" ,__func__ ,pimpl -> n_elements * 1e-3 ); 2065 } 2066 2067// general kv 2068LLAMA_LOG_INFO ("%s: general.name = %s\n" ,__func__ ,name .c_str ()); 2069 2070if (arch == LLM_ARCH_DEEPSEEK ) { 2071LLAMA_LOG_INFO ("%s: n_layer_dense_lead = %d\n" ,__func__ ,hparams .n_layer_dense_lead ); 2072LLAMA_LOG_INFO ("%s: n_ff_exp = %d\n" ,__func__ ,hparams .n_ff_exp ()); 2073LLAMA_LOG_INFO ("%s: n_expert_shared = %d\n" ,__func__ ,hparams .n_expert_shared ); 2074LLAMA_LOG_INFO ("%s: expert_weights_scale = %.1f\n" ,__func__ ,hparams .expert_weights_scale ); 2075 } 2076 2077if (arch == LLM_ARCH_DEEPSEEK2 || arch == LLM_ARCH_DEEPSEEK2OCR || 2078arch == LLM_ARCH_DEEPSEEK32 || arch == LLM_ARCH_GLM_DSA || 2079arch == LLM_ARCH_DOTS3NOTE || arch == LLM_ARCH_MISTRAL4 || 2080arch == LLM_ARCH_HY_V4 ) { 2081LLAMA_LOG_INFO ("%s: n_layer_dense_lead = %d\n" ,__func__ ,hparams .n_layer_dense_lead ); 2082LLAMA_LOG_INFO ("%s: n_lora_q = %d\n" ,__func__ ,hparams .n_lora_q ); 2083LLAMA_LOG_INFO ("%s: n_lora_kv = %d\n" ,__func__ ,hparams .n_lora_kv ); 2084LLAMA_LOG_INFO ("%s: n_embd_head_k_mla = %d\n" ,__func__ ,hparams .n_embd_head_k_mla ()); 2085LLAMA_LOG_INFO ("%s: n_embd_head_v_mla = %d\n" ,__func__ ,hparams .n_embd_head_v_mla ()); 2086LLAMA_LOG_INFO ("%s: n_ff_exp = %d\n" ,__func__ ,hparams .n_ff_exp ()); 2087LLAMA_LOG_INFO ("%s: n_expert_shared = %d\n" ,__func__ ,hparams .n_expert_shared ); 2088LLAMA_LOG_INFO ("%s: expert_weights_scale = %.1f\n" ,__func__ ,hparams .expert_weights_scale ); 2089LLAMA_LOG_INFO ("%s: expert_weights_norm = %d\n" ,__func__ ,hparams .expert_weights_norm ); 2090LLAMA_LOG_INFO ("%s: expert_gating_func = %s\n" ,__func__ ,llama_expert_gating_func_name ((llama_expert_gating_func_type )hparams .expert_gating_func )); 2091 } 2092 2093if (arch == LLM_ARCH_QWEN2MOE ) { 2094LLAMA_LOG_INFO ("%s: n_ff_exp = %d\n" ,__func__ ,hparams .n_ff_exp ()); 2095LLAMA_LOG_INFO ("%s: n_ff_shexp = %d\n" ,__func__ ,hparams .n_ff_shexp ); 2096 } 2097 2098if (arch == LLM_ARCH_MELLUM || 2099arch == LLM_ARCH_COHERE2MOE || 2100arch == LLM_ARCH_QWEN3MOE || 2101arch == LLM_ARCH_OPENAI_MOE || 2102arch == LLM_ARCH_QWEN3VLMOE || 2103arch == LLM_ARCH_RND1 ) { 2104LLAMA_LOG_INFO ("%s: n_ff_exp = %d\n" ,__func__ ,hparams .n_ff_exp ()); 2105 } 2106 2107if (arch == LLM_ARCH_MINICPM || 2108arch == LLM_ARCH_GRANITE || 2109arch == LLM_ARCH_GRANITE_MOE || 2110arch == LLM_ARCH_GRANITE_HYBRID || 2111arch == LLM_ARCH_GRANITE_SWITCH || 2112arch == LLM_ARCH_NEMOTRON_H_MOE ) { 2113LLAMA_LOG_INFO ("%s: f_embedding_scale = %f\n" ,__func__ ,hparams .f_embedding_scale ); 2114LLAMA_LOG_INFO ("%s: f_residual_scale = %f\n" ,__func__ ,hparams .f_residual_scale ); 2115LLAMA_LOG_INFO ("%s: f_attention_scale = %f\n" ,__func__ ,hparams .f_attention_scale ); 2116LLAMA_LOG_INFO ("%s: n_ff_shexp = %d\n" ,__func__ ,hparams .n_ff_shexp ); 2117 } 2118 2119if (arch == LLM_ARCH_BAILINGMOE ) { 2120LLAMA_LOG_INFO ("%s: n_layer_dense_lead = %d\n" ,__func__ ,hparams .n_layer_dense_lead ); 2121LLAMA_LOG_INFO ("%s: n_ff_exp = %d\n" ,__func__ ,hparams .n_ff_exp ()); 2122LLAMA_LOG_INFO ("%s: n_expert_shared = %d\n" ,__func__ ,hparams .n_expert_shared ); 2123LLAMA_LOG_INFO ("%s: expert_weights_scale = %.1f\n" ,__func__ ,hparams .expert_weights_scale ); 2124LLAMA_LOG_INFO ("%s: expert_weights_norm = %d\n" ,__func__ ,hparams .expert_weights_norm ); 2125 } 2126 2127if (arch == LLM_ARCH_BAILINGMOE2 || arch == LLM_ARCH_BAILINGMOE3 ) { 2128LLAMA_LOG_INFO ("%s: n_layer_dense_lead = %d\n" ,__func__ ,hparams .n_layer_dense_lead ); 2129LLAMA_LOG_INFO ("%s: n_ff_exp = %d\n" ,__func__ ,hparams .n_ff_exp ()); 2130LLAMA_LOG_INFO ("%s: n_ff_shexp = %d\n" ,__func__ ,hparams .n_ff_shexp ); 2131LLAMA_LOG_INFO ("%s: n_expert_shared = %d\n" ,__func__ ,hparams .n_expert_shared ); 2132LLAMA_LOG_INFO ("%s: expert_weights_scale = %.1f\n" ,__func__ ,hparams .expert_weights_scale ); 2133LLAMA_LOG_INFO ("%s: expert_weights_norm = %d\n" ,__func__ ,hparams .expert_weights_norm ); 2134LLAMA_LOG_INFO ("%s: expert_gating_func = %s\n" ,__func__ ,llama_expert_gating_func_name ((llama_expert_gating_func_type )hparams .expert_gating_func )); 2135LLAMA_LOG_INFO ("%s: n_layer_nextn = %d\n" ,__func__ ,hparams .n_layer_nextn ); 2136 } 2137 2138if (arch == LLM_ARCH_SMALLTHINKER || arch == LLM_ARCH_LFM2MOE ) { 2139LLAMA_LOG_INFO ("%s: n_ff_exp = %d\n" ,__func__ ,hparams .n_ff_exp ()); 2140LLAMA_LOG_INFO ("%s: expert_gating_func = %s\n" ,__func__ ,llama_expert_gating_func_name ((llama_expert_gating_func_type )hparams .expert_gating_func )); 2141 } 2142 2143if (arch == LLM_ARCH_GROVEMOE ) { 2144LLAMA_LOG_INFO ("%s: n_ff_exp = %d\n" ,__func__ ,hparams .n_ff_exp ()); 2145LLAMA_LOG_INFO ("%s: n_ff_chexp = %d\n" ,__func__ ,hparams .n_ff_chexp ); 2146LLAMA_LOG_INFO ("%s: n_group_experts = %d\n" ,__func__ ,hparams .n_group_experts ); 2147LLAMA_LOG_INFO ("%s: expert_group_scale = %.2f\n" ,__func__ ,hparams .expert_group_scale ); 2148 } 2149 } 2150 2151vocab .print_info (); 2152} 2153 2154ggml_backend_dev_t llama_model::dev_layer (int il )const { 2155return pimpl -> dev_layer .at (il ).dev ; 2156} 2157 2158ggml_backend_dev_t llama_model::dev_output ()const { 2159return pimpl -> dev_output .dev ; 2160} 2161 2162template < typename F > 2163static bool buft_supported (ggml_backend_buffer_type_t buft ,ggml_backend_dev_t dev ,F & fn ) { 2164ggml_init_params params = { 2165/*.mem_size =*/ ggml_tensor_overhead ()* 8 , 2166/*.mem_buffer =*/ NULL , 2167/*.no_alloc =*/ true, 2168 }; 2169 2170ggml_context_ptr ctx {ggml_init (params ) }; 2171if (!ctx ) { 2172throw std::runtime_error (format ("failed to create ggml context" )); 2173 } 2174 2175ggml_backend_buffer_ptr buf {ggml_backend_buft_alloc_buffer (buft ,0 ) }; 2176ggml_tensor * op_tensor = fn (ctx .get ()); 2177for (int i = 0 ;i < GGML_MAX_SRC ;i ++ ) { 2178if (op_tensor -> src [i ]!= nullptr ) { 2179assert (op_tensor -> src [i ]-> buffer == nullptr ); 2180op_tensor -> src [i ]-> buffer = buf .get (); 2181 } 2182 } 2183 2184bool op_supported = ggml_backend_dev_supports_op (dev ,op_tensor ); 2185 2186return op_supported ; 2187} 2188 2189template < typename F > 2190static ggml_backend_buffer_type_t select_buft (const buft_list_t & buft_list ,const F & fn ) { 2191for (const auto & cur :buft_list ) { 2192ggml_backend_dev_t cur_dev = cur .first ; 2193ggml_backend_buffer_type_t cur_buft = cur .second ; 2194if (buft_supported (cur_buft ,cur_dev ,fn )) { 2195return cur_buft ; 2196 } 2197 } 2198 2199throw std::runtime_error (format ("no suitable buffer type found" )); 2200} 2201 2202ggml_backend_buffer_type_t llama_model::select_buft (int il )const { 2203return ::select_buft ( 2204* pimpl -> dev_layer .at (il ).buft_list , 2205 [& ](ggml_context * ctx ) { 2206ggml_tensor * cur = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,hparams .n_embd ); 2207ggml_tensor * layer_dir = ggml_new_tensor_1d (ctx ,GGML_TYPE_F32 ,hparams .n_embd ); 2208return ggml_add (ctx ,cur ,layer_dir ); 2209 }); 2210} 2211 2212bool llama_model::has_tensor_overrides ()const { 2213return pimpl -> has_tensor_overrides ; 2214} 2215 2216const ggml_tensor * llama_model::get_tensor (const char * name )const { 2217auto it = std::find_if (tensors_by_name .begin (),tensors_by_name .end (), 2218 [name ](const std::pair < std::string ,ggml_tensor *> & it ) { 2219return it .first == name ; 2220 }); 2221if (it == tensors_by_name .end ()) { 2222return nullptr ; 2223 } 2224 2225return it -> second ; 2226} 2227 2228float llama_model::get_rope_freq_base (const llama_cparams & cparams ,int il )const { 2229return hparams .is_swa (il ) ?hparams .rope_freq_base_train_swa :cparams .rope_freq_base ; 2230} 2231 2232float llama_model::get_rope_freq_scale (const llama_cparams & cparams ,int il )const { 2233return hparams .is_swa (il ) ?hparams .rope_freq_scale_train_swa :cparams .rope_freq_scale ; 2234} 2235 2236ggml_tensor * llama_model::get_rope_factors (const llama_cparams & cparams ,int il )const { 2237const uint32_t n_ctx_seq = cparams .n_ctx_seq ; 2238 2239// choose long/short freq factors based on the context size 2240if (layers [il ].rope_freqs != nullptr ) { 2241return layers [il ].rope_freqs ; 2242 } 2243 2244if (n_ctx_seq > hparams .n_ctx_orig_yarn ) { 2245return layers [il ].rope_long ; 2246 } 2247 2248return layers [il ].rope_short ; 2249} 2250 2251llama_memory_i * llama_model::create_memory (const llama_memory_params & params ,const llama_cparams & cparams )const { 2252llama_memory_i * res ; 2253 2254switch (arch ) { 2255// Models that need specific instantiation should be handled in the 2256// switch statement 2257case LLM_ARCH_BERT : 2258case LLM_ARCH_JINA_BERT_V2 : 2259case LLM_ARCH_JINA_BERT_V3 : 2260case LLM_ARCH_NOMIC_BERT : 2261case LLM_ARCH_NOMIC_BERT_MOE : 2262case LLM_ARCH_NEO_BERT : 2263case LLM_ARCH_EUROBERT : 2264case LLM_ARCH_WAVTOKENIZER_DEC : 2265case LLM_ARCH_MODERN_BERT : 2266case LLM_ARCH_GEMMA_EMBEDDING : 2267case LLM_ARCH_DREAM : 2268case LLM_ARCH_LLADA : 2269case LLM_ARCH_LLADA_MOE : 2270case LLM_ARCH_RND1 : 2271 { 2272res = nullptr ; 2273 }break ; 2274case LLM_ARCH_MINIMAX_M3 : 2275 { 2276// sparse (MSA) layers carry an indexer key cache, but leading dense layers do not 2277 llama_kv_cache::layer_filter_cb filter_idx = 2278 [& ](int32_t il ) {return (uint32_t )il >=hparams .n_layer_dense_lead ; }; 2279 2280res = new llama_kv_cache_msa ( 2281* this , 2282params .type_k , 2283params .type_v , 2284 !cparams .flash_attn , 2285cparams .offload_kqv , 2286cparams .kv_unified , 2287cparams .n_ctx_seq , 2288cparams .n_seq_max , 22891 , 2290hparams .n_swa , 2291hparams .swa_type , 2292nullptr , 2293filter_idx , 2294nullptr ); 2295 }break ; 2296case LLM_ARCH_GLM_DSA : 2297case LLM_ARCH_DEEPSEEK32 : 2298 { 2299if (params .ctx_type == LLAMA_CONTEXT_TYPE_MTP && hparams .n_layer_nextn > 0 ) { 2300// The NextN/MTP draft head runs dense MLA (no DSA indexer), so the 2301// MTP context uses a plain attention KV cache holding only the 2302// nextn layer(s) - same pattern as the hybrid Qwen3.5 MTP context. 2303 llama_kv_cache::layer_filter_cb filter = 2304 [& ](uint32_t il ) {return il >=hparams .n_layer (); }; 2305 2306res = new llama_kv_cache ( 2307* this , 2308hparams , 2309params .type_k , 2310params .type_v , 2311 !cparams .flash_attn , 2312cparams .offload_kqv , 2313cparams .kv_unified , 2314cparams .n_ctx_seq , 2315cparams .n_seq_max , 23161 , 2317hparams .n_swa , 2318hparams .swa_type , 2319nullptr , 2320filter , 2321nullptr , 2322nullptr ); 2323 }else { 2324// Main context: DSA cache for the trunk layers only - the nextn 2325// layer(s) are never attended by the trunk graph. 2326 llama_kv_cache::layer_filter_cb filter_mla = nullptr ; 2327if (hparams .n_layer_nextn > 0 ) { 2328filter_mla = [& ](uint32_t il ) {return il < hparams .n_layer (); }; 2329 } 2330 llama_kv_cache::layer_filter_cb filter_lid = [& ](uint32_t il ) {return il < hparams .n_layer ()&& (arch != LLM_ARCH_GLM_DSA || hparams .is_indexer_full (il )); }; 2331 2332res = new llama_kv_cache_dsa ( 2333* this , 2334params .type_k , 2335params .type_v , 2336 !cparams .flash_attn , 2337cparams .offload_kqv , 2338cparams .kv_unified , 2339cparams .n_ctx_seq , 2340cparams .n_seq_max , 23411 , 2342hparams .n_swa , 2343hparams .swa_type , 2344filter_mla , 2345filter_lid , 2346nullptr ); 2347 } 2348 }break ; 2349case LLM_ARCH_HY_V4 : 2350 { 2351if (hparams .indexer_top_k == 0 ) { 2352// full-attention checkpoint: no indexer, so no indexer key cache 2353res = new llama_kv_cache ( 2354* this , 2355hparams , 2356params .type_k , 2357params .type_v , 2358 !cparams .flash_attn , 2359cparams .offload_kqv , 2360cparams .kv_unified , 2361cparams .n_ctx_seq , 2362cparams .n_seq_max , 23631 , 2364hparams .n_swa , 2365hparams .swa_type , 2366nullptr , 2367nullptr , 2368nullptr , 2369nullptr ); 2370 }else { 2371// only "full" layers own an indexer, so the shared layers need no indexer cache 2372 llama_kv_cache::layer_filter_cb filter_lid = [& ](uint32_t il ) {return hparams .is_indexer_full (il ); }; 2373 2374res = new llama_kv_cache_dsa ( 2375* this , 2376params .type_k , 2377params .type_v , 2378 !cparams .flash_attn , 2379cparams .offload_kqv , 2380cparams .kv_unified , 2381cparams .n_ctx_seq , 2382cparams .n_seq_max , 23831 , 2384hparams .n_swa , 2385hparams .swa_type , 2386nullptr , 2387filter_lid , 2388nullptr ); 2389 } 2390 }break ; 2391case LLM_ARCH_DOTS3NOTE : 2392 { 2393GGML_ASSERT (hparams .swa_type != LLAMA_SWA_TYPE_NONE ); 2394 2395if (params .ctx_type == LLAMA_CONTEXT_TYPE_MTP && hparams .n_layer_nextn > 0 ) { 2396// MTP draft context: plain attention KV cache holding only the nextn layer 2397 llama_kv_cache::layer_filter_cb filter = 2398 [& ](uint32_t il ) {return il >=hparams .n_layer (); }; 2399 2400res = new llama_kv_cache ( 2401* this , 2402hparams , 2403params .type_k , 2404params .type_v , 2405 !cparams .flash_attn , 2406cparams .offload_kqv , 2407cparams .kv_unified , 2408cparams .n_ctx_seq , 2409cparams .n_seq_max , 24101 , 2411hparams .n_swa , 2412hparams .swa_type , 2413nullptr , 2414filter , 2415nullptr , 2416nullptr ); 2417 }else { 2418// main context: DSA cache for the trunk full-attention layers plus a window-sized SWA cache 2419 llama_kv_cache::layer_filter_cb filter_mla = nullptr ; 2420if (hparams .n_layer_nextn > 0 ) { 2421filter_mla = [& ](uint32_t il ) {return il < hparams .n_layer (); }; 2422 } 2423 llama_kv_cache::layer_filter_cb filter_lid = [& ](uint32_t il ) {return il < hparams .n_layer ()&& hparams .is_indexer_full (il ); }; 2424 2425res = new llama_kv_cache_dsa_iswa ( 2426* this , 2427params .type_k , 2428params .type_v , 2429 !cparams .flash_attn , 2430cparams .offload_kqv , 2431params .swa_full , 2432cparams .kv_unified , 2433cparams .n_ctx_seq , 2434cparams .n_seq_max , 2435cparams .n_ubatch , 24361 , 2437filter_mla , 2438filter_lid , 2439nullptr ); 2440 } 2441 }break ; 2442case LLM_ARCH_DEEPSEEK4 : 2443 { 2444GGML_ASSERT (hparams .swa_type != LLAMA_SWA_TYPE_NONE ); 2445 2446if (params .ctx_type == LLAMA_CONTEXT_TYPE_MTP ) { 2447const llama_memory_i::layer_filter_cb filter_mtp = [& ](int32_t il ) { 2448return il >= (int32_t )hparams .n_layer (); 2449 }; 2450 2451res = new llama_kv_cache_iswa ( 2452* this , 2453params .type_k , 2454params .type_v , 2455 !cparams .flash_attn , 2456cparams .offload_kqv , 2457params .swa_full , 2458cparams .kv_unified , 2459cparams .n_ctx_seq , 2460cparams .n_seq_max , 2461cparams .n_ubatch , 24621 , 2463nullptr , 2464filter_mtp , 2465nullptr , 2466nullptr ); 2467 }else { 2468res = new llama_kv_cache_dsv4 ( 2469* this , 2470params .type_k , 2471params .type_v , 2472 !cparams .flash_attn , 2473cparams .offload_kqv , 2474params .swa_full , 2475cparams .kv_unified , 2476cparams .n_ctx_seq , 2477cparams .n_seq_max , 2478cparams .n_ubatch , 24791 , 2480cparams .n_rs_seq , 2481nullptr , 2482nullptr ); 2483 } 2484 }break ; 2485case LLM_ARCH_DFLASH : 2486 { 2487// DSV4 DSpark stages store a single MLA-style K per position (window = the draft ring) 2488if (hparams .dsv4_hc_mult > 0 ) { 2489GGML_ASSERT (hparams .swa_type != LLAMA_SWA_TYPE_NONE ); 2490 2491res = new llama_kv_cache_iswa ( 2492* this , 2493params .type_k , 2494params .type_v , 2495 !cparams .flash_attn , 2496cparams .offload_kqv , 2497params .swa_full , 2498cparams .kv_unified , 2499cparams .n_ctx_seq , 2500cparams .n_seq_max , 2501cparams .n_ubatch , 25021 , 2503nullptr , 2504nullptr , 2505nullptr , 2506nullptr ); 2507break ; 2508 } 2509 } 2510 [[fallthrough ]]; 2511// Models that need standard caching should rely on recurrent/hybrid 2512// checks 2513default : 2514 { 2515// Dense MTP heads use a plain attention KV cache instead of the hybrid wrapper. 2516const bool mtp_on_hybrid_qwen = 2517params .ctx_type == LLAMA_CONTEXT_TYPE_MTP && 2518 (arch == LLM_ARCH_QWEN3NEXT || arch == LLM_ARCH_QWEN35 || arch == LLM_ARCH_QWEN35MOE || 2519arch == LLM_ARCH_BAILINGMOE3 ); 2520 2521const bool mtp_on_hybrid_nemotron = 2522params .ctx_type == LLAMA_CONTEXT_TYPE_MTP && arch == LLM_ARCH_NEMOTRON_H_MOE ; 2523 2524if (llm_arch_is_recurrent (arch )) { 2525res = new llama_memory_recurrent ( 2526* this , 2527GGML_TYPE_F32 , 2528GGML_TYPE_F32 , 2529cparams .offload_kqv , 2530 std::max ((uint32_t )1 ,cparams .n_seq_max ), 2531cparams .n_seq_max , 2532cparams .n_rs_seq , 2533nullptr ); 2534 }else if (llm_arch_is_hybrid (arch )&& !mtp_on_hybrid_qwen && !mtp_on_hybrid_nemotron ) { 2535// The main difference between hybrid architectures is the 2536// layer filters, so pick the right one here 2537 llama_memory_hybrid::layer_filter_cb filter_attn = nullptr ; 2538 llama_memory_hybrid::layer_filter_cb filter_recr = nullptr ; 2539// only the sparse-attention architectures use llama_memory_hybrid_idx 2540// a null filter_idx means the GGUF has no indexer tensors 2541 llama_memory_hybrid::layer_filter_cb filter_idx = nullptr ; 2542const bool needs_mem_idx = (arch == LLM_ARCH_QWEN4EXP ); 2543if (arch == LLM_ARCH_FALCON_H1 ) { 2544filter_attn = [& ](uint32_t ) {return true; }; 2545filter_recr = [& ](uint32_t ) {return true; }; 2546 }else if (arch == LLM_ARCH_NEMOTRON_H || arch == LLM_ARCH_NEMOTRON_H_MOE ) { 2547filter_attn = [& ](uint32_t il ) { 2548return !hparams .is_recr (il )&& hparams .n_ff (il )== 0 ; 2549 }; 2550filter_recr = [& ](uint32_t il ) { 2551return hparams .is_recr (il )&& hparams .n_ff (il )== 0 ; 2552 }; 2553 }else if (arch == LLM_ARCH_QWEN3NEXT || arch == LLM_ARCH_QWEN35 || arch == LLM_ARCH_QWEN35MOE || arch == LLM_ARCH_QWEN4EXP || arch == LLM_ARCH_MINIMAX_01 ) { 2554filter_attn = [& ](uint32_t il ) { 2555return il < hparams .n_layer ()&& !hparams .is_recr (il ); 2556 }; 2557filter_recr = [& ](uint32_t il ) { 2558return il < hparams .n_layer ()&& hparams .is_recr (il ); 2559 }; 2560 2561if (arch == LLM_ARCH_QWEN4EXP && hparams .indexer_head_size > 0 ) { 2562// QSA runs on the dense-attention layers only 2563filter_idx = [& ](uint32_t il ) { 2564return il < hparams .n_layer ()&& !hparams .is_recr (il ); 2565 }; 2566 } 2567 } 2568 2569if (hparams .swa_type != LLAMA_SWA_TYPE_NONE ) { 2570// Use hybrid-iswa for hybrid models with SWA 2571res = new llama_memory_hybrid_iswa ( 2572/* model */ * this , 2573/* attn_type_k */ params .type_k , 2574/* attn_type_v */ params .type_v , 2575/* attn_v_trans */ !cparams .flash_attn , 2576/* attn_swa_full */ params .swa_full , 2577/* attn_kv_size */ cparams .n_ctx_seq , 2578/* attn_n_ubatch */ cparams .n_ubatch , 2579/* attn_n_pad */ 1 , 2580/* recurrent_type_r */ GGML_TYPE_F32 , 2581/* recurrent_type_s */ GGML_TYPE_F32 , 2582/* recurrent_rs_size */ std::max ((uint32_t )1 ,cparams .n_seq_max ), 2583/* n_seq_max */ cparams .n_seq_max , 2584/* n_rs_seq */ cparams .n_rs_seq , 2585/* offload */ cparams .offload_kqv , 2586/* unified */ cparams .kv_unified , 2587/* filter_attn */ std::move (filter_attn ), 2588/* filter_recr */ std::move (filter_recr )); 2589 }else if (needs_mem_idx ) { 2590// sparse attention over a per-token indexer cache, in its own memory type 2591res = new llama_memory_hybrid_idx ( 2592/* model */ * this , 2593/* attn_type_k */ params .type_k , 2594/* attn_type_v */ params .type_v , 2595/* attn_v_trans */ !cparams .flash_attn , 2596/* attn_kv_size */ cparams .n_ctx_seq , 2597/* attn_n_pad */ 1 , 2598/* attn_n_swa */ hparams .n_swa , 2599/* attn_swa_type */ hparams .swa_type , 2600/* recurrent_type_k */ GGML_TYPE_F32 , 2601/* recurrent_type_v */ GGML_TYPE_F32 , 2602/* recurrent_kv_size */ std::max ((uint32_t )1 ,cparams .n_seq_max ), 2603/* n_seq_max */ cparams .n_seq_max , 2604/* n_rs_seq */ cparams .n_rs_seq , 2605/* offload */ cparams .offload_kqv , 2606/* unified */ cparams .kv_unified , 2607/* filter_attn */ std::move (filter_attn ), 2608/* filter_recr */ std::move (filter_recr ), 2609/* filter_idx */ std::move (filter_idx )); 2610 }else { 2611res = new llama_memory_hybrid ( 2612/* model */ * this , 2613/* attn_type_k */ params .type_k , 2614/* attn_type_v */ params .type_v , 2615/* attn_v_trans */ !cparams .flash_attn , 2616/* attn_kv_size */ cparams .n_ctx_seq , 2617/* attn_n_pad */ 1 , 2618/* attn_n_swa */ hparams .n_swa , 2619/* attn_swa_type */ hparams .swa_type , 2620/* recurrent_type_k */ GGML_TYPE_F32 , 2621/* recurrent_type_v */ GGML_TYPE_F32 , 2622/* recurrent_kv_size */ std::max ((uint32_t )1 ,cparams .n_seq_max ), 2623/* n_seq_max */ cparams .n_seq_max , 2624/* n_rs_seq */ cparams .n_rs_seq , 2625/* offload */ cparams .offload_kqv , 2626/* unified */ cparams .kv_unified , 2627/* filter_attn */ std::move (filter_attn ), 2628/* filter_recr */ std::move (filter_recr )); 2629 } 2630 }else { 2631 llama_kv_cache::layer_filter_cb filter = nullptr ; 2632 llama_memory_i::layer_reuse_cb reuse = nullptr ; 2633 llama_kv_cache::layer_share_cb share = nullptr ; 2634 2635if (arch == LLM_ARCH_GEMMA3N || arch == LLM_ARCH_GEMMA4 ) { 2636reuse = [& ](uint32_t il ) { 2637GGML_ASSERT (hparams .n_layer_kv_from_start >=2 ); 2638 2639if (il >= (uint32_t )hparams .n_layer_kv_from_start ) { 2640return hparams .n_layer_kv_from_start - (hparams .is_swa (il ) ?2 :1 ); 2641 } 2642 2643return -1 ; 2644 }; 2645 } 2646 2647if (arch == LLM_ARCH_ALICEAI_T5_MOE ) { 2648filter = [& ](uint32_t il ) {return il < hparams .dec_n_layer ; }; 2649 } 2650 2651if (mtp_on_hybrid_qwen || mtp_on_hybrid_nemotron ) { 2652filter = [& ](uint32_t il ) {return il >=hparams .n_layer (); }; 2653 } 2654 2655// don't filter when n_layer_nextn is repurposed for a router layer the trunk attends 2656// or when a model is entirely n_layer_nextn layers and has no trunk 2657if (hparams .n_layer_nextn > 0 && hparams .n_layer ()> 0 && hparams .router_layer < 0 ) { 2658if (params .ctx_type == LLAMA_CONTEXT_TYPE_MTP ) { 2659filter = [& ](uint32_t il ) {return il >=hparams .n_layer (); }; 2660 }else { 2661filter = [& ](uint32_t il ) {return il < hparams .n_layer (); }; 2662 } 2663 } 2664 2665if (hparams .swa_type != LLAMA_SWA_TYPE_NONE ) { 2666GGML_ASSERT (hparams .is_swa_any ()); 2667 2668if (arch == LLM_ARCH_GEMMA4_ASSISTANT ) { 2669llama_memory_t mem_other = llama_get_memory (cparams .ctx_other ); 2670 2671share = [& ](int32_t il ) { 2672const llama_model * model_other = llama_get_model (cparams .ctx_other ); 2673 2674if (hparams .is_swa (il )) { 2675return llama_model_n_layer (model_other )- 2 ; 2676 } 2677 2678return llama_model_n_layer (model_other )- 1 ; 2679 }; 2680 2681res = new llama_kv_cache_iswa ( 2682* this , 2683params .type_k , 2684params .type_v , 2685 !cparams .flash_attn , 2686cparams .offload_kqv , 2687params .swa_full , 2688cparams .kv_unified , 2689cparams .n_ctx_seq , 2690cparams .n_seq_max , 2691cparams .n_ubatch , 26921 , 2693mem_other , 2694filter , 2695reuse , 2696share ); 2697 }else { 2698res = new llama_kv_cache_iswa ( 2699* this , 2700params .type_k , 2701params .type_v , 2702 !cparams .flash_attn , 2703cparams .offload_kqv , 2704params .swa_full , 2705cparams .kv_unified , 2706cparams .n_ctx_seq , 2707cparams .n_seq_max , 2708cparams .n_ubatch , 27091 , 2710nullptr , 2711filter , 2712reuse , 2713share ); 2714 } 2715 }else { 2716GGML_ASSERT (!hparams .is_swa_any ()); 2717 2718res = new llama_kv_cache ( 2719* this , 2720hparams , 2721params .type_k , 2722params .type_v , 2723 !cparams .flash_attn , 2724cparams .offload_kqv , 2725cparams .kv_unified , 2726cparams .n_ctx_seq , 2727cparams .n_seq_max , 27281 , 2729hparams .n_swa , 2730hparams .swa_type , 2731nullptr , 2732filter , 2733nullptr , 2734nullptr ); 2735 } 2736 } 2737 } 2738 } 2739 2740return res ; 2741} 2742 2743ggml_cgraph * llama_model::build_graph (const llm_graph_params & params )const { 2744 std::unique_ptr < llm_graph_context > llm = build_arch_graph (params ); 2745 2746// add on pooling layer 2747llm -> build_pooling (cls ,cls_b ,cls_out ,cls_out_b ,cls_norm ); 2748 2749// add backend sampling layers (if any) 2750llm -> build_sampling (); 2751 2752// if the gguf model was converted with --sentence-transformers-dense-modules 2753// there will be two additional dense projection layers 2754// dense linear projections are applied after pooling 2755// TODO: move reranking logic here and generalize 2756llm -> build_dense_out (dense_2_out_layers ,dense_2_out_layers_b ,dense_3_out_layers ); 2757 2758llm -> res -> set_outputs (params ); 2759 2760return llm -> res -> get_gf (); 2761} 2762 2763 2764// 2765// interface implementation 2766// 2767 2768llama_model_params llama_model_default_params () { 2769llama_model_params result = { 2770/*.devices =*/ nullptr , 2771/*.tensor_buft_overrides =*/ nullptr , 2772/*.n_gpu_layers =*/ -1 , 2773/*.split_mode =*/ LLAMA_SPLIT_MODE_LAYER , 2774/*.load_mode =*/ LLAMA_LOAD_MODE_AUTO , 2775/*.lazy_mode =*/ LLAMA_LAZY_MODE_AUTO , 2776/*.main_gpu =*/ 0 , 2777/*.tensor_split =*/ nullptr , 2778/*.progress_callback =*/ nullptr , 2779/*.progress_callback_user_data =*/ nullptr , 2780/*.kv_overrides =*/ nullptr , 2781/*.vocab_only =*/ false, 2782/*.check_tensors =*/ false, 2783/*.use_extra_bufts =*/ true, 2784/*.no_host =*/ false, 2785/*.no_alloc =*/ false, 2786/*.load_mtp =*/ false, 2787 }; 2788 2789return result ; 2790} 2791 2792const llama_vocab * llama_model_get_vocab (const llama_model * model ) { 2793return & model -> vocab ; 2794} 2795 2796void llama_free_model (llama_model * model ) { 2797llama_model_free (model ); 2798} 2799 2800void llama_model_free (llama_model * model ) { 2801delete model ; 2802} 2803 2804int32_t llama_model_n_ctx_train (const llama_model * model ) { 2805return model -> hparams .n_ctx_train ; 2806} 2807 2808int32_t llama_model_n_embd (const llama_model * model ) { 2809return model -> hparams .n_embd ; 2810} 2811 2812int32_t llama_model_n_embd_inp (const llama_model * model ) { 2813return model -> hparams .n_embd_inp (); 2814} 2815 2816int32_t llama_model_n_embd_out (const llama_model * model ) { 2817return model -> hparams .n_embd_out (); 2818} 2819 2820int32_t llama_model_n_layer (const llama_model * model ) { 2821return model -> hparams .n_layer (); 2822} 2823 2824int32_t llama_model_n_layer_nextn (const llama_model * model ) { 2825return model -> hparams .n_layer_nextn ; 2826} 2827 2828int32_t llama_model_dflash_selector_top_k (const llama_model * model ) { 2829return model -> hparams .dflash_selector_top_k ; 2830} 2831 2832int32_t llama_model_n_head (const llama_model * model ) { 2833return model -> hparams .n_head (); 2834} 2835 2836int32_t llama_model_n_head_kv (const llama_model * model ) { 2837return model -> hparams .n_head_kv (); 2838} 2839 2840int32_t llama_model_n_swa (const llama_model * model ) { 2841// dsv4 kv-cache has SWA but it cannot be used as a rollback because of 2842// other compression ratios, so we return 0 here 2843if (model -> arch == LLM_ARCH_DEEPSEEK4 ) { 2844return 0 ; 2845 } 2846return model -> hparams .n_swa ; 2847} 2848 2849 2850uint32_t llama_model_n_cls_out (const struct llama_model * model ) { 2851return model -> hparams .n_cls_out ; 2852} 2853 2854const char * llama_model_cls_label (const struct llama_model * model ,uint32_t i ) { 2855if (i < model -> classifier_labels .size ()) { 2856return model -> classifier_labels [i ].c_str (); 2857 } 2858 2859return nullptr ; 2860} 2861 2862// deprecated 2863int32_t llama_n_ctx_train (const llama_model * model ) { 2864return llama_model_n_ctx_train (model ); 2865} 2866 2867// deprecated 2868int32_t llama_n_embd (const llama_model * model ) { 2869return llama_model_n_embd (model ); 2870} 2871 2872// deprecated 2873int32_t llama_n_layer (const llama_model * model ) { 2874return llama_model_n_layer (model ); 2875} 2876 2877// deprecated 2878int32_t llama_n_head (const llama_model * model ) { 2879return llama_model_n_head (model ); 2880} 2881 2882llama_rope_type llama_model_rope_type (const llama_model * model ) { 2883switch (model -> arch ) { 2884// these models do not use RoPE 2885case LLM_ARCH_CLIP : 2886case LLM_ARCH_GPT2 : 2887case LLM_ARCH_GPTJ : 2888case LLM_ARCH_MPT : 2889case LLM_ARCH_REFACT : 2890case LLM_ARCH_BLOOM : 2891case LLM_ARCH_MAMBA : 2892case LLM_ARCH_MAMBA2 : 2893case LLM_ARCH_JAMBA : 2894case LLM_ARCH_JINA_BERT_V2 : 2895case LLM_ARCH_T5 : 2896case LLM_ARCH_T5ENCODER : 2897case LLM_ARCH_JAIS : 2898case LLM_ARCH_RWKV6 : 2899case LLM_ARCH_RWKV6QWEN2 : 2900case LLM_ARCH_RWKV7 : 2901case LLM_ARCH_ARWKV7 : 2902case LLM_ARCH_WAVTOKENIZER_DEC : 2903case LLM_ARCH_NEMOTRON_H : 2904case LLM_ARCH_NEMOTRON_H_MOE : 2905case LLM_ARCH_KIMI_LINEAR : 2906case LLM_ARCH_KIMI_K3 : 2907return LLAMA_ROPE_TYPE_NONE ; 2908 2909// use what we call a normal RoPE, operating on pairs of consecutive head values 2910case LLM_ARCH_LLAMA : 2911case LLM_ARCH_LLADA : 2912case LLM_ARCH_LLAMA4 : 2913case LLM_ARCH_DECI : 2914case LLM_ARCH_BAICHUAN : 2915case LLM_ARCH_STARCODER : 2916case LLM_ARCH_INTERNLM2 : 2917case LLM_ARCH_MINICPM : 2918case LLM_ARCH_XVERSE : 2919case LLM_ARCH_COMMAND_R : 2920case LLM_ARCH_COHERE2 : 2921case LLM_ARCH_COHERE2MOE : 2922case LLM_ARCH_OLMO : 2923case LLM_ARCH_ARCTIC : 2924case LLM_ARCH_DEEPSEEK : 2925case LLM_ARCH_DEEPSEEK2 : 2926case LLM_ARCH_DEEPSEEK2OCR : 2927case LLM_ARCH_DEEPSEEK32 : 2928case LLM_ARCH_DEEPSEEK4 : 2929case LLM_ARCH_MUSE_GLIMMER : 2930case LLM_ARCH_PLM : 2931case LLM_ARCH_CHATGLM : 2932case LLM_ARCH_GRANITE : 2933case LLM_ARCH_GRANITE_MOE : 2934case LLM_ARCH_GRANITE_HYBRID : 2935case LLM_ARCH_GRANITE_SWITCH : 2936case LLM_ARCH_GRANITE_SWA : 2937case LLM_ARCH_CHAMELEON : 2938case LLM_ARCH_BAILINGMOE : 2939case LLM_ARCH_BAILINGMOE3 : 2940case LLM_ARCH_NEO_BERT : 2941case LLM_ARCH_SMOLLM3 : 2942case LLM_ARCH_ARCEE : 2943case LLM_ARCH_ERNIE4_5 : 2944case LLM_ARCH_ERNIE4_5_MOE : 2945case LLM_ARCH_MISTRAL3 : 2946case LLM_ARCH_EAGLE3 : 2947case LLM_ARCH_MISTRAL4 : 2948case LLM_ARCH_LLAMA_EMBED : 2949case LLM_ARCH_MAINCODER : 2950case LLM_ARCH_GLM_DSA : 2951case LLM_ARCH_DOTS3NOTE : 2952case LLM_ARCH_NANBEIGE : 2953case LLM_ARCH_POCKETTTS : 2954// HY_V4 rotates consecutive pairs, matching the reference implementation 2955case LLM_ARCH_HY_V4 : 2956return LLAMA_ROPE_TYPE_NORM ; 2957 2958// the pairs of head values are offset by n_rot/2 2959case LLM_ARCH_FALCON : 2960case LLM_ARCH_FALCON_H1 : 2961case LLM_ARCH_GROK : 2962case LLM_ARCH_DBRX : 2963case LLM_ARCH_BERT : 2964case LLM_ARCH_JINA_BERT_V3 : 2965case LLM_ARCH_MODERN_BERT : 2966case LLM_ARCH_NOMIC_BERT : 2967case LLM_ARCH_NOMIC_BERT_MOE : 2968case LLM_ARCH_EUROBERT : 2969case LLM_ARCH_STABLELM : 2970case LLM_ARCH_BITNET : 2971case LLM_ARCH_QWEN : 2972case LLM_ARCH_QWEN2 : 2973case LLM_ARCH_DREAM : 2974case LLM_ARCH_QWEN2MOE : 2975case LLM_ARCH_QWEN3 : 2976case LLM_ARCH_QWEN3MOE : 2977case LLM_ARCH_LLADA_MOE : 2978case LLM_ARCH_RND1 : 2979case LLM_ARCH_OLMO2 : 2980case LLM_ARCH_OLMOE : 2981case LLM_ARCH_PHI2 : 2982case LLM_ARCH_PHI3 : 2983case LLM_ARCH_PHIMOE : 2984case LLM_ARCH_PLAMO : 2985case LLM_ARCH_PLAMO2 : 2986case LLM_ARCH_PLAMO3 : 2987case LLM_ARCH_GEMMA : 2988case LLM_ARCH_GEMMA2 : 2989case LLM_ARCH_GEMMA3 : 2990case LLM_ARCH_GEMMA3N : 2991case LLM_ARCH_GEMMA4 : 2992case LLM_ARCH_GEMMA4_ASSISTANT : 2993case LLM_ARCH_GEMMA_EMBEDDING : 2994case LLM_ARCH_STARCODER2 : 2995case LLM_ARCH_OPENELM : 2996case LLM_ARCH_GPTNEOX : 2997case LLM_ARCH_CODESHELL : 2998case LLM_ARCH_ORION : 2999case LLM_ARCH_NEMOTRON : 3000case LLM_ARCH_EXAONE : 3001case LLM_ARCH_EXAONE4 : 3002case LLM_ARCH_EXAONE_MOE : 3003case LLM_ARCH_MINICPM3 : 3004case LLM_ARCH_BAILINGMOE2 : 3005case LLM_ARCH_DOTS1 : 3006case LLM_ARCH_HUNYUAN_MOE : 3007case LLM_ARCH_JAIS2 : 3008case LLM_ARCH_OPENAI_MOE : 3009case LLM_ARCH_HUNYUAN_DENSE : 3010case LLM_ARCH_HY_V3 : 3011case LLM_ARCH_LFM2 : 3012case LLM_ARCH_LFM2MOE : 3013case LLM_ARCH_SMALLTHINKER : 3014case LLM_ARCH_SEED_OSS : 3015case LLM_ARCH_GROVEMOE : 3016case LLM_ARCH_APERTUS : 3017case LLM_ARCH_MINIMAX_01 : 3018case LLM_ARCH_MINIMAX_M2 : 3019case LLM_ARCH_MINIMAX_M3 : 3020case LLM_ARCH_COGVLM : 3021case LLM_ARCH_PANGU_EMBED : 3022case LLM_ARCH_AFMOE : 3023case LLM_ARCH_LAGUNA : 3024case LLM_ARCH_QWEN3NEXT : 3025case LLM_ARCH_MIMO2 : 3026case LLM_ARCH_STEP35 : 3027case LLM_ARCH_SPARK2_5 : 3028case LLM_ARCH_TALKIE : 3029case LLM_ARCH_MELLUM : 3030case LLM_ARCH_MAPLE : 3031case LLM_ARCH_ALICEAI_T5_MOE : 3032return LLAMA_ROPE_TYPE_NEOX ; 3033 3034case LLM_ARCH_DFLASH : 3035// drafts for M-RoPE targets carry rope sections and follow the target's temporal dim 3036if (const auto & s = model -> hparams .rope_sections ;s [0 ]|| s [1 ]|| s [2 ]|| s [3 ]) { 3037return LLAMA_ROPE_TYPE_MROPE ; 3038 } 3039// DSV4 DSpark drafters use DeepSeek-V4's normal RoPE; legacy DFlash backbones are NeoX 3040return model -> hparams .dsv4_hc_mult > 0 ?LLAMA_ROPE_TYPE_NORM :LLAMA_ROPE_TYPE_NEOX ; 3041 3042case LLM_ARCH_QWEN2VL : 3043case LLM_ARCH_PADDLEOCR : 3044return LLAMA_ROPE_TYPE_MROPE ; 3045case LLM_ARCH_QWEN3VL : 3046case LLM_ARCH_QWEN3VLMOE : 3047case LLM_ARCH_QWEN35 : 3048case LLM_ARCH_QWEN35MOE : 3049case LLM_ARCH_QWEN4EXP : 3050case LLM_ARCH_QWEN3TTS : 3051return LLAMA_ROPE_TYPE_IMROPE ; 3052 3053case LLM_ARCH_GLM4 : 3054return model -> hparams .use_mrope () ?LLAMA_ROPE_TYPE_MROPE :LLAMA_ROPE_TYPE_NORM ; 3055case LLM_ARCH_GLM4_MOE : 3056return model -> hparams .use_mrope () ?LLAMA_ROPE_TYPE_MROPE :LLAMA_ROPE_TYPE_NEOX ; 3057 3058case LLM_ARCH_HUNYUAN_VL : 3059return model -> hparams .use_mrope () ?LLAMA_ROPE_TYPE_MROPE :LLAMA_ROPE_TYPE_NEOX ; 3060 3061// all model arches should be listed explicitly here 3062case LLM_ARCH_UNKNOWN : 3063GGML_ABORT ("unknown architecture" ); 3064 } 3065 3066return LLAMA_ROPE_TYPE_NONE ; 3067} 3068 3069float llama_model_rope_freq_scale_train (const llama_model * model ) { 3070return model -> hparams .rope_freq_scale_train ; 3071} 3072 3073int32_t llama_model_meta_val_str (const llama_model * model ,const char * key ,char * buf ,size_t buf_size ) { 3074const auto & it = model -> gguf_kv .find (key ); 3075if (it == model -> gguf_kv .end ()) { 3076if (buf_size > 0 ) { 3077buf [0 ]= '\0' ; 3078 } 3079return -1 ; 3080 } 3081return snprintf (buf ,buf_size ,"%s" ,it -> second .c_str ()); 3082} 3083 3084int32_t llama_model_meta_count (const llama_model * model ) { 3085return (int )model -> gguf_kv .size (); 3086} 3087 3088const char * llama_model_meta_key_str (llama_model_meta_key key ) { 3089switch (key ) { 3090case LLAMA_MODEL_META_KEY_SAMPLING_SEQUENCE :return "general.sampling.sequence" ; 3091case LLAMA_MODEL_META_KEY_SAMPLING_TOP_K :return "general.sampling.top_k" ; 3092case LLAMA_MODEL_META_KEY_SAMPLING_TOP_P :return "general.sampling.top_p" ; 3093case LLAMA_MODEL_META_KEY_SAMPLING_MIN_P :return "general.sampling.min_p" ; 3094case LLAMA_MODEL_META_KEY_SAMPLING_XTC_PROBABILITY :return "general.sampling.xtc_probability" ; 3095case LLAMA_MODEL_META_KEY_SAMPLING_XTC_THRESHOLD :return "general.sampling.xtc_threshold" ; 3096case LLAMA_MODEL_META_KEY_SAMPLING_TEMP :return "general.sampling.temp" ; 3097case LLAMA_MODEL_META_KEY_SAMPLING_PENALTY_LAST_N :return "general.sampling.penalty_last_n" ; 3098case LLAMA_MODEL_META_KEY_SAMPLING_PENALTY_REPEAT :return "general.sampling.penalty_repeat" ; 3099case LLAMA_MODEL_META_KEY_SAMPLING_MIROSTAT :return "general.sampling.mirostat" ; 3100case LLAMA_MODEL_META_KEY_SAMPLING_MIROSTAT_TAU :return "general.sampling.mirostat_tau" ; 3101case LLAMA_MODEL_META_KEY_SAMPLING_MIROSTAT_ETA :return "general.sampling.mirostat_eta" ; 3102default :return nullptr ; 3103 } 3104} 3105 3106int32_t llama_model_meta_key_by_index (const llama_model * model ,int i ,char * buf ,size_t buf_size ) { 3107if (i < 0 || i >= (int )model -> gguf_kv .size ()) { 3108if (buf_size > 0 ) { 3109buf [0 ]= '\0' ; 3110 } 3111return -1 ; 3112 } 3113auto it = model -> gguf_kv .begin (); 3114 std::advance (it ,i ); 3115return snprintf (buf ,buf_size ,"%s" ,it -> first .c_str ()); 3116} 3117 3118int32_t llama_model_meta_val_str_by_index (const llama_model * model ,int32_t i ,char * buf ,size_t buf_size ) { 3119if (i < 0 || i >= (int )model -> gguf_kv .size ()) { 3120if (buf_size > 0 ) { 3121buf [0 ]= '\0' ; 3122 } 3123return -1 ; 3124 } 3125auto it = model -> gguf_kv .begin (); 3126 std::advance (it ,i ); 3127return snprintf (buf ,buf_size ,"%s" ,it -> second .c_str ()); 3128} 3129 3130int32_t llama_model_desc (const llama_model * model ,char * buf ,size_t buf_size ) { 3131return snprintf (buf ,buf_size ,"%s" ,model -> desc ().c_str ()); 3132} 3133 3134llama_ftype llama_model_ftype (const llama_model * model ) { 3135return model -> ftype (); 3136} 3137 3138uint64_t llama_model_size (const llama_model * model ) { 3139return model -> size (); 3140} 3141 3142const char * llama_model_chat_template (const llama_model * model ,const char * name ) { 3143const auto key = name ?LLM_KV (model -> arch ,name )(LLM_KV_TOKENIZER_CHAT_TEMPLATE ) 3144 :LLM_KV (model -> arch )(LLM_KV_TOKENIZER_CHAT_TEMPLATE ); 3145const auto & it = model -> gguf_kv .find (key ); 3146if (it == model -> gguf_kv .end ()) { 3147// one-off fix for very popular models (so we are not flooded with issues) 3148// do not extend this list unless absolutely necessary 3149// Mistral-Small-2503 does not have built-in chat template 3150llama_vocab_pre_type pre_type = model -> vocab .get_pre_type (); 3151if (!name && pre_type == LLAMA_VOCAB_PRE_TYPE_TEKKEN && model -> layers .size ()== 40 ) { 3152return "mistral-v7-tekken" ; 3153 } 3154 3155return nullptr ; 3156 } 3157 3158return it -> second .c_str (); 3159} 3160 3161uint64_t llama_model_n_params (const llama_model * model ) { 3162return model -> n_elements (); 3163} 3164 3165bool llama_model_has_encoder (const llama_model * model ) { 3166switch (model -> arch ) { 3167case LLM_ARCH_ALICEAI_T5_MOE : 3168case LLM_ARCH_T5 : 3169case LLM_ARCH_T5ENCODER : 3170case LLM_ARCH_EAGLE3 : 3171case LLM_ARCH_DFLASH :return true; 3172default :return false; 3173 } 3174} 3175 3176bool llama_model_has_decoder (const llama_model * model ) { 3177switch (model -> arch ) { 3178case LLM_ARCH_T5ENCODER :return false; 3179default :return true; 3180 } 3181} 3182 3183llama_token llama_model_decoder_start_token (const llama_model * model ) { 3184return model -> hparams .dec_start_token_id ; 3185} 3186 3187bool llama_model_is_recurrent (const llama_model * model ) { 3188return llm_arch_is_recurrent (model -> arch ); 3189} 3190 3191bool llama_model_is_hybrid (const llama_model * model ) { 3192return llm_arch_is_hybrid (model -> arch ); 3193} 3194 3195bool llama_model_is_diffusion (const llama_model * model ) { 3196return llm_arch_is_diffusion (model -> arch ); 3197} 3198 3199const std::vector < std::pair < std::string ,ggml_tensor *>> & llama_internal_get_tensor_map (const llama_model * model ) { 3200return model -> tensors_by_name ; 3201} 3202 3203int32_t llama_model_n_expert (const struct llama_model * model ) { 3204return model -> hparams .n_expert ; 3205} 3206 3207int32_t llama_model_n_devices (const struct llama_model * model ) { 3208return (int32_t )model -> devices .size (); 3209} 3210 3211ggml_backend_dev_t llama_model_get_device (const struct llama_model * model ,int i ) { 3212if (i < 0 || i >= (int )model -> devices .size ()) { 3213return nullptr ; 3214 } 3215return model -> devices [i ].dev ; 3216} 3217 3218// 3219// llama_model_base 3220// 3221 3222llama_model_base::llama_model_base (const struct llama_model_params & params ) :llama_model (params ),model (this ),tn (model -> arch ), 3223TENSOR_DUPLICATED (llama_model_loader::TENSOR_DUPLICATED ), 3224TENSOR_NOT_REQUIRED (llama_model_loader::TENSOR_NOT_REQUIRED ), 3225TENSOR_SKIP (llama_model_loader::TENSOR_SKIP ), 3226TENSOR_SKIP_IF_VIRTUAL (llama_model_loader::TENSOR_SKIP_IF_VIRTUAL ), 3227TENSOR_ALLOW_RESHAPE (llama_model_loader::TENSOR_ALLOW_RESHAPE ), 3228TENSOR_READ_LAZY (llama_model_loader::TENSOR_READ_LAZY ) {} 3229 3230ggml_tensor * llama_model_base::create_tensor (const LLM_TN_IMPL & tn ,const std::initializer_list < int64_t > & ne ,int flags ) { 3231GGML_ASSERT (ml != nullptr ); 3232return create_tensor (* ml ,tn ,ne ,flags ); 3233} 3234 3235void llama_model_base::create_tensor_gate_up_exps (llama_layer & layer ,int bid ,int64_t n_embd_ ,int64_t n_ff_ ,int64_t n_expert_ ,int flags ) { 3236layer .ffn_gate_up_exps = create_tensor (tn (LLM_TENSOR_FFN_GATE_UP_EXPS ,"weight" ,bid ), {n_embd_ ,n_ff_ * 2 ,n_expert_ },TENSOR_NOT_REQUIRED ); 3237if (layer .ffn_gate_up_exps == nullptr ) { 3238layer .ffn_gate_exps = create_tensor (tn (LLM_TENSOR_FFN_GATE_EXPS ,"weight" ,bid ), {n_embd_ ,n_ff_ ,n_expert_ },flags ); 3239layer .ffn_up_exps = create_tensor (tn (LLM_TENSOR_FFN_UP_EXPS ,"weight" ,bid ), {n_embd_ ,n_ff_ ,n_expert_ },flags ); 3240 } 3241} 3242 3243void llama_model_base::create_tensor_qkv (llama_layer & layer ,int bid , 3244int64_t n_embd_ ,int64_t n_embd_q_ ,int64_t n_embd_k_ ,int64_t n_embd_v_ , 3245int flags ) { 3246const int64_t n_embd_qkv = n_embd_q_ + n_embd_k_ + n_embd_v_ ; 3247 3248if (flags & TENSOR_SKIP ) { 3249const int skip = TENSOR_NOT_REQUIRED |TENSOR_SKIP ; 3250 3251create_tensor (tn (LLM_TENSOR_ATTN_QKV ,"weight" ,bid ), {n_embd_ ,n_embd_qkv },skip |TENSOR_SKIP_IF_VIRTUAL ); 3252create_tensor (tn (LLM_TENSOR_ATTN_QKV ,"bias" ,bid ), {n_embd_qkv },skip |TENSOR_SKIP_IF_VIRTUAL ); 3253create_tensor (tn (LLM_TENSOR_ATTN_Q ,"weight" ,bid ), {n_embd_ ,n_embd_q_ },skip ); 3254create_tensor (tn (LLM_TENSOR_ATTN_K ,"weight" ,bid ), {n_embd_ ,n_embd_k_ },skip ); 3255create_tensor (tn (LLM_TENSOR_ATTN_V ,"weight" ,bid ), {n_embd_ ,n_embd_v_ },skip ); 3256create_tensor (tn (LLM_TENSOR_ATTN_Q ,"bias" ,bid ), {n_embd_q_ },skip ); 3257create_tensor (tn (LLM_TENSOR_ATTN_K ,"bias" ,bid ), {n_embd_k_ },skip ); 3258create_tensor (tn (LLM_TENSOR_ATTN_V ,"bias" ,bid ), {n_embd_v_ },skip ); 3259return ; 3260 } 3261 3262layer .wqkv = create_tensor (tn (LLM_TENSOR_ATTN_QKV ,"weight" ,bid ), {n_embd_ ,n_embd_qkv },TENSOR_NOT_REQUIRED |TENSOR_SKIP_IF_VIRTUAL ); 3263if (layer .wqkv ) { 3264layer .wqkv_b = create_tensor (tn (LLM_TENSOR_ATTN_QKV ,"bias" ,bid ), {n_embd_qkv },TENSOR_NOT_REQUIRED |TENSOR_SKIP_IF_VIRTUAL ); 3265// Fused weights may coexist with separate Q/K/V biases in legacy or custom GGUFs. 3266if (!layer .wqkv_b ) { 3267layer .wq_b = create_tensor (tn (LLM_TENSOR_ATTN_Q ,"bias" ,bid ), {n_embd_q_ },TENSOR_NOT_REQUIRED ); 3268layer .wk_b = create_tensor (tn (LLM_TENSOR_ATTN_K ,"bias" ,bid ), {n_embd_k_ },TENSOR_NOT_REQUIRED ); 3269layer .wv_b = create_tensor (tn (LLM_TENSOR_ATTN_V ,"bias" ,bid ), {n_embd_v_ },TENSOR_NOT_REQUIRED ); 3270 } 3271 }else { 3272layer .wq = create_tensor (tn (LLM_TENSOR_ATTN_Q ,"weight" ,bid ), {n_embd_ ,n_embd_q_ },flags ); 3273layer .wk = create_tensor (tn (LLM_TENSOR_ATTN_K ,"weight" ,bid ), {n_embd_ ,n_embd_k_ },flags ); 3274layer .wv = create_tensor (tn (LLM_TENSOR_ATTN_V ,"weight" ,bid ), {n_embd_ ,n_embd_v_ },flags ); 3275layer .wq_b = create_tensor (tn (LLM_TENSOR_ATTN_Q ,"bias" ,bid ), {n_embd_q_ },TENSOR_NOT_REQUIRED ); 3276layer .wk_b = create_tensor (tn (LLM_TENSOR_ATTN_K ,"bias" ,bid ), {n_embd_k_ },TENSOR_NOT_REQUIRED ); 3277layer .wv_b = create_tensor (tn (LLM_TENSOR_ATTN_V ,"bias" ,bid ), {n_embd_v_ },TENSOR_NOT_REQUIRED ); 3278 } 3279} 3280 3281const int32_t * llama_model_target_layer_ids (const struct llama_model * model ) { 3282const auto & v = model -> target_layer_ids ; 3283return v .empty () ?nullptr :v .data (); 3284} 3285 3286uint32_t llama_model_target_layer_ids_n (const struct llama_model * model ) { 3287return (uint32_t )model -> target_layer_ids .size (); 3288} 3289 3290uint32_t llama_model_get_tok_embd (const struct llama_model * model ,float * out ) { 3291if (model -> vocab .n_tokens ()== 0 || model -> tok_embd == nullptr ) { 3292return 0 ; 3293 } 3294 3295const ggml_tensor * tensor = model -> tok_embd ; 3296const size_t nelements = ggml_nelements (tensor ); 3297GGML_ASSERT (nelements <=UINT32_MAX );// for the return type 3298 3299if (out == nullptr ) { 3300return (uint32_t )nelements ; 3301 } 3302 3303if (tensor -> type == GGML_TYPE_F32 ) { 3304ggml_backend_tensor_get (tensor ,out ,0 ,nelements * sizeof (float )); 3305return (uint32_t )nelements ; 3306 } 3307 3308 std::vector < uint8_t > buf (ggml_nbytes (tensor )); 3309ggml_backend_tensor_get (tensor ,buf .data (),0 ,buf .size ()); 3310 3311const ggml_type_traits * traits = ggml_get_type_traits (tensor -> type ); 3312if (tensor -> type == GGML_TYPE_F16 ) { 3313ggml_fp16_to_fp32_row ((const ggml_fp16_t * )buf .data (),out ,nelements ); 3314 }else if (tensor -> type == GGML_TYPE_BF16 ) { 3315ggml_bf16_to_fp32_row ((const ggml_bf16_t * )buf .data (),out ,nelements ); 3316 }else if (ggml_is_quantized (tensor -> type )&& traits -> to_float != nullptr ) { 3317traits -> to_float (buf .data (),out ,nelements ); 3318 }else { 3319GGML_ABORT ("unsupported tensor type for dequantization: %s" ,ggml_type_name (tensor -> type )); 3320 } 3321 3322return (uint32_t )nelements ; 3323}