0
0

大模型量化精度异常定位:从 Benchmark 掉点到逐层数值二分

整理日期:2026-09-16。来源:本次 GLM-5.3-Flash W8A8 精度异常讨论,并结合当前 msModelSlim GLM-5.3-Flash 适配说明整理。本文重点不是判断某一份权重“有问题”,而是建立一套可复用的量化精度 Debug 方法。

问题起点:模型能正常说话,但 GPQA 明显掉点

量化故障最难的一类,不是模型乱码或直接崩溃,而是模型仍能流畅生成、简单问答也正常,但复杂 reasoning benchmark 明显下降。此时可能的根因至少分为五层:量化前的等价变换、scale/校准、导出与保存、推理框架加载、真实低比特 kernel。

因此不能从“W8A8 分数低”直接跳到“权重坏了”。正确的问题应改写为:第一个不可接受的数值偏差发生在哪里?

一条完整的量化执行链

原始 checkpoint
  ↓
模型适配与权重加载(必要时 FP8→BF16)
  ↓
QuaRot / Smooth / Fold 等预处理
  ↓
Fake Quant / INT8 参数生成
  ↓
Saver:权重、scale、量化描述落盘
  ↓
Runtime Loader:vLLM-Ascend 等重新加载
  ↓
真实 INT8 kernel / fused operator
  ↓
Logits / 生成 / Benchmark

Debug 的核心不是从最后一层猜原因,而是沿这条链寻找“第一次分叉”。

第一层:先固定评测协议

在数值排障前先固定输入与协议,否则会把评测噪声误认成量化误差。至少固定:模型 revision、tokenizer/chat template、reasoning budget、temperature/top_p、max tokens、数据集 split、答案提取器、并发与超时。

对于选择题任务,保留每题原始响应、抽取后的答案和 finish_reason。如果模型已经在这里因为 parser 或截断被判错,应先修评测链路,再做量化数值分析。

第二层:Benchmark 只是报警器,Logits 才是第一把显微镜

选取少量已知失败样本,并使用固定 token 前缀,比较 reference 与 quantized 模型的 next-token logits:

  • cosine similarity;
  • MSE / max absolute error;
  • KL divergence;
  • top-1 token 是否一致;
  • top-k token overlap。

固定前缀非常重要。自由生成一旦前面某个 token 不同,后续上下文就不同,很难判断偏差到底来自哪里。

第三层:逐层 hidden-state 二分

对相同输入记录每一层输出:

El=∥Hlq−Hlref∥2∥Hlref∥2 E_l=\frac{\lVert H_l^{q}-H_l^{ref}\rVert_2}{\lVert H_l^{ref}\rVert_2}

同时记录 cosine similarity。关注“第一次突变”的 layer,而不是最后已经完全分叉的输出。例如前 17 层 cosine 都在 0.999 左右,而第 18 层突然降到 0.97,则优先拆第 18 层,而不是继续看后面几十层。

第四层:把异常层拆到 module / tensor

对 GLM-5.3-Flash 这类混合架构,优先检查结构特有路径:

  • KDA / Linear Attention:b_proj、forget_gate.f_a_proj、g_a_proj、conv/state;
  • DSA / indexer:index_kpool_compress_gate、index score、selected indices;
  • MoE:router logits、top-k expert IDs、routing weights、expert output;
  • MTP / mHC:特殊 residual 与预测头路径。

当前 msModelSlim 的 GLM-5.3-Flash 适配说明明确记录过:KDA/DSA 门控投影若没有进入正确的平滑补偿、γ-fold、rotation targets,会造成导出后 gate score 错误;index_kpool_compress_gate 还涉及裸 nn.Parameter 到 nn.Linear 的特殊包装。这说明“能运行”与“结构特有量化逻辑正确”是两道不同验收。msModelSlim GLM-5.3-Flash 适配说明

第五层:对本应等价的预处理建立 invariant

INT8 本身允许产生量化误差,但 rotation、fold、smooth compensation 等重新参数化步骤通常应在真正量化前保持函数近似等价。

因此应单独比较:

原模型
→ rotation only
→ rotation + smooth/fold
→ fake W8A8
→ export/reload
→ real runtime

如果还没进入 INT8,某个等价变换就让 cosine 从 0.9999 掉到 0.90,这不是“正常量化损失”,而应优先视为实现或映射错误。

第六层:MoE 必须检查路由离散变化

MoE 对小误差尤其敏感。router logits 只改变千分之几,也可能改变 top-k expert:

Reference: [17, 31]
Quant:     [31, 52]

一旦 expert 选择变化,后续 hidden state 会快速分叉。因此除 hidden cosine 外,还应记录:router logits cosine、top-k expert overlap、routing weight error、per-expert output cosine。

第七层:区分算法、Saver 与 Runtime

即便确认 W8A8 异常,也不能立即认定“量化算法错了”。需要做三个边界实验:

  1. 内存中的 fake/quant model 已异常:重点查量化算法、scale、calibration、smooth/fold/rotation。
  2. 内存模型正常,保存再加载后异常:重点查 saver、tensor key、scale/offset、transpose、packing、per-expert stack/unstack、量化描述文件。
  3. 导出模型在参考计算正常,真实 runtime 异常:重点查 loader、布局转换、fused op 与 Ascend kernel。

第八层:Calibration 问题不是代码 Bug,但表现很像

静态 W8A8 的 activation scale 依赖校准分布。若 calibration 主要是短文本,而线上任务是长英文科学推理,某些层可能出现明显 clipping。需要记录 calibration 与目标任务上的 activation min/max、p99/p99.9、scale 与 clipping ratio。

如果算法逻辑正确但目标任务的 clipping ratio 大幅上升,解决方向应是改 calibration corpus、量化粒度或敏感层策略,而不是修代码。

解决问题的三种层级

**临时恢复质量:**敏感模块回退 BF16,例如 gate、router、indexer 或少数异常层,先验证 Benchmark 是否恢复。

**中期修复:**补齐 target map、smooth/fold compensation、scale 广播、tensor layout 或 saver 逻辑,并加入单层/模块级 regression test。

**长期修复:**重新设计对该结构更稳健的量化策略、calibration 或混合精度 recipe,再回到真实 kernel 做性能验证。

最小实验矩阵:不要一上来跑完整 Benchmark

固定 5~10 个失败样本和一小组正常样本,按阶段比较:

source
→ post-rotation
→ post-smooth/fold
→ fake-quant
→ export/reload
→ vLLM-Ascend runtime

一旦某一步首次出现明显 divergence,再做 layer-wise → module-wise → tensor-wise 二分。完整 GPQA/AIME 只用于最后回归,不适合作为源码级定位工具。

多 Agent 如何真正提高效率

几十个 Agent 不能把强依赖的实验链完全并行化。适合并行的是:源码/PR 历史、权重 provenance、量化配置、KDA/DSA/MoE 结构、saver/runtime、numerical diff harness。核心实验链仍需串行:上一轮结果决定下一轮测试。

更合理的组织是 4~6 个并行方向加一个主控实验链,而不是几十个 Agent 同时猜根因。

工期判断

“彻底找到根因并修好”可能需要数天甚至更久,尤其问题跨越模型适配、数值算法和 runtime 时。但 1~2 天的现实目标可以是:把问题从“整模型精度异常”压缩到某个阶段、某层或某个 module,并形成可复现的最小失败样例。

一旦问题被描述为“第 N 层某 gate 在 smooth/fold 后首次产生显著偏差”,修复难度会从系统级未知问题下降为一个具体工程 Bug。

相关笔记:GLM-5.3-Flash 精度异常复盘:从 GPQA 反馈到分层定位;量化学习路线:从 ModelSlim 到算法、可复现性与推理部署。