Skip to content

fix: GGUF UD 混合量化类型导致 MTP 权重无法融合 - #721

Open
jyf2100 wants to merge 1 commit into
ztxz16:masterfrom
jyf2100:fix/gguf-ud-mtp-fusion
Open

jyf2100 wants to merge 1 commit into
ztxz16:masterfrom
jyf2100:fix/gguf-ud-mtp-fusion

Conversation

@jyf2100

@jyf2100 jyf2100 commented Sep 8, 2026

Copy link
Copy Markdown

问题

UD 动态量化的 GGUF(如 Qwen3.8-27B-UD-Q4_K_XL.gguf)会在同一个 block 内混用 GGML 类型——实测该文件全部 65 层都是 ffn_gate = IQ4_XSffn_up = Q4_K。而加载期的权重合并规则(model.cpp 中 gate+up → gateup、q+k+v → mergeqkv)要求各输入 ggmlType 一致,类型混合时 canMerge = false 静默跳过

主层 forward 支持分离投影,模型照常运行;但 HasMtpWeights() 硬性要求融合的 mtp.layers.N.mlp.gateup_proj.weight 存在,于是 --mtp 静默失效:无报错、无 [Qwen3.5 MTP] 日志,任何混类型 UD 量化 GGUF 都无法使用 MTP。

修复

RemapQwen35GGUFMtpTasksrc/model.cpp)对 2-D 的 MTP 张量改走 GGUFWeightReplaceForceFP16(复用现成的反量化通道),MTP 各矩阵类型统一为 FP16 后,合并机制即可正常产出 gateup_projmergeqkv。MTP 栈通常只有 1 层,FP16 约 850MB,显存增量可控。

另在 HasMtpWeights() 顶部加了 FASTLLM_DEBUG_MTP 环境变量门控的 mtp.* 权重清单打印,方便此类问题诊断(默认关闭,无开销)。

验证

Qwen3.8-27B-UD-Q4_K_XL.gguf + RTX 3090 24GB(--device cuda --mtp 3):

  • 修复前:FASTLLM_DEBUG_MTP=1 显示 15 个 mtp 权重,gate_proj/up_proj 分离存在、无 gateup_projHasMtpWeights false,无任何 MTP 日志
  • 修复后:12 个 mtp 权重(gate/up 融合为 gateup_proj,q/k/v 融合为 mergeqkv),日志出现:
[Qwen3.5 MTP] enabled: layers=1, drafts_per_step=3, root_device=cuda:0, ...
[Qwen3.5 MTP] pos_accept_rate=[87.0%, 72.4%, 54.7%]

decode 约 3.1 token/次验证,实测 44 → 50-58 tok/s;17×23=391、代码/翻译等生成质量正常。

测试计划

  • UD-Q4_K_XL GGUF + --mtp 3:MTP enabled、接受率、生成质量
  • 无 MTP 的普通加载回归(--mtp 0
  • 非 UD 的同类型 GGUF(理论上无影响:同类型时本就走合并路径)

UD 动态量化会在同一 block 内混用 GGML 类型(如 ffn_gate=IQ4_XS
配 ffn_up=Q4_K),加载期 gate+up / q+k+v 合并规则要求两输入
ggmlType 相同而静默跳过。主层 forward 支持分离投影不受影响,
但 HasMtpWeights 硬性要求融合的 mtp.layers.N.mlp.gateup_proj,
MTP 因此静默失效。

RemapQwen35GGUFMtpTask 对 2-D 的 MTP 张量改走
GGUFWeightReplaceForceFP16(反量化到 FP16),合并机制即可产出
gateup_proj 与 mergeqkv;MTP 单层 FP16 约 850MB,显存增量可控。

另在 HasMtpWeights 顶部加 FASTLLM_DEBUG_MTP 环境变量门控的
mtp.* 权重清单打印,用于此类问题诊断。

实测 Qwen3.8-27B-UD-Q4_K_XL.gguf + 3090:
[Qwen3.5 MTP] enabled: layers=1, drafts_per_step=3
pos_accept_rate=[81.25%, 59.38%, 34.38%],decode ~44 tok/s。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant