QAT 和 PTQ 有什么区别?
简化版
PTQ 在训练完成后用校准数据估计 Scale/Zero Point 并量化,成本低、上线快,适合 INT8 或对量化不敏感的模型。QAT 在训练中插入 Fake Quant,让前向模拟舍入/裁剪,反向用近似梯度,使权重主动适应低比特误差,通常更适合 INT4、更低位宽或严格质量要求。
QAT 不是部署时真的用整数训练:训练多用浮点参数,部署才导出整数/低比特格式。选型顺序通常是先做 PTQ 基线,不达标再用混合精度、算法型 PTQ,最后考虑 QAT;两者都必须在目标硬件上验收。
详细版
PTQ: FP model -> calibration -> quantize -> deploy
QAT: FP model -> fake quant forward + STE backward
-> fine-tune -> export integer/low-bit -> deploy
| 维度 | PTQ | QAT |
|---|---|---|
| 是否训练 | 否/少量优化 | 需要微调 |
| 数据 | 无标签可用 | 通常需训练目标 |
| 成本 | 低 | 高 |
| 极低位宽质量 | 较难 | 通常更好 |
| 迭代速度 | 快 | 慢 |
QAT 要匹配真实量化粒度、裁剪、舍入和 Kernel;Fake Quant 配置与部署不一致会产生“模拟通过、上线退化”。
完整版教学
1. PTQ 做了什么
Post-Training Quantization 固定已训练权重,通过权重统计与校准激活确定量化参数,有些算法会做局部误差补偿,但不做完整任务训练。
优势是快速、数据要求低,适合作为第一基线。
权重 Min-Max、SmoothQuant、GPTQ、AWQ 都可归入广义 PTQ 路线,但它们使用的统计与局部优化不同,不能把 PTQ 误解为只有一种算法。
2. QAT 做了什么
Quantization-Aware Training 在前向插入量化—反量化模拟,让 Loss 感知有限精度;主参数通常仍保存浮点。
训练更新权重与可学习 Scale,使模型在量化格点附近找到更稳解。
Observer 负责统计范围,Fake Quant 负责模拟部署数值;部分方案让 Scale 可学习,部分固定统计值,流程应与最终导出器一致。
3. Fake Quant 公式
q = clip(round(x / s) + z, q_min, q_max)
x_hat = s × (q - z)
前向使用 x_hat,模拟部署误差;导出时保存真正低比特 q 与量化参数。
4. STE 为什么需要
round 的真实梯度几乎处处为零,直接反向无法训练。Straight-Through Estimator 在有效范围内近似令梯度通过。
d round(x) / dx ≈ 1 (surrogate)
它是近似,会带来优化噪声,因此学习率和训练稳定性很重要。
5. 什么时候 PTQ 足够
INT8 Weight-only、模型冗余大、质量容忍度高或数据不可用时,PTQ 往往性价比更高。
先用代表校准集和 GPTQ/AWQ 等方法测试,若关键切片均达标,没有必要承担 QAT 复杂度。
6. 什么时候考虑 QAT
INT4/更低位宽、Activation 量化、边缘硬件强约束,或 PTQ 在安全/长尾上无法达标时,QAT 更有价值。
教师蒸馏可在 QAT 中提供稳定目标,帮助小模型或极低位模型恢复能力。
7. 数据要求有什么不同
PTQ 校准重分布覆盖,通常不需标签;QAT 需要可优化 Loss 的训练数据,并防止微调导致灾难性遗忘。
混合目标任务、通用回放和安全数据,验证集与训练/校准严格隔离。
若只有无标签线上输入,可结合教师蒸馏构造目标,但仍需授权、过滤和独立金标验证,避免把教师错误固化进量化模型。
8. 训练流程如何稳定
从已收敛 FP 模型开始,先启用较温和位宽或只量化权重,再逐步打开 Activation/更低位;使用较低学习率。
可先冻结 Observer 收集范围,再冻结 Scale,避免统计与权重同时剧烈漂移。具体顺序依框架验证。
9. 粒度与范围要一致
训练 Fake Quant 的 per-channel/group size、对称性、Zero Point、裁剪与部署格式必须相同。
| 不一致 | 后果 |
|---|---|
| 训练 per-channel,部署 per-tensor | 误差骤增 |
| Group size 不同 | 权重布局不匹配 |
| 训练 INT8,部署 INT4 | 模拟无效 |
| 舍入规则不同 | 边界值偏差 |
导出后需重新跑整数 Kernel 评测。
10. QAT 有哪些成本
Fake Quant 增加训练算子和内存,低比特模拟可能变慢;还需数据、算力、超参数和发布新权重。
训练成本必须与部署生命周期节省比较。低流量短期模型未必值得做 QAT。
11. QAT 会损伤浮点模型吗
模型为了适应格点可能牺牲部分 FP 表现,所以验收对象应是导出的量化模型;同时保留原 FP 检查点用于回滚。
不要用训练中 Fake Quant 的单一分数代替真实导出结果。
训练阶段同时记录浮点主权重路径和 Fake Quant 路径,有助于判断退化来自任务微调还是量化模拟;最终发布仍以真实低比特推理结果为准。
12. 与混合精度如何结合
先用敏感度识别关键层保留 INT8/FP16,其余层做 INT4 QAT,可减少训练难度并保持硬件收益。
精度岛过多会增加 Cast,配置仍需在目标运行时测端到端性能。
13. 如何做公平比较
PTQ 与 QAT 使用同一基座、目标格式、硬件和评测集;报告 QAT 额外训练数据/算力,以及部署质量、延迟、显存和功耗。
上线按 quant_config 灰度,监控长尾、安全、格式和人工接管,保留 PTQ/FP 回滚路径。
QAT 的价值是让模型在训练中适应部署时必然发生的量化误差,而不是让训练过程本身变成整数计算。
14. 常见误区与追问
- 误区:QAT 就是用 INT4 做反向训练。 通常用浮点参数与 Fake Quant。
- 误区:QAT 一定优于 PTQ。 成本更高,且高位宽 PTQ 可能已足够。
- 误区:训练模拟过就能直接上线。 必须验证真实导出与 Kernel。
- 误区:PTQ 完全不需要数据。 Activation 统计和部分算法仍需校准。
- 误区:QAT 不会遗忘原能力。 窄数据微调仍可能退化。
- 追问:为什么需要 STE? round 不可正常求导,需要近似梯度。
- 追问:选型顺序是什么? PTQ 基线→优化 PTQ/混合精度→必要时 QAT。
15. 加强记忆
- 先分阶段:PTQ 训练后,QAT 训练中模拟。
- 再分数据:PTQ 重校准覆盖,QAT 需要训练目标。
- 再记 Fake Quant:浮点模拟低比特舍入裁剪。
- 再记 STE:近似让梯度通过 round。
- 再守一致:粒度、位宽、裁剪、舍入与部署相同。
- 再做选型:先 PTQ,关键不达标再 QAT。
- 最后验收:真实整数 Kernel 上看质量与性能。