echodict/llama.cpp
version https://git-lfs.github.com/spec/v1 oid sha256:cfc44b7ba25614df70e6b65e3341cae0310163bd32fd31a6b928a542df433faf size 30786
0604
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-memory-hybrid.h"14#include "llama-memory-hybrid-iswa.h"15#include "llama-memory-recurrent.h"16 17#include "models/models.h"18 19#include "ggml.h"20#include "ggml-cpp.h"21 22#include <algorithm>23#include <cassert>24#include <cfloat>25#include <cstdint>26#include <cstring>27#include <cmath>28#include <functional>29#include <map>30#include <numeric>31#include <regex>32#include <sstream>33#include <stdexcept>34#include <string>35#include <vector>36 37struct ggml_backend_meta_split_state llama_meta_device_get_split_state(const struct ggml_tensor * tensor, void * userdata) {38 const llama_meta_device_get_split_state_userdata * ud = (const llama_meta_device_get_split_state_userdata *) userdata;39 const llama_hparams & hparams = ud->model->hparams;40 const std::string tensor_name = tensor->name;41 42 const std::regex pattern_q_weight ("blk\\.\\d*\\.attn_q.weight");43 const std::regex pattern_kv_weight ("blk\\.\\d*\\.attn_(k|v).weight");44 const std::regex pattern_qkv_weight ("blk\\.\\d*\\.attn_qkv.weight");45 const std::regex pattern_q_bias ("blk\\.\\d*\\.attn_q\\.bias");46 const std::regex pattern_kv_bias ("blk\\.\\d*\\.attn_(k|v)\\.bias");47 const std::regex pattern_qkv_bias ("blk\\.\\d*\\.attn_qkv.bias");48 const std::regex pattern_qk_norm ("blk\\.\\d*\\.attn_(q|k)_norm\\.weight");49 const std::regex pattern_kv_cache ("cache_(k|v)_l\\d*");50 const std::regex pattern_attn_sinks ("blk\\.\\d*\\.attn_sinks.weight");51 const std::regex pattern_attn_out_weight ("blk\\.\\d*\\.attn_output.weight");52 const std::regex pattern_attn_out_bias ("blk\\.\\d*\\.attn_output.bias");53 const std::regex pattern_attn_gate_weight("blk\\.\\d*\\.attn_gate.weight");54 55 const std::regex pattern_ssm_dt ("blk\\.\\d*\\.ssm_dt.bias");56 const std::regex pattern_ssm_a ("blk\\.\\d*\\.ssm_a");57 const std::regex pattern_ssm_alpha ("blk\\.\\d*\\.ssm_alpha.weight");58 const std::regex pattern_ssm_beta ("blk\\.\\d*\\.ssm_beta.weight");59 const std::regex pattern_ssm_beta_alpha ("blk\\.\\d*\\.ssm_ba.weight");60 const std::regex pattern_r_cache ("cache_r_l\\d*");61 const std::regex pattern_s_cache ("cache_s_l\\d*");62 const std::regex pattern_ssm_conv1d ("blk\\.\\d*\\.ssm_conv1d.weight");63 const std::regex pattern_ssm_out_weight ("blk\\.\\d*\\.ssm_out.weight");64 65 const std::regex pattern_ffn_up_gate_weight("blk\\.\\d*\\.ffn_(up|gate)(_exps)?.weight");66 const std::regex pattern_ffn_up_gate_bias ("blk\\.\\d*\\.ffn_(up|gate)(_exps)?.bias");67 const std::regex pattern_ffn_gate_up_weight("blk\\.\\d*\\.ffn_gate_up(_exps)?.weight");68 const std::regex pattern_ffn_down_weight ("blk\\.\\d*\\.ffn_down(_exps)?.weight");69 const std::regex pattern_ffn_down_bias ("blk\\.\\d*\\.ffn_down.bias");70 const std::regex pattern_ffn_down_exps_bias("blk\\.\\d*\\.ffn_down_exps.bias");71 72 const std::regex pattern_output_weight("output\\.weight");73 const std::regex pattern_output_bias ("output\\.bias");74 75 struct tensor_config {76 ggml_backend_meta_split_axis axis;77 78 const ggml_tensor * tensor_axis_0;79 80 uint32_t il;81 size_t rotation; // when assigning tensor slices, rotate how the rounding is done for more even allocation82 };83 84 auto get_tensor_config_impl = [&](85 const ggml_backend_meta_split_axis axis, const std::string & suffix = "", const std::string & suffix_fallback = "") -> tensor_config {86 // the layers in a tensor can be inhomogeneous, if the pattern is cleanly divided by the number of GPUs there can be aliasing effects,87 // count only the same type of previous layers to avoid this88 auto get_il_eff = [&](const size_t il){89 size_t ret = 0;90 const bool il_is_recurrent = hparams.is_recurrent(il);91 const bool il_is_swa = hparams.is_swa(il);92 for (size_t il_prev = 0; il_prev < il; il_prev++) {93 ret += hparams.is_recurrent(il_prev) == il_is_recurrent && hparams.is_swa(il_prev) == il_is_swa;94 }95 return ret;96 };97 98 uint32_t il;99 std::string prefix;100 size_t rotation;101 if (tensor_name.substr(0, 4) == "blk.") {102 const size_t length_prefix = tensor_name.find('.', 4);103 GGML_ASSERT(length_prefix != std::string::npos);104 prefix = tensor_name.substr(0, length_prefix + 1);105 il = std::stoull(tensor_name.substr(4, length_prefix));106 rotation = get_il_eff(il) % ud->n_devices;107 } else if (tensor_name.substr(0, 6) == "cache_") {108 const size_t layer_index_start = tensor_name.find("_l", 6);109 GGML_ASSERT(layer_index_start != std::string::npos);110 il = std::stoull(tensor_name.substr(layer_index_start + 2));111 prefix = "blk." + std::to_string(il) + ".";112 rotation = get_il_eff(il) % ud->n_devices;113 } else {114 il = 0;115 rotation = hparams.n_layer % ud->n_devices;116 }117 const ggml_tensor * tensor_axis_0 = suffix.empty() ? tensor : ud->model->get_tensor((prefix + suffix).c_str());118 if (tensor_axis_0 == nullptr) {119 GGML_ASSERT(!suffix_fallback.empty());120 tensor_axis_0 = ud->model->get_tensor((prefix + suffix_fallback).c_str());121 }122 GGML_ASSERT(tensor_axis_0 != nullptr);123 return {axis, tensor_axis_0, il, rotation};124 };125 126 auto get_tensor_config = [&]() -> tensor_config {127 // standard attention128 if (std::regex_match(tensor_name, pattern_q_weight) || std::regex_match(tensor_name, pattern_kv_weight)) {129 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_1, "attn_output.weight");130 }131 if (std::regex_match(tensor_name, pattern_q_bias) || std::regex_match(tensor_name, pattern_kv_bias)) {132 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_0, "attn_output.weight");133 }134 if (std::regex_match(tensor_name, pattern_qkv_weight)) {135 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_1);136 }137 if ( std::regex_match(tensor_name, pattern_qkv_bias)) {138 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_0);139 }140 if (std::regex_match(tensor_name, pattern_qk_norm)) {141 return get_tensor_config_impl(tensor->ne[1] == 1 ? GGML_BACKEND_SPLIT_AXIS_MIRRORED : GGML_BACKEND_SPLIT_AXIS_1, "attn_output.weight");142 }143 if (std::regex_match(tensor_name, pattern_kv_cache) || std::regex_match(tensor_name, pattern_attn_sinks)) {144 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_0, "attn_output.weight");145 }146 if (std::regex_match(tensor_name, pattern_attn_out_weight)) {147 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_0);148 }149 if (std::regex_match(tensor_name, pattern_attn_out_bias)) {150 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_MIRRORED);151 }152 153 if (std::regex_match(tensor_name, pattern_attn_gate_weight)) {154 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_1);155 }156 if (std::regex_match(tensor_name, pattern_ssm_dt) || std::regex_match(tensor_name, pattern_ssm_a)) {157 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_0, "ssm_out.weight");158 }159 if (std::regex_match(tensor_name, pattern_ssm_alpha) || std::regex_match(tensor_name, pattern_ssm_beta) ||160 std::regex_match(tensor_name, pattern_ssm_beta_alpha)) {161 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_1, "ssm_out.weight");162 }163 if (std::regex_match(tensor_name, pattern_r_cache) || std::regex_match(tensor_name, pattern_s_cache)) {164 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_0, "ssm_out.weight");165 }166 if (std::regex_match(tensor_name, pattern_ssm_conv1d)) {167 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_1, "ssm_out.weight");168 }169 if (std::regex_match(tensor_name, pattern_ssm_out_weight)) {170 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_0);171 }172 173 // FFN174 if (std::regex_match(tensor_name, pattern_ffn_up_gate_weight)) {175 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_1, "ffn_down.weight", "ffn_down_exps.weight");176 }177 if (std::regex_match(tensor_name, pattern_ffn_up_gate_bias)) {178 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_0, "ffn_down.weight", "ffn_down_exps.weight");179 }180 if (std::regex_match(tensor_name, pattern_ffn_gate_up_weight)) {181 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_1, "ffn_down.weight", "ffn_down_exps.weight");182 }183 if (std::regex_match(tensor_name, pattern_ffn_down_weight)) {184 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_0, "ffn_down.weight", "ffn_down_exps.weight");185 }186 if (std::regex_match(tensor_name, pattern_ffn_down_bias)) {187 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_MIRRORED);188 }189 if (std::regex_match(tensor_name, pattern_ffn_down_exps_bias)) {190 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_PARTIAL);191 }192 193 // output194 if (std::regex_match(tensor_name, pattern_output_weight)) {195 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_1);196 }197 if (std::regex_match(tensor_name, pattern_output_bias)) {198 const ggml_tensor * output_weight = ud->model->get_tensor("output.weight");199 GGML_ASSERT(output_weight != nullptr);200 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_0);201 }202 203 // everything else204 return get_tensor_config_impl(GGML_BACKEND_SPLIT_AXIS_MIRRORED);205 };206 207 auto get_split_segments = [&](int axis, uint32_t il) -> std::vector<int64_t> {208 if (ud->model->arch == LLM_ARCH_QWEN3NEXT || ud->model->arch == LLM_ARCH_QWEN35 || ud->model->arch == LLM_ARCH_QWEN35MOE) {209 const int64_t head_k_dim = hparams.ssm_d_state;210 const int64_t head_v_dim = hparams.ssm_d_state;211 const int64_t n_k_heads = hparams.ssm_n_group;212 const int64_t n_v_heads = hparams.ssm_dt_rank;213 const int64_t key_dim = head_k_dim * n_k_heads;214 const int64_t value_dim = head_v_dim * n_v_heads;215 216 // both Qwen 3 Next and Qwen 3.5 support n_v_heads > n_k_heads but the broadcasting pattern is different:217 // - Qwen 3 Next: [k0_v0, k0_v1, k1_v2, k1_v3] (this is the default split pattern)218 // - 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)219 if (ud->model->arch == LLM_ARCH_QWEN3NEXT) {220 if (std::regex_match(tensor_name, pattern_qkv_weight) || std::regex_match(tensor_name, pattern_ssm_conv1d)) {221 GGML_ASSERT(tensor->ne[axis] == 2*key_dim + value_dim);222 return {key_dim, key_dim, value_dim};223 }224 } else {225 const int64_t head_ratio = n_v_heads / n_k_heads;226 if (std::regex_match(tensor_name, pattern_qkv_weight) || std::regex_match(tensor_name, pattern_ssm_conv1d)) {227 GGML_ASSERT(tensor->ne[axis] == 2*key_dim + value_dim);228 return std::vector<int64_t>(2 + head_ratio, key_dim);229 }230 if (std::regex_match(tensor_name, pattern_attn_gate_weight) || std::regex_match(tensor_name, pattern_ssm_out_weight)) {231 return std::vector<int64_t>(head_ratio, key_dim);232 }233 if (std::regex_match(tensor_name, pattern_ssm_dt) || std::regex_match(tensor_name, pattern_ssm_a) ||234 std::regex_match(tensor_name, pattern_ssm_alpha) || std::regex_match(tensor_name, pattern_ssm_beta)) {235 return std::vector<int64_t>(head_ratio, n_k_heads);236 }237 if (std::regex_match(tensor_name, pattern_r_cache)) {238 return std::vector<int64_t>(2 + head_ratio, key_dim * (hparams.ssm_d_conv - 1));239 }240 if (std::regex_match(tensor_name, pattern_s_cache)) {241 return std::vector<int64_t>(head_ratio, n_k_heads * head_v_dim * head_v_dim);242 }243 }244 245 // the FFN is the same for Qwen 3 Next and Qwen 3.5:246 if (std::regex_match(tensor_name, pattern_ffn_gate_up_weight)) {247 const int64_t n_ff_exp = hparams.n_ff_exp;248 GGML_ASSERT(tensor->ne[axis] == 2*n_ff_exp);249 return {n_ff_exp, n_ff_exp};250 }251 return {tensor->ne[axis]};252 }253 254 if (std::regex_match(tensor_name, pattern_qkv_weight) || std::regex_match(tensor_name, pattern_qkv_bias)) {255 const int64_t n_embd = hparams.n_embd;256 const int64_t n_embd_gqa = hparams.n_embd_v_gqa(il);257 GGML_ASSERT(hparams.n_embd_k_gqa() == n_embd_gqa);258 GGML_ASSERT(tensor->ne[axis] == n_embd + 2*n_embd_gqa);259 return {n_embd, n_embd_gqa, n_embd_gqa};260 }261 if (std::regex_match(tensor_name, pattern_ffn_gate_up_weight)) {262 const int64_t n_ff_exp = hparams.n_ff_exp;263 GGML_ASSERT(tensor->ne[axis] == 2*n_ff_exp);264 return {n_ff_exp, n_ff_exp};265 }266 return {tensor->ne[axis]};267 };268 269 auto get_split_granularity = [&](int64_t blck_size, uint32_t il, const std::vector<int64_t> & segments) -> std::vector<int64_t> {270 if (hparams.is_recurrent(il)) {271 // linear attention272 const int64_t head_dim = hparams.ssm_d_state;273 const int64_t granularity_qkv = std::lcm(blck_size, head_dim);274 if (std::regex_match(tensor_name, pattern_qkv_weight) || std::regex_match(tensor_name, pattern_attn_gate_weight) ||275 std::regex_match(tensor_name, pattern_ssm_conv1d) || std::regex_match(tensor_name, pattern_ssm_out_weight)) {276 return std::vector<int64_t>(segments.size(), granularity_qkv);277 }278 if (std::regex_match(tensor_name, pattern_ssm_dt) || std::regex_match(tensor_name, pattern_ssm_a) ||279 std::regex_match(tensor_name, pattern_ssm_alpha) || std::regex_match(tensor_name, pattern_ssm_beta)) {280 return std::vector<int64_t>(segments.size(), granularity_qkv / head_dim);281 }282 if (std::regex_match(tensor_name, pattern_ssm_beta_alpha)) {283 return std::vector<int64_t>(segments.size(), 2 * (granularity_qkv / head_dim));284 }285 if (std::regex_match(tensor_name, pattern_r_cache)) {286 return std::vector<int64_t>(segments.size(), granularity_qkv * (hparams.ssm_d_conv - 1));287 }288 if (std::regex_match(tensor_name, pattern_s_cache)) {289 return std::vector<int64_t>(segments.size(), granularity_qkv * head_dim);290 }291 } else {292 // regular attention293 const uint32_t n_gqa = hparams.n_gqa(il);294 const uint32_t n_embd_q = n_gqa * hparams.n_embd_head_k(il);295 if (std::regex_match(tensor_name, pattern_attn_sinks)) {296 GGML_ASSERT(segments.size() == 1);297 return {std::lcm(n_embd_q, blck_size)/n_embd_q * n_gqa};298 }299 300 const int64_t granularity_q = std::lcm(n_embd_q, blck_size);301 if (std::regex_match(tensor_name, pattern_q_weight) || std::regex_match(tensor_name, pattern_q_bias)) {302 GGML_ASSERT(segments.size() == 1);303 // some models have Q gate tensors, for those cases the granularity needs to be doubled:304 if (ud->model->arch == LLM_ARCH_QWEN3NEXT || ud->model->arch == LLM_ARCH_QWEN35 || ud->model->arch == LLM_ARCH_QWEN35MOE) {305 return {std::lcm(2*n_embd_q, blck_size)};306 }307 return {granularity_q};308 }309 if (std::regex_match(tensor_name, pattern_attn_out_weight)) {310 GGML_ASSERT(segments.size() == 1);311 return {granularity_q};312 }313 314 const int64_t granularity_kv = granularity_q / n_gqa;315 if (std::regex_match(tensor_name, pattern_kv_weight) ||316 std::regex_match(tensor_name, pattern_kv_bias) ||317 std::regex_match(tensor_name, pattern_kv_cache)) {318 GGML_ASSERT(segments.size() == 1);319 return {granularity_kv};320 }321 if (std::regex_match(tensor_name, pattern_qkv_weight) || std::regex_match(tensor_name, pattern_qkv_bias)) {322 GGML_ASSERT(segments.size() == 3);323 return {granularity_q, granularity_kv, granularity_kv};324 }325 }326 327 // FFN328 if (std::regex_match(tensor_name, pattern_ffn_up_gate_weight) || std::regex_match(tensor_name, pattern_ffn_up_gate_bias) ||329 std::regex_match(tensor_name, pattern_ffn_gate_up_weight) || std::regex_match(tensor_name, pattern_ffn_down_weight)) {330 GGML_ASSERT(segments.size() <= 2);331 return std::vector<int64_t>(segments.size(), blck_size);332 }333 334 // everything else335 GGML_ASSERT(segments.size() == 1);336 return {1};337 };338 339 ggml_backend_meta_split_state split_state;340 memset(&split_state, 0, sizeof(split_state));341 tensor_config tc = get_tensor_config();342 split_state.axis = tc.axis;343 if (split_state.axis >= 0 && split_state.axis < GGML_MAX_DIMS) {344 const int64_t ne_full = tensor->ne[split_state.axis];345 const int64_t blck_size = ggml_blck_size(tc.tensor_axis_0->type);346 const float * tensor_split = ud->model->tensor_split();347 std::vector<float> tensor_split_scan;348 tensor_split_scan.reserve(ud->n_devices);349 for (size_t j = 0; j < ud->n_devices; j++) {350 tensor_split_scan.push_back(tensor_split == nullptr ? 0.0f : tensor_split[(j + tc.rotation) % ud->n_devices]);351 if (j > 0) {352 tensor_split_scan[j] += tensor_split_scan[j - 1];353 }354 }355 const std::vector<int64_t> segments = get_split_segments(split_state.axis, tc.il);356 const std::vector<int64_t> granularity = get_split_granularity(blck_size, tc.il, segments);357 for (size_t is = 0; is < segments.size(); is++) {358 const int64_t ne_s = segments[is];359 const int64_t g_s = granularity[is];360 GGML_ASSERT(ne_full % g_s == 0);361 int64_t low = 0;362 size_t j = 0;363 for (; j < ud->n_devices - 1; j++) {364 int64_t high = tensor_split_scan.back() == 0.0f ?365 ne_s * (j+1)/ud->n_devices : ne_s * tensor_split_scan[j]/tensor_split_scan.back();366 if (high % g_s != 0) {367 high -= high % g_s;368 }369 split_state.ne[is*ud->n_devices + (j + tc.rotation) % ud->n_devices] = high - low;370 low = high;371 }372 split_state.ne[is*ud->n_devices + (j + tc.rotation) % ud->n_devices] = ne_s - low;373 }374 split_state.n_segments = segments.size();375 } else {376 memset(split_state.ne, 0, sizeof(split_state.ne));377 split_state.n_segments = 1;378 }379 return split_state;380 GGML_UNUSED(userdata);381}382 383const char * llm_type_name(llm_type type) {384 switch (type) {385 case LLM_TYPE_14M: return "14M";386 case LLM_TYPE_17M: return "17M";387 case LLM_TYPE_22M: return "22M";388 case LLM_TYPE_33M: return "33M";389 case LLM_TYPE_47M: return "47M";390 case LLM_TYPE_60M: return "60M";391 case LLM_TYPE_70M: return "70M";392 case LLM_TYPE_80M: return "80M";393 case LLM_TYPE_109M: return "109M";394 case LLM_TYPE_137M: return "137M";395 case LLM_TYPE_140M: return "140M";396 case LLM_TYPE_149M: return "149M";397 case LLM_TYPE_160M: return "160M";398 case LLM_TYPE_190M: return "190M";399 case LLM_TYPE_220M: return "220M";400 case LLM_TYPE_250M: return "250M";401 case LLM_TYPE_256M: return "256M";402 case LLM_TYPE_270M: return "270M";403 case LLM_TYPE_335M: return "335M";404 case LLM_TYPE_350M: return "350M";405 case LLM_TYPE_360M: return "360M";406 case LLM_TYPE_395M: return "395M";407 case LLM_TYPE_410M: return "410M";408 case LLM_TYPE_450M: return "450M";409 case LLM_TYPE_475M: return "475M";410 case LLM_TYPE_558M: return "558M";411 case LLM_TYPE_700M: return "700M";412 case LLM_TYPE_770M: return "770M";413 case LLM_TYPE_780M: return "780M";414 case LLM_TYPE_950M: return "950M";415 case LLM_TYPE_0_3B: return "0.3B";416 case LLM_TYPE_0_5B: return "0.5B";417 case LLM_TYPE_0_6B: return "0.6B";418 case LLM_TYPE_0_8B: return "0.8B";419 case LLM_TYPE_1B: return "1B";420 case LLM_TYPE_1_2B: return "1.2B";421 case LLM_TYPE_1_3B: return "1.3B";422 case LLM_TYPE_1_4B: return "1.4B";423 case LLM_TYPE_1_5B: return "1.5B";424 case LLM_TYPE_1_6B: return "1.6B";425 case LLM_TYPE_1_7B: return "1.7B";426 case LLM_TYPE_1_8B: return "1.8B";427 case LLM_TYPE_2B: return "2B";428 case LLM_TYPE_2_6B: return "2.6B";429 case LLM_TYPE_2_8B: return "2.8B";430 case LLM_TYPE_2_9B: return "2.9B";431 case LLM_TYPE_3B: return "3B";432 case LLM_TYPE_4B: return "4B";433 case LLM_TYPE_6B: return "6B";434 case LLM_TYPE_6_9B: return "6.9B";435 case LLM_TYPE_7B: return "7B";436 case LLM_TYPE_8B: return "8B";437 case LLM_TYPE_9B: return "9B";438 case LLM_TYPE_11B: return "11B";439 case LLM_TYPE_12B: return "12B";440 case LLM_TYPE_13B: return "13B";441 case LLM_TYPE_14B: return "14B";442 case LLM_TYPE_15B: return "15B";443 case LLM_TYPE_16B: return "16B";444 case LLM_TYPE_20B: return "20B";445 case LLM_TYPE_26B: return "26B";446 case LLM_TYPE_27B: return "27B";447 case LLM_TYPE_30B: return "30B";448 case LLM_TYPE_31B: return "31B";449 case LLM_TYPE_32B: return "32B";450 case LLM_TYPE_34B: return "34B";451 case LLM_TYPE_35B: return "35B";452 case LLM_TYPE_36B: return "36B";453 case LLM_TYPE_40B: return "40B";454 case LLM_TYPE_65B: return "65B";455 case LLM_TYPE_70B: return "70B";456 case LLM_TYPE_120B: return "120B";457 case LLM_TYPE_142B: return "142B";458 case LLM_TYPE_236B: return "236B";459 case LLM_TYPE_290B: return "290B";460 case LLM_TYPE_314B: return "314B";461 case LLM_TYPE_405B: return "405B";462 case LLM_TYPE_671B: return "671B";463 case LLM_TYPE_SMALL: return "0.1B";464 case LLM_TYPE_MEDIUM: return "0.4B";465 case LLM_TYPE_LARGE: return "0.8B";466 case LLM_TYPE_XL: return "1.5B";467 case LLM_TYPE_A1_7B: return "A1.7B";468 case LLM_TYPE_A2_7B: return "A2.7B";469 case LLM_TYPE_8x7B: return "8x7B";470 case LLM_TYPE_8x22B: return "8x22B";471 case LLM_TYPE_16x12B: return "16x12B";472 case LLM_TYPE_16x3_8B: return "16x3.8B";473 case LLM_TYPE_10B_128x3_66B: return "10B+128x3.66B";474 case LLM_TYPE_57B_A14B: return "57B.A14B";475 case LLM_TYPE_17B_16E: return "17Bx16E (Scout)";476 case LLM_TYPE_17B_128E: return "17Bx128E (Maverick)";477 case LLM_TYPE_A13B: return "A13B";478 case LLM_TYPE_7B_A1B: return "7B.A1B";479 case LLM_TYPE_8B_A1B: return "8B.A1B";480 case LLM_TYPE_16B_A1B: return "16B.A1B";481 case LLM_TYPE_21B_A3B: return "21B.A3B";482 case LLM_TYPE_24B_A2B: return "24B.A2B";483 case LLM_TYPE_26B_A4B: return "26B.A4B";484 case LLM_TYPE_30B_A3B: return "30B.A3B";485 case LLM_TYPE_31B_A3_5B: return "31B.A3.5B";486 case LLM_TYPE_35B_A3B: return "35B.A3B";487 case LLM_TYPE_48B_A3B: return "48B.A3B";488 case LLM_TYPE_80B_A3B: return "80B.A3B";489 case LLM_TYPE_100B_A6B: return "100B.A6B";490 case LLM_TYPE_102B_A12B: return "102B.A12B";491 case LLM_TYPE_106B_A12B: return "106B.A12B";492 case LLM_TYPE_120B_A12B: return "120B.A12B";493 case LLM_TYPE_122B_A10B: return "122B.A10B";494 case LLM_TYPE_196B_A11B: return "196B.A11B";495 case LLM_TYPE_230B_A10B: return "230B.A10B";496 case LLM_TYPE_235B_A22B: return "235B.A22B";497 case LLM_TYPE_300B_A47B: return "300B.A47B";498 case LLM_TYPE_310B_A15B: return "310B.A15B";499 case LLM_TYPE_355B_A32B: return "355B.A32B";500 case LLM_TYPE_397B_A17B: return "397B.A17B";501 case LLM_TYPE_744B_A40B: return "744B.A40B";502 case LLM_TYPE_E2B: return "E2B";503 case LLM_TYPE_E4B: return "E4B";504 default: return "?B";505 }506}507 508static const char * llama_expert_gating_func_name(llama_expert_gating_func_type type) {509 switch (type) {510 case LLAMA_EXPERT_GATING_FUNC_TYPE_SOFTMAX: return "softmax";511 case LLAMA_EXPERT_GATING_FUNC_TYPE_SIGMOID: return "sigmoid";512 default: return "unknown";513 }514}515 516static const std::map<llama_rope_scaling_type, const char *> LLAMA_ROPE_SCALING_TYPES = {517 { LLAMA_ROPE_SCALING_TYPE_NONE, "none" },518 { LLAMA_ROPE_SCALING_TYPE_LINEAR, "linear" },519 { LLAMA_ROPE_SCALING_TYPE_YARN, "yarn" },520 { LLAMA_ROPE_SCALING_TYPE_LONGROPE, "longrope" },521};522 523std::string llama_rope_scaling_type_name(llama_rope_scaling_type rope_scaling_type) {524 return LLAMA_ROPE_SCALING_TYPES.at(rope_scaling_type);525}526 527static llama_rope_scaling_type llama_rope_scaling_type_from_string(const std::string & name) {528 for (const auto & kv : LLAMA_ROPE_SCALING_TYPES) {529 if (kv.second == name) {530 return (llama_rope_scaling_type) kv.first;531 }532 }533 534 return LLAMA_ROPE_SCALING_TYPE_UNSPECIFIED;535}536 537// CPU: ACCEL -> GPU host -> CPU extra -> CPU538static buft_list_t make_cpu_buft_list(const std::vector<llama_device> & devices, bool use_extra_bufts, bool no_host) {539 buft_list_t buft_list;540 541 // add ACCEL buffer types542 for (size_t i = 0; i < ggml_backend_dev_count(); ++i) {543 ggml_backend_dev_t dev = ggml_backend_dev_get(i);544 if (ggml_backend_dev_type(dev) == GGML_BACKEND_DEVICE_TYPE_ACCEL) {545 auto * buft = ggml_backend_dev_buffer_type(dev);546 // skip547 if (buft != ggml_backend_cpu_buffer_type()) {548 buft_list.emplace_back(dev, buft);549 }550 }551 }552 553 // add a host buffer type554 // storing the tensors in a host buffer is useful when the processing of large batches555 // is offloaded to a GPU device, since it reduces the time spent on data transfers556 // generally, this will be done using the first device in the list557 // a better approach would be to handle this on a weight-by-weight basis using the offload_op558 // function of the device to determine if it would benefit from being stored in a host buffer559 if (!no_host) {560 for (const auto & dev : devices) {561 ggml_backend_buffer_type_t buft = ggml_backend_dev_host_buffer_type(dev.dev);562 if (buft) {563 buft_list.emplace_back(dev.dev, buft);564 break;565 }566 }567 }568 569 // add extra buffer types570 if (use_extra_bufts) {571 auto * cpu_dev = ggml_backend_dev_by_type(GGML_BACKEND_DEVICE_TYPE_CPU);572 if (cpu_dev == nullptr) {573 throw std::runtime_error(format("%s: no CPU backend found", __func__));574 }575 576 auto * cpu_reg = ggml_backend_dev_backend_reg(cpu_dev);577 auto ggml_backend_dev_get_extra_bufts_fn = (ggml_backend_dev_get_extra_bufts_t)578 ggml_backend_reg_get_proc_address(cpu_reg, "ggml_backend_dev_get_extra_bufts");579 if (ggml_backend_dev_get_extra_bufts_fn) {580 ggml_backend_buffer_type_t * extra_bufts = ggml_backend_dev_get_extra_bufts_fn(cpu_dev);581 while (extra_bufts && *extra_bufts) {582 buft_list.emplace_back(cpu_dev, *extra_bufts);583 ++extra_bufts;584 }585 }586 }587 588 // add the CPU buffer type589 for (size_t i = 0; i < ggml_backend_dev_count(); ++i) {590 ggml_backend_dev_t dev = ggml_backend_dev_get(i);591 if (ggml_backend_dev_type(dev) == GGML_BACKEND_DEVICE_TYPE_CPU) {592 buft_list.emplace_back(dev, ggml_backend_dev_buffer_type(dev));593 }594 }595 596 return buft_list;597}598 599// GPU: split if LLAMA_SPLIT_MODE_ROW -> GPU600static buft_list_t make_gpu_buft_list(ggml_backend_dev_t dev, llama_split_mode split_mode, const float * tensor_split) {601 buft_list_t buft_list;602 603 // add the device split buffer type if requested and available604 if (split_mode == LLAMA_SPLIT_MODE_ROW) {605 ggml_backend_reg_t reg = ggml_backend_dev_backend_reg(dev);606 auto ggml_backend_split_buffer_type_fn = (ggml_backend_split_buffer_type_t)607 ggml_backend_reg_get_proc_address(reg, "ggml_backend_split_buffer_type");608 if (ggml_backend_split_buffer_type_fn) {609 size_t dev_index = [&]() {610 auto * reg = ggml_backend_dev_backend_reg(dev);611 for (size_t i = 0; i < ggml_backend_reg_dev_count(reg); ++i) {612 if (ggml_backend_reg_dev_get(reg, i) == dev) {613 return i;614 }615 }616 throw std::runtime_error(format("device %s not found in its backend reg", ggml_backend_dev_name(dev)));617 }();618 auto * buft = ggml_backend_split_buffer_type_fn(dev_index, tensor_split);619 if (buft != nullptr) {620 buft_list.emplace_back(dev, buft);621 }622 }623 }624 625 // add the device default buffer type626 buft_list.emplace_back(dev, ggml_backend_dev_buffer_type(dev));627 628 // add the device extra buffer type (if any)629 ggml_backend_reg_t reg = ggml_backend_dev_backend_reg(dev);630 if (reg) {631 auto ggml_backend_dev_get_extra_bufts_fn = (ggml_backend_dev_get_extra_bufts_t)632 ggml_backend_reg_get_proc_address(reg, "ggml_backend_dev_get_extra_bufts");633 634 if (ggml_backend_dev_get_extra_bufts_fn) {635 ggml_backend_buffer_type_t * extra_bufts = ggml_backend_dev_get_extra_bufts_fn(dev);636 while (extra_bufts && *extra_bufts) {637 buft_list.emplace_back(dev, *extra_bufts);638 ++extra_bufts;639 }640 }641 }642 643 return buft_list;644}645 646struct llama_model::impl {647 impl() = default;648 ~impl() = default;649 650 uint64_t n_elements = 0;651 652 size_t n_bytes = 0;653 654 std::string desc_str;655 656 // model memory mapped files657 llama_mmaps mappings;658 659 // objects representing data potentially being locked in memory660 llama_mlocks mlock_bufs;661 llama_mlocks mlock_mmaps;662 663 // contexts where the model tensors metadata is stored as well as the corresponding buffers:664 std::vector<std::pair<ggml_context_ptr, std::vector<ggml_backend_buffer_ptr>>> ctxs_bufs;665 666 buft_list_t cpu_buft_list;667 std::map<ggml_backend_dev_t, buft_list_t> gpu_buft_list;668 669 struct layer_dev {670 ggml_backend_dev_t dev;671 buft_list_t * buft_list;672 };673 674 layer_dev dev_input = {};675 layer_dev dev_output = {};676 std::vector<layer_dev> dev_layer;677 678 bool has_tensor_overrides;679};680 681llama_model::llama_model(const llama_model_params & params) : params(params), pimpl(std::make_unique<impl>()) {682 pimpl->has_tensor_overrides = params.tensor_buft_overrides && params.tensor_buft_overrides[0].pattern;683}684 685llama_model::~llama_model() {686 for (auto * lora : loras) {687 delete lora;688 }689}690 691void llama_model::load_stats(llama_model_loader & ml) {692 pimpl->n_elements = ml.n_elements;693 pimpl->n_bytes = ml.n_bytes;694}695 696void llama_model::load_arch(llama_model_loader & ml) {697 arch = ml.get_arch();698 if (arch == LLM_ARCH_UNKNOWN) {699 throw std::runtime_error("unknown model architecture: '" + ml.get_arch_name() + "'");700 }701 if (!devices.empty() && devices[0].is_meta && !llm_arch_supports_sm_tensor(arch)) {702 throw std::runtime_error(std::string("LLAMA_SPLIT_MODE_TENSOR not implemented for architecture '") + llm_arch_name(arch) + "'");703 }704}705 706void llama_model::load_hparams(llama_model_loader & ml) {707 const gguf_context * ctx = ml.metadata;708 709 // get metadata as string710 for (int i = 0; i < gguf_get_n_kv(ctx); i++) {711 gguf_type type = gguf_get_kv_type(ctx, i);712 if (type == GGUF_TYPE_ARRAY) {713 continue;714 }715 const char * name = gguf_get_key(ctx, i);716 const std::string value = gguf_kv_to_str(ctx, i);717 gguf_kv.emplace(name, value);718 }719 720 // get general kv721 ml.get_key(LLM_KV_GENERAL_NAME, name, false);722 723 // everything past this point is not vocab-related724 // for CLIP models, we only need to load tensors, no hparams725 if (hparams.vocab_only || ml.get_arch() == LLM_ARCH_CLIP) {726 return;727 }728 729 ml.get_key(LLM_KV_CONTEXT_LENGTH, hparams.n_ctx_train);730 ml.get_key(LLM_KV_EMBEDDING_LENGTH, hparams.n_embd);731 ml.get_key(LLM_KV_EMBEDDING_LENGTH_OUT, hparams.n_embd_out_impl, false);732 ml.get_key(LLM_KV_ATTENTION_CAUSAL, hparams.causal_attn, false);733 ml.get_key(LLM_KV_POOLING_TYPE, hparams.pooling_type, false);734 ml.get_key(LLM_KV_BLOCK_COUNT, hparams.n_layer);735 ml.get_key(LLM_KV_EXPERT_COUNT, hparams.n_expert, false);736 ml.get_key(LLM_KV_EXPERT_USED_COUNT, hparams.n_expert_used, false);737 ml.get_key(LLM_KV_EXPERT_GROUP_COUNT, hparams.n_expert_groups, false);738 ml.get_key(LLM_KV_EXPERT_GROUP_USED_COUNT, hparams.n_group_used, false);739 740 if (arch == LLM_ARCH_WAVTOKENIZER_DEC) {741 ml.get_key(LLM_KV_FEATURES_LENGTH, hparams.n_embd);742 ml.get_key(LLM_KV_EMBEDDING_LENGTH, hparams.n_embd_out_impl);743 744 ml.get_key(LLM_KV_POSNET_EMBEDDING_LENGTH, hparams.posnet.n_embd);745 ml.get_key(LLM_KV_POSNET_BLOCK_COUNT, hparams.posnet.n_layer);746 747 ml.get_key(LLM_KV_CONVNEXT_EMBEDDING_LENGTH, hparams.convnext.n_embd);748 ml.get_key(LLM_KV_CONVNEXT_BLOCK_COUNT, hparams.convnext.n_layer);749 }750 751 GGML_ASSERT(hparams.n_expert <= LLAMA_MAX_EXPERTS);752 GGML_ASSERT(hparams.n_expert_used <= hparams.n_expert);753 if (hparams.n_expert > 0) {754 GGML_ASSERT(hparams.n_expert_used > 0);755 GGML_ASSERT(hparams.n_expert_groups < hparams.n_expert);756 if (hparams.n_expert_groups > 1) {757 GGML_ASSERT(hparams.n_expert % hparams.n_expert_groups == 0);758 GGML_ASSERT(hparams.n_group_used > 0);759 GGML_ASSERT(hparams.n_group_used < hparams.n_expert_groups);760 }761 } else {762 GGML_ASSERT(hparams.n_expert_used == 0);763 GGML_ASSERT(hparams.n_expert_groups == 0);764 }765 766 std::fill(hparams.n_head_arr.begin(), hparams.n_head_arr.end(), 0);767 std::fill(hparams.n_head_kv_arr.begin(), hparams.n_head_kv_arr.end(), 0);768 std::fill(hparams.n_ff_arr.begin(), hparams.n_ff_arr.end(), 0);769 std::fill(770 hparams.recurrent_layer_arr.begin(),771 hparams.recurrent_layer_arr.end(),772 llm_arch_is_recurrent(ml.get_arch()));773 774 std::fill(hparams.rope_sections.begin(), hparams.rope_sections.end(), 0);775 std::fill(hparams.swa_layers.begin(), hparams.swa_layers.end(), 0);776 777 std::fill(hparams.xielu_alpha_n.begin(), hparams.xielu_alpha_n.end(), 0.0f);778 std::fill(hparams.xielu_alpha_p.begin(), hparams.xielu_alpha_p.end(), 0.0f);779 std::fill(hparams.xielu_beta.begin(), hparams.xielu_beta.end(), 0.0f);780 std::fill(hparams.xielu_eps.begin(), hparams.xielu_eps.end(), 0.0f);781 std::fill(hparams.swiglu_clamp_exp.begin(), hparams.swiglu_clamp_exp.end(), 0.0f);782 std::fill(hparams.swiglu_clamp_shexp.begin(), hparams.swiglu_clamp_shexp.end(), 0.0f);783 784 ml.get_key_or_arr(LLM_KV_FEED_FORWARD_LENGTH, hparams.n_ff_arr, hparams.n_layer, false);785 ml.get_key_or_arr(LLM_KV_ATTENTION_HEAD_COUNT, hparams.n_head_arr, hparams.n_layer, false);786 787 // n_head_kv is optional, default to n_head788 hparams.n_head_kv_arr = hparams.n_head_arr;789 790 ml.get_key_or_arr(LLM_KV_ATTENTION_HEAD_COUNT_KV, hparams.n_head_kv_arr, hparams.n_layer, false);791 792 bool rope_finetuned = false;793 ml.get_key(LLM_KV_ROPE_SCALING_FINETUNED, rope_finetuned, false);794 hparams.rope_finetuned = rope_finetuned;795 796 hparams.n_ctx_orig_yarn = hparams.n_ctx_train;797 ml.get_key(LLM_KV_ROPE_SCALING_ORIG_CTX_LEN, hparams.n_ctx_orig_yarn, false);798 799 // rope_freq_base (optional)800 hparams.rope_freq_base_train = 10000.0f;801 ml.get_key(LLM_KV_ROPE_FREQ_BASE, hparams.rope_freq_base_train, false);802 803 std::string rope_scaling("linear");804 ml.get_key(LLM_KV_ROPE_SCALING_TYPE, rope_scaling, false);805 hparams.rope_scaling_type_train = llama_rope_scaling_type_from_string(rope_scaling);806 GGML_ASSERT(hparams.rope_scaling_type_train != LLAMA_ROPE_SCALING_TYPE_UNSPECIFIED);807 808 // TODO: Handle SWA metadata similarly when models start implementing it809 // rope_freq_scale (inverse of the kv) is optional810 float ropescale = 0.0f;811 if (!ml.get_key(LLM_KV_ROPE_SCALING_FACTOR, ropescale, false)) {812 // try the old key name813 ml.get_key(LLM_KV_ROPE_SCALE_LINEAR, ropescale, false);814 }815 hparams.rope_freq_scale_train = ropescale == 0.0f ? 1.0f : 1.0f/ropescale;816 817 ml.get_key(LLM_KV_ROPE_SCALING_ATTN_FACTOR, hparams.rope_attn_factor, false);818 819 // non-transformer models do not have attention heads820 if (hparams.n_head() > 0) {821 // gpt-neox n_rot = rotary_pct * (n_embd / n_head)822 // gpt-j n_rot = rotary_dim823 824 hparams.n_embd_head_k_full = hparams.n_embd / hparams.n_head();825 ml.get_key(LLM_KV_ATTENTION_KEY_LENGTH, hparams.n_embd_head_k_full, false);826 827 hparams.n_embd_head_v_full = hparams.n_embd / hparams.n_head();828 ml.get_key(LLM_KV_ATTENTION_VALUE_LENGTH, hparams.n_embd_head_v_full, false);829 830 // sanity check for n_rot (optional)831 hparams.n_rot_full = hparams.n_embd_head_k_full;832 833 ml.get_key(LLM_KV_ROPE_DIMENSION_COUNT, hparams.n_rot_full, false);834 835 if (arch == LLM_ARCH_LLAMA || arch == LLM_ARCH_DECI || arch == LLM_ARCH_FALCON || arch == LLM_ARCH_LLAMA_EMBED) {836 if (hparams.n_rot_full != hparams.n_embd_head_k_full) {837 throw std::runtime_error(format("invalid n_rot: %u, expected %u", hparams.n_rot_full, hparams.n_embd_head_k_full));838 }839 }840 } else {841 hparams.n_rot_full = 0;842 hparams.n_embd_head_k_full = 0;843 hparams.n_embd_head_v_full = 0;844 }845 846 // head size and n_rot for SWA layers847 {848 hparams.n_embd_head_k_swa = hparams.n_embd_head_k_full;849 hparams.n_embd_head_v_swa = hparams.n_embd_head_v_full;850 ml.get_key(LLM_KV_ATTENTION_KEY_LENGTH_SWA, hparams.n_embd_head_k_swa, false);851 ml.get_key(LLM_KV_ATTENTION_VALUE_LENGTH_SWA, hparams.n_embd_head_v_swa, false);852 853 hparams.n_rot_swa = hparams.n_rot_full;854 ml.get_key(LLM_KV_ROPE_DIMENSION_COUNT_SWA, hparams.n_rot_swa, false);855 }856 857 // for differentiating model types858 uint32_t n_vocab = 0;859 ml.get_key(LLM_KV_VOCAB_SIZE, n_vocab, false) || ml.get_arr_n(LLM_KV_TOKENIZER_LIST, n_vocab, false);860 861 // for classifier models862 ml.get_arr(LLM_KV_CLASSIFIER_OUTPUT_LABELS, classifier_labels, false);863 if (!classifier_labels.empty()) {864 hparams.n_cls_out = classifier_labels.size();865 }866 867 // arch-specific KVs868 switch (arch) {869 case LLM_ARCH_LLAMA:870 case LLM_ARCH_LLAMA_EMBED:871 {872 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps);873 874 if (hparams.n_expert == 8) {875 switch (hparams.n_layer) {876 case 32: type = LLM_TYPE_8x7B; break;877 case 56: type = LLM_TYPE_8x22B; break;878 default: type = LLM_TYPE_UNKNOWN;879 }880 } else {881 switch (hparams.n_layer) {882 case 16: type = LLM_TYPE_1B; break; // Llama 3.2 1B883 case 22: type = LLM_TYPE_1B; break;884 case 26: type = LLM_TYPE_3B; break;885 case 28: type = LLM_TYPE_3B; break; // Llama 3.2 3B886 case 30: type = LLM_TYPE_256M; break; // smoldocling 256M887 // granite uses a vocab with len 49152888 case 32: type = n_vocab == 49152 ? LLM_TYPE_3B : (n_vocab < 40000 ? LLM_TYPE_7B : LLM_TYPE_8B); break;889 case 36: type = LLM_TYPE_8B; break; // granite890 case 40: type = LLM_TYPE_13B; break;891 case 48: type = LLM_TYPE_34B; break;892 case 60: type = LLM_TYPE_30B; break;893 case 80: type = hparams.n_head() == hparams.n_head_kv() ? LLM_TYPE_65B : LLM_TYPE_70B; break;894 default: type = LLM_TYPE_UNKNOWN;895 }896 }897 } break;898 case LLM_ARCH_LLAMA4:899 {900 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps);901 ml.get_key(LLM_KV_EXPERT_FEED_FORWARD_LENGTH, hparams.n_ff_exp);902 ml.get_key(LLM_KV_INTERLEAVE_MOE_LAYER_STEP, hparams.n_moe_layer_step);903 904 const bool found_swa = ml.get_key(LLM_KV_ATTENTION_SLIDING_WINDOW, hparams.n_swa, false);905 if (found_swa && hparams.n_swa == 0) {906 hparams.swa_type = LLAMA_SWA_TYPE_NONE;907 hparams.n_no_rope_layer_step = hparams.n_layer; // always use rope908 } else {909 hparams.swa_type = LLAMA_SWA_TYPE_CHUNKED;910 hparams.n_swa = 8192;911 hparams.n_attn_temp_floor_scale = 8192;912 hparams.f_attn_temp_scale = 0.1f;913 hparams.f_attn_temp_offset = 1.0f;914 uint32_t swa_period = 4; // pattern: 3 chunked - 1 full915 ml.get_key_or_arr(LLM_KV_ATTENTION_SLIDING_WINDOW_PATTERN, swa_period, false);916 hparams.set_swa_pattern(swa_period);917 918 hparams.rope_freq_base_train_swa = hparams.rope_freq_base_train;919 hparams.rope_freq_scale_train_swa = hparams.rope_freq_scale_train;920 ml.get_key(LLM_KV_ROPE_FREQ_BASE_SWA, hparams.rope_freq_base_train_swa, false);921 }922 923 switch (hparams.n_expert) {924 case 0: {925 // MobileLLM (no MoE)926 switch (hparams.n_embd) {927 case 2048: type = LLM_TYPE_140M; break;928 case 4096: type = LLM_TYPE_360M; break;929 case 6144: type = LLM_TYPE_950M; break;930 default: type = LLM_TYPE_UNKNOWN;931 }932 } break;933 case 16: type = LLM_TYPE_17B_16E; break;934 case 128: type = LLM_TYPE_17B_128E; break;935 default: type = LLM_TYPE_UNKNOWN;936 }937 938 hparams.use_kq_norm = type != LLM_TYPE_17B_128E;939 } break;940 case LLM_ARCH_ARCEE:941 {942 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps);943 944 // Arcee uses the same structure as Llama945 switch (hparams.n_layer) {946 case 36: type = LLM_TYPE_4B; break;947 default: type = LLM_TYPE_UNKNOWN;948 }949 } break;950 case LLM_ARCH_AFMOE:951 {952 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps);953 ml.get_key(LLM_KV_LEADING_DENSE_BLOCK_COUNT, hparams.n_layer_dense_lead, false);954 ml.get_key(LLM_KV_EXPERT_FEED_FORWARD_LENGTH, hparams.n_ff_exp);955 ml.get_key(LLM_KV_EXPERT_SHARED_COUNT, hparams.n_expert_shared);956 ml.get_key(LLM_KV_EXPERT_GATING_FUNC, hparams.expert_gating_func, false);957 ml.get_key(LLM_KV_EXPERT_WEIGHTS_SCALE, hparams.expert_weights_scale, false);958 ml.get_key(LLM_KV_EXPERT_WEIGHTS_NORM, hparams.expert_weights_norm, false);959 ml.get_key(LLM_KV_ATTENTION_SLIDING_WINDOW, hparams.n_swa, false);960 961 // Set up interleaved sliding window attention (ISWA)962 // Pattern: 3 sliding - 1 full (global_attn_every_n_layers = 4)963 if (hparams.n_swa > 0) {964 hparams.swa_type = LLAMA_SWA_TYPE_STANDARD;965 uint32_t swa_period = 4;966 ml.get_key_or_arr(LLM_KV_ATTENTION_SLIDING_WINDOW_PATTERN, swa_period, false);967 hparams.set_swa_pattern(swa_period);968 969 hparams.rope_freq_base_train_swa = hparams.rope_freq_base_train;970 hparams.rope_freq_scale_train_swa = hparams.rope_freq_scale_train;971 ml.get_key(LLM_KV_ROPE_FREQ_BASE_SWA, hparams.rope_freq_base_train_swa, false);972 } else {973 hparams.swa_type = LLAMA_SWA_TYPE_NONE;974 }975 976 // Default to sigmoid if not set977 if (hparams.expert_gating_func == LLAMA_EXPERT_GATING_FUNC_TYPE_NONE) {978 hparams.expert_gating_func = LLAMA_EXPERT_GATING_FUNC_TYPE_SIGMOID;979 }980 981 switch (hparams.n_layer) {982 case 56: type = LLM_TYPE_6B; break;983 case 32: type = LLM_TYPE_26B; break;984 default: type = LLM_TYPE_UNKNOWN;985 }986 } break;987 case LLM_ARCH_DECI:988 {989 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps);990 switch (hparams.n_layer) {991 case 32: type = LLM_TYPE_7B; break;992 case 80: type = LLM_TYPE_70B; break;993 case 162: type = LLM_TYPE_405B; break;994 default: type = LLM_TYPE_UNKNOWN;995 }996 } break;997 case LLM_ARCH_MINICPM:998 {999 // Backward-compatible defaults for older MiniCPM GGUFs1000 hparams.f_embedding_scale = 12.0f;1001 hparams.f_residual_scale = 1.4f / sqrtf(float(hparams.n_layer));1002 hparams.f_logit_scale = hparams.n_embd ? (256.0f / float(hparams.n_embd)) : 1.0f;1003 1004 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps);1005 1006 // Optional KV reads, override defaults if present in newer GGUF exports1007 ml.get_key(LLM_KV_EMBEDDING_SCALE, hparams.f_embedding_scale, /*required=*/false);1008 ml.get_key(LLM_KV_RESIDUAL_SCALE, hparams.f_residual_scale, /*required=*/false);1009 ml.get_key(LLM_KV_LOGIT_SCALE, hparams.f_logit_scale, /*required=*/false);1010 1011 // MiniCPM uses rope by default, unlike Granite which uses it as a switch1012 hparams.rope_finetuned = true;1013 1014 switch (hparams.n_layer) {1015 case 52: type = LLM_TYPE_1B; break;1016 case 40: type = LLM_TYPE_2B; break;1017 default: type = LLM_TYPE_UNKNOWN;1018 }1019 } break;1020 case LLM_ARCH_MINICPM3:1021 {1022 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps);1023 ml.get_key(LLM_KV_ATTENTION_Q_LORA_RANK, hparams.n_lora_q);1024 ml.get_key(LLM_KV_ATTENTION_KV_LORA_RANK, hparams.n_lora_kv);1025 1026 switch (hparams.n_layer) {1027 case 62: type = LLM_TYPE_4B; break;1028 default: type = LLM_TYPE_UNKNOWN;1029 }1030 } break;1031 case LLM_ARCH_GROK:1032 {1033 // defaults for old GGUFs1034 hparams.yarn_beta_fast = 8.0f;1035 hparams.f_logit_scale = 0.5773502691896257f;1036 hparams.f_embedding_scale = 78.38367176906169f;1037 hparams.f_attn_out_scale = 0.08838834764831845f;1038 hparams.f_attn_logit_softcapping = 30.0f;1039 hparams.f_router_logit_softcapping = 30.0f;1040 // no final_logit_softcapping in grok-11041 hparams.f_final_logit_softcapping = 0.0f;1042 1043 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps);1044 ml.get_key(LLM_KV_EXPERT_FEED_FORWARD_LENGTH, hparams.n_ff_exp, false);1045 ml.get_key(LLM_KV_LOGIT_SCALE, hparams.f_logit_scale, false);1046 ml.get_key(LLM_KV_EMBEDDING_SCALE, hparams.f_embedding_scale, false);1047 ml.get_key(LLM_KV_ATTENTION_OUTPUT_SCALE, hparams.f_attn_out_scale, false);1048 ml.get_key(LLM_KV_ATTN_LOGIT_SOFTCAPPING, hparams.f_attn_logit_softcapping, false);1049 ml.get_key(LLM_KV_ROUTER_LOGIT_SOFTCAPPING, hparams.f_router_logit_softcapping, false);1050 ml.get_key(LLM_KV_FINAL_LOGIT_SOFTCAPPING, hparams.f_final_logit_softcapping, false);1051 1052 ml.get_key(LLM_KV_ATTENTION_TEMPERATURE_LENGTH, hparams.attn_temp_length, false);1053 ml.get_key(LLM_KV_ROPE_SCALING_YARN_EXT_FACTOR, hparams.yarn_ext_factor, false);1054 ml.get_key(LLM_KV_ROPE_SCALING_YARN_ATTN_FACTOR, hparams.yarn_attn_factor, false);1055 ml.get_key(LLM_KV_ROPE_SCALING_YARN_BETA_FAST, hparams.yarn_beta_fast, false);1056 ml.get_key(LLM_KV_ROPE_SCALING_YARN_BETA_SLOW, hparams.yarn_beta_slow, false);1057 1058 switch (hparams.n_layer) {1059 case 64: type = LLM_TYPE_314B; break;1060 default: type = LLM_TYPE_UNKNOWN;1061 }1062 } break;1063 case LLM_ARCH_FALCON:1064 {1065 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_EPS, hparams.f_norm_eps);1066 1067 switch (hparams.n_layer) {1068 case 32: type = LLM_TYPE_7B; break;1069 case 60: type = LLM_TYPE_40B; break;1070 default: type = LLM_TYPE_UNKNOWN;1071 }1072 } break;1073 case LLM_ARCH_BAICHUAN:1074 {1075 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps);1076 switch (hparams.n_layer) {1077 case 32: type = LLM_TYPE_7B; break;1078 case 40: type = LLM_TYPE_13B; break;1079 default: type = LLM_TYPE_UNKNOWN;1080 }1081 1082 if (type == LLM_TYPE_13B) {1083 // TODO: become GGUF KV parameter1084 hparams.f_max_alibi_bias = 8.0f;1085 }1086 } break;1087 case LLM_ARCH_STARCODER:1088 {1089 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_EPS, hparams.f_norm_eps);1090 switch (hparams.n_layer) {1091 case 24: type = LLM_TYPE_1B; break;1092 case 36: type = LLM_TYPE_3B; break;1093 case 42: type = LLM_TYPE_7B; break;1094 case 40: type = LLM_TYPE_15B; break;1095 default: type = LLM_TYPE_UNKNOWN;1096 }1097 } break;1098 case LLM_ARCH_REFACT:1099 {1100 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps);1101 switch (hparams.n_layer) {1102 case 32: type = LLM_TYPE_1B; break;1103 default: type = LLM_TYPE_UNKNOWN;1104 }1105 1106 // TODO: become GGUF KV parameter1107 hparams.f_max_alibi_bias = 8.0f;1108 } break;1109 case LLM_ARCH_BERT:1110 {1111 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_EPS, hparams.f_norm_eps);1112 1113 switch (hparams.n_layer) {1114 case 3:1115 type = LLM_TYPE_17M; break; // bge-micro1116 case 6:1117 type = LLM_TYPE_22M; break; // MiniLM-L61118 case 12:1119 switch (hparams.n_embd) {1120 case 384: type = LLM_TYPE_33M; break; // MiniLM-L12, bge-small1121 case 768: type = LLM_TYPE_109M; break; // bge-base1122 default: type = LLM_TYPE_UNKNOWN;1123 } break;1124 case 24:1125 type = LLM_TYPE_335M; break; // bge-large1126 default: type = LLM_TYPE_UNKNOWN;1127 }1128 } break;1129 case LLM_ARCH_MODERN_BERT:1130 {1131 const bool found_swa = ml.get_key(LLM_KV_ATTENTION_SLIDING_WINDOW, hparams.n_swa, false);1132 if (found_swa && hparams.n_swa > 0) {1133 hparams.swa_type = LLAMA_SWA_TYPE_SYMMETRIC;1134 ml.get_key(LLM_KV_ROPE_FREQ_BASE_SWA, hparams.rope_freq_base_train_swa, false);1135 uint32_t swa_period = 3;1136 ml.get_key_or_arr(LLM_KV_ATTENTION_SLIDING_WINDOW_PATTERN, swa_period, false);1137 hparams.set_swa_pattern(swa_period, true);1138 } else {1139 hparams.swa_type = LLAMA_SWA_TYPE_NONE;1140 }1141 1142 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_EPS, hparams.f_norm_eps);1143 1144 switch (hparams.n_layer) {1145 case 12:1146 type = LLM_TYPE_47M; break; // granite-embedding-small1147 case 22:1148 type = LLM_TYPE_149M; break; // modern-bert-base1149 case 28:1150 type = LLM_TYPE_395M; break; // modern-bert-large1151 default: type = LLM_TYPE_UNKNOWN;1152 }1153 } break;1154 case LLM_ARCH_JINA_BERT_V2:1155 {1156 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_EPS, hparams.f_norm_eps);1157 hparams.f_max_alibi_bias = 8.0f;1158 1159 switch (hparams.n_layer) {1160 case 4: type = LLM_TYPE_33M; break; // jina-embeddings-small1161 case 12: type = LLM_TYPE_137M; break; // jina-embeddings-base1162 default: type = LLM_TYPE_UNKNOWN;1163 }1164 } break;1165 case LLM_ARCH_JINA_BERT_V3:1166 {1167 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_EPS, hparams.f_norm_eps);1168 1169 switch (hparams.n_layer) {1170 case 24:1171 type = LLM_TYPE_558M; break;1172 default: type = LLM_TYPE_UNKNOWN;1173 }1174 } break;1175 case LLM_ARCH_NOMIC_BERT:1176 case LLM_ARCH_NOMIC_BERT_MOE:1177 {1178 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_EPS, hparams.f_norm_eps);1179 ml.get_key(LLM_KV_MOE_EVERY_N_LAYERS, hparams.moe_every_n_layers, 0);1180 1181 if (hparams.n_layer == 12 && hparams.n_embd == 768) {1182 if (arch == LLM_ARCH_NOMIC_BERT) {1183 type = LLM_TYPE_137M;1184 } else if (arch == LLM_ARCH_NOMIC_BERT_MOE && hparams.moe_every_n_layers == 2) {1185 type = LLM_TYPE_475M;1186 }1187 }1188 } break;1189 case LLM_ARCH_NEO_BERT:1190 {1191 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps);1192 1193 if (hparams.n_layer == 28) {1194 type = LLM_TYPE_250M;1195 }1196 } break;1197 case LLM_ARCH_EUROBERT:1198 {1199 ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps);1200 