## Root cause
vllm 的 MTP loader (`qwen3_5_mtp.py:load_weights`) 是 quant-unaware,
永远期待无 q 前缀的参数命名 (如 `experts.w13_weight`).
但 INT4 量化 (AWQ/GPTQ) MoE 走 `MoeWNA16Method`, 创建的是
`w13_qweight`/`w13_scales`/`w13_qzeros` (带 q 前缀, 因为需要区分 packed INT4 跟 fp16 weight).
→ MTP loader 找 `w13_weight` 时 params_dict 只有 `w13_qweight` → KeyError.
主模型 loader (`qwen3_5.py`) 有 `get_expert_mapping()` 这层 quant-aware 间接, 所以主模型正常.
MTP loader 缺这层间接, 所以 MTP 启用就崩.
## 3 条解法 (任选其一)
### 1. (推荐) 直接用已经标了 mtp 不量化的 AWQ 模型
在 config.json 加这行让 vllm 把 MTP module 走 Unquantized backend:
json
"quantization_config": {
"quant_method": "awq",
"modules_to_not_convert": ["mtp"]
}
现成可用: tclf90/Qwen3.5-122B-A10B-AWQ (modelscope)
2. 换 W8A8 量化 (整模型 INT8)
W8A8 走 vllm Quark backend, 自然创建 w13_weight (无 q 前缀, 因为 INT8 用 weight + scale 模式).
现成: metax-tech/Qwen3.5-122B-A10B-W8A8 (metax量化版, 也兼容dcu)
影响范围
不只 AWQ, 任何走 MoeWNA16Method 的 INT4 量化都撞
AWQ / GPTQ-Int4 / compressed-tensors INT4 都中招.
W8A8 不撞.
实测数据 (Qwen3.5-122B-A10B, TP=4, bench 128 req)
│ 配置 │ TPOT │ Throughput │ MTP acceptance │
│ AWQ 裸跑 │ 281 ms │ 383 tok/s │ — │
│ AWQ + MTP (tclf90, 标 mtp 不量化) │ 185 ms │ 417 tok/s │ 87.11% │
│ W8A8 + MTP (metax) │ 88 ms │ 774 tok/s │ 80.08% │
(实测平台: 海光 K100-AI dcu, vllm 0.18.1)