| 2279 | } |
| 2280 | |
| 2281 | static void llm_load_hparams( |
| 2282 | llama_model_loader & ml, |
| 2283 | llama_model & model) { |
| 2284 | struct gguf_context * ctx = ml.ctx_gguf; |
| 2285 | |
| 2286 | const auto kv = LLM_KV(model.arch); |
| 2287 | |
| 2288 | auto & hparams = model.hparams; |
| 2289 | |
| 2290 | // get general kv |
| 2291 | GGUF_GET_KEY(ctx, model.name, gguf_get_val_str, GGUF_TYPE_STRING, false, kv(LLM_KV_GENERAL_NAME)); |
| 2292 | |
| 2293 | // get hparams kv |
| 2294 | GGUF_GET_KEY(ctx, hparams.n_vocab, gguf_get_arr_n, GGUF_TYPE_ARRAY, true, kv(LLM_KV_TOKENIZER_LIST)); |
| 2295 | GGUF_GET_KEY(ctx, hparams.n_ctx_train, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_CONTEXT_LENGTH)); |
| 2296 | GGUF_GET_KEY(ctx, hparams.n_embd, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_EMBEDDING_LENGTH)); |
| 2297 | GGUF_GET_KEY(ctx, hparams.n_ff, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_FEED_FORWARD_LENGTH)); |
| 2298 | GGUF_GET_KEY(ctx, hparams.n_head, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_ATTENTION_HEAD_COUNT)); |
| 2299 | GGUF_GET_KEY(ctx, hparams.n_layer, gguf_get_val_u32, GGUF_TYPE_UINT32, true, kv(LLM_KV_BLOCK_COUNT)); |
| 2300 | |
| 2301 | // n_head_kv is optional, default to n_head |
| 2302 | hparams.n_head_kv = hparams.n_head; |
| 2303 | GGUF_GET_KEY(ctx, hparams.n_head_kv, gguf_get_val_u32, GGUF_TYPE_UINT32, false, kv(LLM_KV_ATTENTION_HEAD_COUNT_KV)); |
| 2304 | |
| 2305 | hparams.rope_finetuned = false; |
| 2306 | GGUF_GET_KEY(ctx, hparams.rope_finetuned, gguf_get_val_bool, GGUF_TYPE_BOOL, false, |
| 2307 | kv(LLM_KV_ROPE_SCALING_FINETUNED)); |
| 2308 | |
| 2309 | hparams.n_yarn_orig_ctx = hparams.n_ctx_train; |
| 2310 | GGUF_GET_KEY(ctx, hparams.n_yarn_orig_ctx, gguf_get_val_u32, GGUF_TYPE_UINT32, false, |
| 2311 | kv(LLM_KV_ROPE_SCALING_ORIG_CTX_LEN)); |
| 2312 | |
| 2313 | // rope_freq_base (optional) |
| 2314 | hparams.rope_freq_base_train = 10000.0f; |
| 2315 | GGUF_GET_KEY(ctx, hparams.rope_freq_base_train, gguf_get_val_f32, GGUF_TYPE_FLOAT32, false, kv(LLM_KV_ROPE_FREQ_BASE)); |
| 2316 | |
| 2317 | std::string rope_scaling("linear"); |
| 2318 | GGUF_GET_KEY(ctx, rope_scaling, gguf_get_val_str, GGUF_TYPE_STRING, false, kv(LLM_KV_ROPE_SCALING_TYPE)); |
| 2319 | hparams.rope_scaling_type_train = llama_rope_scaling_type_from_string(rope_scaling); |
| 2320 | GGML_ASSERT(hparams.rope_scaling_type_train != LLAMA_ROPE_SCALING_UNSPECIFIED); |
| 2321 | |
| 2322 | // rope_freq_scale (inverse of the kv) is optional |
| 2323 | float ropescale = 0.0f; |
| 2324 | GGUF_GET_KEY(ctx, ropescale, gguf_get_val_f32, GGUF_TYPE_FLOAT32, false, kv(LLM_KV_ROPE_SCALING_FACTOR)); |
| 2325 | if (ropescale == 0.0f) { // try the old key name |
| 2326 | GGUF_GET_KEY(ctx, ropescale, gguf_get_val_f32, GGUF_TYPE_FLOAT32, false, kv(LLM_KV_ROPE_SCALE_LINEAR)); |
| 2327 | } |
| 2328 | hparams.rope_freq_scale_train = ropescale == 0.0f ? 1.0f : 1.0f/ropescale; |
| 2329 | |
| 2330 | // sanity check for n_rot (optional) |
| 2331 | { |
| 2332 | hparams.n_rot = hparams.n_embd / hparams.n_head; |
| 2333 | |
| 2334 | GGUF_GET_KEY(ctx, hparams.n_rot, gguf_get_val_u32, GGUF_TYPE_UINT32, false, kv(LLM_KV_ROPE_DIMENSION_COUNT)); |
| 2335 | |
| 2336 | if (model.arch == LLM_ARCH_LLAMA || model.arch == LLM_ARCH_FALCON) { |
| 2337 | if (hparams.n_rot != hparams.n_embd / hparams.n_head) { |
| 2338 | throw std::runtime_error(format("invalid n_rot: %u, expected %u", hparams.n_rot, hparams.n_embd / hparams.n_head)); |
no test coverage detected