map dense Qwen DFlash packages correctly (#2370)

This commit is contained in:
Samuel Oliveira Alves 2026-09-02 13:54:01 -03:00 committed by GitHub
parent 563b798ac9
commit caf7eae528
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 61 additions and 4 deletions

View File

@ -1891,7 +1891,50 @@ void llm_load_hparams(
case LLM_ARCH_DEEPSEEK4:
case LLM_ARCH_GLM_DSA:
{
const bool is_dsv4 = model.arch == LLM_ARCH_DFLASH || model.arch == LLM_ARCH_DEEPSEEK4;
if (model.arch == LLM_ARCH_DFLASH) {
const bool has_dense_signature =
ml.get_tensor_meta("blk.0.attn_q.weight") != nullptr;
const bool has_dsv4_signature =
ml.get_tensor_meta("blk.0.attn_q_a.weight") != nullptr ||
ml.get_tensor_meta("blk.0.hc_attn_base.weight") != nullptr;
if (has_dense_signature && has_dsv4_signature) {
throw std::runtime_error("dflash: ambiguous dense and DSV4 tensor signatures");
}
if (!has_dense_signature && !has_dsv4_signature) {
throw std::runtime_error("dflash: unrecognized or incomplete tensor signature");
}
hparams.dflash_dsv4 = has_dsv4_signature;
}
const bool dflash_dense = model.arch == LLM_ARCH_DFLASH && !hparams.dflash_dsv4;
if (dflash_dense) {
ml.get_key(LLM_KV_ATTENTION_LAYERNORM_RMS_EPS, hparams.f_norm_rms_eps);
ml.get_key("dflash.block_size", hparams.dflash_block_size);
ml.get_key(LLM_KV_TOKENIZER_MASK_ID, hparams.dflash_mask_token_id);
ml.get_key(LLM_KV_ATTENTION_SLIDING_WINDOW, hparams.n_swa, false);
ml.get_key_or_arr(LLM_KV_ATTENTION_SLIDING_WINDOW_PATTERN, hparams.swa_layers, hparams.n_layer, false);
load_dflash_target_layer_ids(ml, "dflash.target_layers", hparams, true);
const ggml_tensor * fc = ml.get_tensor_meta("fc.weight");
if (fc == nullptr || fc->ne[0] <= 0 || fc->ne[1] != hparams.n_embd) {
throw std::runtime_error("dflash: fc.weight must have shape [n_target_features, embedding_length]");
}
hparams.dflash_n_target_features = (uint32_t) fc->ne[0];
hparams.dflash_backbone_rotary_base = hparams.rope_freq_base_train;
hparams.dflash_laguna = false;
for (uint32_t i = 0; i < hparams.dflash_n_target_layers; ++i) {
if (hparams.dflash_target_layer_ids[i] == 0) {
throw std::runtime_error("dflash: target_layers must use one-based IDs");
}
--hparams.dflash_target_layer_ids[i];
}
validate_dflash_hparams(hparams, model.arch);
hparams.n_layer_kv_from_start = hparams.n_layer;
model.type = e_model::MODEL_UNKNOWN;
break;
}
const bool is_dsv4 = model.arch == LLM_ARCH_DEEPSEEK4 || hparams.dflash_dsv4;
ml.get_key(LLM_KV_NEXTN_PREDICT_LAYERS, hparams.nextn_predict_layers, false);
if (model.arch == LLM_ARCH_DEEPSEEK4 && hparams.n_layer == 43 && hparams.nextn_predict_layers > 0) {
LLAMA_LOG_WARN("===============================================================================================\n");

View File

@ -5561,7 +5561,9 @@ bool create_tensors_helper::create_tensors() {
case LLM_ARCH_GEMMA4_ASSISTANT:
use_mmap_buffer = create_gemma4_mtp_tensors(tn); break;
case LLM_ARCH_DFLASH:
use_mmap_buffer = create_dflash_dsv4_tensors(tn); break;
use_mmap_buffer = model.hparams.dflash_dsv4
? create_dflash_dsv4_tensors(tn)
: create_dflash_tensors(tn); break;
case LLM_ARCH_DFLASH2:
use_mmap_buffer = create_dflash2_tensors(tn); break;
case LLM_ARCH_DFLASH_DRAFT:

View File

@ -140,7 +140,8 @@ struct llama_model_loader {
enum llm_arch get_arch() const {
if (!arch_resolved) {
resolved_arch = llm_kv.arch;
if (resolved_arch == LLM_ARCH_DFLASH && get_tensor_meta("selector_hidden.weight") != nullptr) {
if (resolved_arch == LLM_ARCH_DFLASH &&
get_tensor_meta("selector_hidden.weight") != nullptr) {
resolved_arch = LLM_ARCH_DFLASH2;
}
arch_resolved = true;

View File

@ -964,6 +964,12 @@ static const std::map<llm_arch, std::map<llm_tensor, std::string>> LLM_TENSOR_NA
{ LLM_TENSOR_OUTPUT_NORM, "output_norm" },
{ LLM_TENSOR_OUTPUT, "output" },
{ LLM_TENSOR_ATTN_NORM, "blk.%d.attn_norm" },
{ LLM_TENSOR_ATTN_Q, "blk.%d.attn_q" },
{ LLM_TENSOR_ATTN_Q_NORM, "blk.%d.attn_q_norm" },
{ LLM_TENSOR_ATTN_K, "blk.%d.attn_k" },
{ LLM_TENSOR_ATTN_K_NORM, "blk.%d.attn_k_norm" },
{ LLM_TENSOR_ATTN_V, "blk.%d.attn_v" },
{ LLM_TENSOR_ATTN_OUT, "blk.%d.attn_output" },
{ LLM_TENSOR_ATTN_SINKS, "blk.%d.attn_sinks" },
{ LLM_TENSOR_ATTN_Q_A_NORM, "blk.%d.attn_q_a_norm" },
{ LLM_TENSOR_ATTN_KV_A_NORM, "blk.%d.attn_kv_a_norm" },
@ -973,6 +979,7 @@ static const std::map<llm_arch, std::map<llm_tensor, std::string>> LLM_TENSOR_NA
{ LLM_TENSOR_ATTN_OUT_A, "blk.%d.attn_output_a" },
{ LLM_TENSOR_ATTN_OUT_B, "blk.%d.attn_output_b" },
{ LLM_TENSOR_FFN_NORM, "blk.%d.ffn_norm" },
{ LLM_TENSOR_ATTN_POST_NORM, "blk.%d.ffn_norm" },
{ LLM_TENSOR_FFN_GATE_INP, "blk.%d.ffn_gate_inp" },
{ LLM_TENSOR_FFN_GATE_EXPS, "blk.%d.ffn_gate_exps" },
{ LLM_TENSOR_FFN_DOWN_EXPS, "blk.%d.ffn_down_exps" },
@ -990,6 +997,9 @@ static const std::map<llm_arch, std::map<llm_tensor, std::string>> LLM_TENSOR_NA
{ LLM_TENSOR_HC_FFN_BASE, "blk.%d.hc_ffn_base" },
{ LLM_TENSOR_HC_FFN_FN, "blk.%d.hc_ffn_fn" },
{ LLM_TENSOR_HC_FFN_SCALE, "blk.%d.hc_ffn_scale" },
{ LLM_TENSOR_FFN_GATE, "blk.%d.ffn_gate" },
{ LLM_TENSOR_FFN_DOWN, "blk.%d.ffn_down" },
{ LLM_TENSOR_FFN_UP, "blk.%d.ffn_up" },
{ LLM_TENSOR_DFLASH_FC, "fc" },
{ LLM_TENSOR_DFLASH_HIDDEN_NORM, "enc.output_norm" },
{ LLM_TENSOR_DSPARK_MARKOV_W1, "markov_w1" },

View File

@ -641,7 +641,8 @@ static ggml_type llama_tensor_get_type(quantize_state_internal & qs, ggml_type n
new_type = GGML_TYPE_IQ6_K;
}
else if (qs.model.hparams.n_gqa() >= 4 &&
!(arch == LLM_ARCH_DFLASH_DRAFT &&
!((arch == LLM_ARCH_DFLASH_DRAFT ||
(arch == LLM_ARCH_DFLASH && !qs.model.hparams.dflash_dsv4)) &&
(ftype == LLAMA_FTYPE_MOSTLY_Q4_K_M || ftype == LLAMA_FTYPE_MOSTLY_Q5_K_M))) {
if (new_type == GGML_TYPE_Q2_K || new_type == GGML_TYPE_IQ3_XXS) new_type = GGML_TYPE_IQ3_S;
else if (new_type == GGML_TYPE_Q2_K_R4 || new_type == GGML_TYPE_IQ3_XXS_R4) new_type = GGML_TYPE_IQ3_K_R4;