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