Coverage Report

Created: 2026-07-16 06:35

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