| 488 | } |
| 489 | |
| 490 | void llama_model::load_hparams(llama_model_loader & ml) { |
| 491 | const gguf_context * ctx = ml.meta.get(); |
| 492 | |
| 493 | // get metadata as string |
| 494 | for (int i = 0; i < gguf_get_n_kv(ctx); i++) { |
| 495 | gguf_type type = gguf_get_kv_type(ctx, i); |
| 496 | if (type == GGUF_TYPE_ARRAY) { |
| 497 | continue; |
| 498 | } |
| 499 | const char * name = gguf_get_key(ctx, i); |
| 500 | const std::string value = gguf_kv_to_str(ctx, i); |
| 501 | gguf_kv.emplace(name, value); |
| 502 | } |
| 503 | |
| 504 | // get general kv |
| 505 | ml.get_key(LLM_KV_GENERAL_NAME, name, false); |
| 506 | |
| 507 | // everything past this point is not vocab-related |
| 508 | // for CLIP models, we only need to load tensors, no hparams |
| 509 | if (hparams.vocab_only || ml.get_arch() == LLM_ARCH_CLIP) { |
| 510 | return; |
| 511 | } |
| 512 | |
| 513 | ml.get_key(LLM_KV_CONTEXT_LENGTH, hparams.n_ctx_train); |
| 514 | ml.get_key(LLM_KV_EMBEDDING_LENGTH, hparams.n_embd); |
| 515 | ml.get_key(LLM_KV_EMBEDDING_LENGTH_OUT, hparams.n_embd_out_impl, false); |
| 516 | ml.get_key(LLM_KV_BLOCK_COUNT, hparams.n_layer); |
| 517 | ml.get_key(LLM_KV_EXPERT_COUNT, hparams.n_expert, false); |
| 518 | ml.get_key(LLM_KV_EXPERT_USED_COUNT, hparams.n_expert_used, false); |
| 519 | ml.get_key(LLM_KV_EXPERT_GROUP_COUNT, hparams.n_expert_groups, false); |
| 520 | ml.get_key(LLM_KV_EXPERT_GROUP_USED_COUNT, hparams.n_group_used, false); |
| 521 | |
| 522 | if (arch == LLM_ARCH_WAVTOKENIZER_DEC) { |
| 523 | ml.get_key(LLM_KV_FEATURES_LENGTH, hparams.n_embd_features); |
| 524 | |
| 525 | ml.get_key(LLM_KV_POSNET_EMBEDDING_LENGTH, hparams.posnet.n_embd); |
| 526 | ml.get_key(LLM_KV_POSNET_BLOCK_COUNT, hparams.posnet.n_layer); |
| 527 | |
| 528 | ml.get_key(LLM_KV_CONVNEXT_EMBEDDING_LENGTH, hparams.convnext.n_embd); |
| 529 | ml.get_key(LLM_KV_CONVNEXT_BLOCK_COUNT, hparams.convnext.n_layer); |
| 530 | } |
| 531 | |
| 532 | GGML_ASSERT(hparams.n_expert <= LLAMA_MAX_EXPERTS); |
| 533 | GGML_ASSERT(hparams.n_expert_used <= hparams.n_expert); |
| 534 | if (hparams.n_expert > 0) { |
| 535 | GGML_ASSERT(hparams.n_expert_used > 0); |
| 536 | GGML_ASSERT(hparams.n_expert_groups < hparams.n_expert); |
| 537 | if (hparams.n_expert_groups > 1) { |
| 538 | GGML_ASSERT(hparams.n_expert % hparams.n_expert_groups == 0); |
| 539 | GGML_ASSERT(hparams.n_group_used > 0); |
| 540 | GGML_ASSERT(hparams.n_group_used < hparams.n_expert_groups); |
| 541 | } |
| 542 | } else { |
| 543 | GGML_ASSERT(hparams.n_expert_used == 0); |
| 544 | GGML_ASSERT(hparams.n_expert_groups == 0); |
| 545 | } |
| 546 | |
| 547 | std::fill(hparams.n_head_arr.begin(), hparams.n_head_arr.end(), 0); |
no test coverage detected