量化上线前回归测试应该覆盖什么?
简化版
量化回归不能只看平均困惑度或通用榜单,要同时验证任务质量、长尾、安全、格式/工具、长上下文、数值稳定和目标硬件性能。测试对象必须是真正导出的低比特模型与生产 Kernel,而不是训练中的 Fake Quant。
采用 FP16 基线做配对比较,按语言、任务、长度、风险和硬件分桶;设置平均退化、关键切片和安全红线。性能覆盖 TTFT、TPOT、吞吐、峰值显存、功耗、冷启动及不同 Batch,并检查是否出现慢速 Kernel 回退。
详细版
export -> artifact validation -> numerical sanity
-> task/long-tail/safety regression
-> hardware benchmark -> soak/canary -> rollback gate
| 测试层 | 关键项 |
|---|---|
| 产物 | 位宽、Scale、Shape、模型哈希 |
| 数值 | NaN/Inf、Logit/KL、层误差 |
| 质量 | 任务成功、事实、校准、长尾 |
| 结构化 | JSON、代码、工具调用 |
| 性能 | TTFT/TPOT、吞吐、显存、功耗 |
| 稳定 | 长跑、并发、OOM、版本兼容 |
关键样本用相同输入和解码配置配对比较,生成任务可多 Seed;上线先影子和小流量灰度,按 quant_config 记录指标并保留高精度回滚。
完整版教学
1. 先验证量化产物
检查模型版本、位宽、Group Size、对称性、Scale/Zero Point、混合精度层和 Tokenizer 是否符合 Manifest。
错误导出可能仍能加载并生成文本,却实际回退 FP16 或使用错误布局。
2. 为什么要测真实 Kernel
Fake Quant 模拟数值误差,不代表部署引擎的舍入、饱和和算子融合完全一致。
加载导出产物后记录实际 Kernel 与数据类型,防止不支持的算子静默回退。
还要对比引擎启停优化前后的数值和性能;某些融合 Kernel 具有自己的累加精度与约束,可能只在特定 Shape 生效。
3. 数值健全性检查
用固定样本比较层输出、Logits、KL、TopK 重合和 NaN/Inf,快速定位异常层。
relative_error = ||y_quant - y_fp|| / max(||y_fp||, epsilon)
数值差异是诊断信号,不直接等于业务质量。
4. 通用任务质量
覆盖语言理解、生成、推理、领域任务和真实业务 Golden Set,固定 Prompt、Tokenizer 与解码参数。
报告平均值与置信区间,并与 FP16 做样本级差异,定位新增失败而非只看总分。
5. 长尾切片
测试小语种、专业术语、稀有意图、长输入、复杂推理和历史线上失败。每个关键切片设独立门槛。
平均提升不能抵消某个合规或高价值场景大幅下降。
6. 安全与校准
测提示注入、有害请求、隐私、越权、漏拒与过拒;比较拒答边界是否因 Logit Margin 扰动而移动。
同时测置信度/校准,因为量化可能保持准确率却让概率更过度自信。
安全测试使用固定红队集和线上新攻击切片,严重违规按绝对数量与比例双重门槛;不能让普通帮助性得分抵消安全退化。
7. 结构化与工具
执行 JSON Schema、编译、单测和工具沙箱,不以语义相似度替代可执行成功。
| 场景 | 指标 |
|---|---|
| JSON | Schema/解析成功率 |
| 代码 | 编译与测试通过率 |
| 工具 | 名称、参数、任务成功率 |
| 引用 | 引用存在且支持答案 |
一个 Token 错误即可导致整体失败。
8. 长上下文测试
按 1K、4K、16K、32K 等长度,覆盖信息位于首、中、尾,测 Needle、跨段推理和多轮状态。
若同时量化 KV,需单独组合测试权重与 KV 量化,区分误差来源。
9. 生成稳定性
检查重复、退化循环、乱码、提前 EOS 和输出长度分布。随机采样任务使用多 Seed,不能用一次结果下结论。
对确定性结构任务用 temperature=0 固定比较,对创作任务看分布与人工偏好。
10. 性能矩阵怎么设计
在目标卡型/CPU 上组合短长输入、短长输出、低高 Batch 与并发,预热后报告 P50/P95/P99。
记录 TTFT、TPOT、Tokens/s、显存、功耗、加载时间和单位成功成本;量化只改善某阶段时要明确。
11. 稳定性与长跑
持续压测缓存增长、内存泄漏、OOM、动态 Shape、不同租户 Adapter 和并行通信。
监控错误、重试与温度;短 Benchmark 无法发现缓存碎片和极端 Shape 回退。
长跑中周期性回放固定探针,区分流量随机变化与运行时状态累积;发现内存单调增长或性能漂移时保存 Profile 与请求长度分布。
12. 如何设置门槛
定义总体允许退化、关键切片绝对门槛和安全零容忍项;性能要求在质量通过后评估。
ship if quality_delta >= -budget
and every_critical_slice_passes
and safety_passes
and target_hardware_speedup > minimum
门槛在测试前确定。
13. 灰度与回滚
先影子比较,再按低风险流量灰度;记录模型、quant_config、硬件与 Kernel 版本。
观察线上任务成功、格式、安全、P99、Fallback 和人工接管。保留 FP16 版本与路由开关快速回滚。
量化回归的目标不是证明模型“看起来还能回答”,而是证明关键能力仍在且硬件收益真实存在。
14. 常见误区与追问
- 误区:困惑度变化小就可以上线。 结构化、安全和长尾可能退化。
- 误区:Fake Quant 分数代表部署模型。 导出与 Kernel 仍可能不同。
- 误区:平均榜单足够。 关键切片会被稀释。
- 误区:显存下降就算性能通过。 延迟可能因反量化更慢。
- 误区:单个 Seed 能比较生成质量。 随机输出需多次采样。
- 追问:怎样发现慢速回退? 记录实际 Kernel、数据类型并做性能基线。
- 追问:最重要的回滚条件? 安全/关键质量红线或 SLO 退化。
15. 加强记忆
- 先验产物:配置、Shape、哈希和真实位宽。
- 再验数值:层误差、Logit、NaN/Inf。
- 再验能力:任务、长尾、安全、格式与长上下文。
- 再验随机性:配对、多 Seed 与输出分布。
- 再验硬件:真实 Kernel、长度、Batch、P99。
- 再做长跑:OOM、泄漏、碎片和回退。
- 最后灰度:版本化指标与高精度快速回滚。