文章目录
- [一、PTQ 是什么](#一、PTQ 是什么)
- [二、PTQ 的标准流程(五大步骤)](#二、PTQ 的标准流程(五大步骤))
-
- [✅ Step 0:准备 FP 模型(Baseline)](#✅ Step 0:准备 FP 模型(Baseline))
- [✅ Step 1:插入量化节点(Quantization Simulation)](#✅ Step 1:插入量化节点(Quantization Simulation))
- [✅ Step 2:校准(Calibration)](#✅ Step 2:校准(Calibration))
- [✅ Step 3:确定量化方案(Policy)](#✅ Step 3:确定量化方案(Policy))
- [✅ Step 4:导出量化模型(Encodings + Graph)](#✅ Step 4:导出量化模型(Encodings + Graph))
- [✅ Step 5:验证与部署](#✅ Step 5:验证与部署)
- [三、用一句话总结 PTQ 全流程](#三、用一句话总结 PTQ 全流程)
- 四、一个极简流程图(工程版)
- [五、什么时候 PTQ 不够用?](#五、什么时候 PTQ 不够用?)
-
- [✅ 最后一句工程总结](#✅ 最后一句工程总结)
- 课后题
-
- [一、为什么说 PTQ 的"理论上限"就是逼近当前 FP 模型?](#一、为什么说 PTQ 的“理论上限”就是逼近当前 FP 模型?)
-
- [1️⃣ PTQ 在做什么(抽象层面)](#1️⃣ PTQ 在做什么(抽象层面))
- [2️⃣ 为什么再多 trick 也只能"无限逼近"](#2️⃣ 为什么再多 trick 也只能“无限逼近”)
- [二、那 QAT → dequant 回 BF16,为什么会"更量化友好"?](#二、那 QAT → dequant 回 BF16,为什么会“更量化友好”?)
-
- [1️⃣ QAT 真正学到的是什么?](#1️⃣ QAT 真正学到的是什么?)
- [2️⃣ dequant 回 BF16 后,发生了什么?](#2️⃣ dequant 回 BF16 后,发生了什么?)
- 三、从"工程视角"把两条路线放在一起看
- [四、一个判断标准,决定"值不值得做 QAT-dequant"](#四、一个判断标准,决定“值不值得做 QAT-dequant”)
下面我们用工程视角 把 PTQ(Post‑Training Quantization,训练后量化) 的基本流程 完整梳理一遍。可以把它当成一条标准流水线,无论是 TensorRT / PyTorch / QNN,本质步骤都高度一致。
一、PTQ 是什么
PTQ 的核心特点是:
✅ 模型已经训练完成
✅ 不再反向训练、不更新权重
✅ 通过少量代表性数据,计算量化参数(encodings)
PTQ 主要解决的是:如何在不重新训练的前提下,把 FP32/FP16 模型安全地变成 INT8 / INT16 / 混合精度模型。
二、PTQ 的标准流程(五大步骤)
✅ Step 0:准备 FP 模型(Baseline)
- 输入:已训练好的 FP32 / FP16 模型
- 通常先做:
- 图优化(fold BN、常量折叠)
- 确认算子在目标硬件上可量化
这是后续所有步骤的基础。
✅ Step 1:插入量化节点(Quantization Simulation)
在模型图中插入"量化器(Quantizer / Observer)":
- 权重前:模拟 weight quant
- 激活后:模拟 activation quant
此时:
- 计算仍然是 FP
- 但数值会被"压到量化网格上"
- 用来评估量化误差
这一步通常叫:
- Quantization Simulation
- Fake Quant
- QuantSim
✅ Step 2:校准(Calibration)
这是 PTQ 最核心的一步。
做什么?
- 用少量代表性数据跑模型 forward
- 统计各层激活 / 权重的:
- min / max
- 或直方图 / percentile / KL
目的:
- 计算每个量化器的 scale 和 zero_point
- 也即之前提到的 encodings
⚠️ 权重的 encodings 通常可直接算
⚠️ 激活的 encodings 必须依赖校准数据
✅ Step 3:确定量化方案(Policy)
在校准完成后,需要做策略选择:
- 对称 vs 非对称
- per‑tensor / per‑channel / per‑block
- 哪些层:
- INT8
- INT16
- FP16(混合精度)
这一步往往结合:
- 量化敏感度分析
- 精度 / 性能 trade‑off
✅ Step 4:导出量化模型(Encodings + Graph)
输出通常包括两部分:
- 量化后的模型结构
- 权重已是 INT8 / INT16
- encodings 文件
- scale
- zero_point
- bitwidth
这些会被交给:
- TensorRT
- QNN
- NPU 编译器
用于生成真正的整数推理图。
✅ Step 5:验证与部署
最后一定要做:
- 精度验证(Top‑1 / BLEU / Rouge / ppl)
- 性能验证(latency / throughput / power)
- 与 FP baseline 对齐
如果精度不够:
- 回到 Step 3
- 做 mixed precision 或范围调整
三、用一句话总结 PTQ 全流程
PTQ =
插量化器 → 跑校准数据 → 算 encodings → 固化量化参数 → 导出整数模型
四、一个极简流程图(工程版)
FP 模型
↓
插入 Quantizer(仿真)
↓
Calibration(跑少量数据)
↓
计算 scale / zero_point
↓
选择量化策略(INT8 / INT16 / 混合)
↓
导出量化模型 + encodings
↓
部署到目标硬件
五、什么时候 PTQ 不够用?
当出现:
- 精度下降明显
- LLM / Attention 特别敏感
- 低 bit(≤ INT4)
👉 就需要:
- QAT
- AWQ / GPTQ / SmoothQuant 等高级方案(但仍然以 PTQ 思想为基础)
✅ 最后一句工程总结
PTQ 是"用最小成本,把训练好的模型推向可部署状态"的量化方案,
也是所有高级量化技术的起点。
课后题
PTQ只能无限逼近浮点模型的精度吗?QAT做完再dequant回bf16的模型,能让模型对量化更友好?
-
PTQ 本身的上限,确实是"在给定量化格式下,尽量逼近当前浮点模型的行为"
👉 它不会改变模型对量化误差的"内在敏感性",只能在既定 FP 权重分布下做最优近似。
-
QAT → 再 dequant 回 BF16/FP16,确实可以让模型"对量化更友好"
👉 但这不是魔法,它本质上是:
用量化噪声当正则,重新塑造权重 / 激活分布,使其更容易被低比特表示。
换句话说:
✅ QAT-dequant ≠ 提升 FP 模型"绝对精度"
✅ QAT-dequant = 提升 FP 模型"可量化性(quantizability)"
一、为什么说 PTQ 的"理论上限"就是逼近当前 FP 模型?
1️⃣ PTQ 在做什么(抽象层面)
不管我们用的是:
- min/max / percentile
- GPTQ / AdaRound / SpinQuant
- CLE / BN re-estimation
PTQ 都遵循同一个约束:
✅ 不允许修改 FP 模型的"功能形式"
✅ 只能在 固定 FP 权重 + 固定前向结构 下,找一个量化表示
形式化一点:
min quant params ∥ f quant ( x ) − f fp ( x ) ∥ \min_{\text{quant params}} \; \| f_{\text{quant}}(x) - f_{\text{fp}}(x) \| quant paramsmin∥fquant(x)−ffp(x)∥
也就是说:
- 目标函数是 FP 模型
- FP 模型本身不动
2️⃣ 为什么再多 trick 也只能"无限逼近"
即便用:
- 二阶信息(GPTQ)
- 残差补偿
- 更复杂的 rounding search
如果 FP 权重分布本身是:
- 有极端 outlier
- LN / exp 前激活分布重尾
- 某些层对 scale 特别敏感
👉 那 PTQ 能做的只是:
- 把误差挪一挪
- 在不同 token / channel 之间平衡损失
但它无法改变:
- 权重是否"天生适合 4bit / 8bit"
- 激活分布是否"量化友好"
所以我们看到的现象通常是:
- PTQ:接近 FP,但总差一点
- 而且 bitwidth 越低,gap 越"刚性"
二、那 QAT → dequant 回 BF16,为什么会"更量化友好"?
这是一个非常容易被误解、但在工程上极其重要的点。
1️⃣ QAT 真正学到的是什么?
QAT 的训练目标并不是:
"把 FP 精度训得更高"
而是:
min E x [ ∥ f fake-quant ( x ) − y ∥ ] \min \; \mathbb{E}{x} \left[ \| f{\text{fake-quant}}(x) - y \| \right] minEx[∥ffake-quant(x)−y∥]
也就是说:
- 前向里长期暴露在量化噪声下
- 梯度会逼着模型去"适应这个噪声模型"
结果是,模型会自发地:
- 压缩权重动态范围
- 减少对单点 outlier 的依赖
- 让重要信息集中在"量化 bins 的中心"
- 让激活分布更接近对称 / 稳定
👉 这些都是"对量化友好"的结构性变化
2️⃣ dequant 回 BF16 后,发生了什么?
这是关键点:
dequant 并不会把模型"变回原来的 FP 模型"
我们得到的是一个新的 BF16 模型:
θ bf16 QAT-dequant ≠ θ bf16 orig \theta_{\text{bf16}}^{\text{QAT-dequant}} \neq \theta_{\text{bf16}}^{\text{orig}} θbf16QAT-dequant=θbf16orig
它具备两个特性:
- 功能上接近原模型
- 参数分布是"为量化优化过的"
所以我们会看到非常典型的工程现象:
- 原 FP → PTQ:
- W4A16 掉很多
- QAT → dequant → 再 PTQ:
- 同样 W4A16,明显稳很多
- calibration 不那么敏感
- GPTQ / SpinQuant 更容易收敛
三、从"工程视角"把两条路线放在一起看
| 路线 | 本质 | 能解决什么 | 解决不了什么 |
|---|---|---|---|
| PTQ only | 近似固定 FP | 快、无需训练 | FP 模型本身"不可量化"的问题 |
| QAT → dequant | 重塑模型分布 | 提升可量化性 | 需要训练成本 |
| QAT → PTQ | 最常见工业解 | 稳定低 bit PTQ | 不是 0 成本 |
| PTQ + GPTQ | 最优逼近 | 推极限 | 上限仍由 FP 决定 |
一句非常工程化的总结:
🔹 PTQ 是"压缩器"
🔹 QAT 是"为压缩而重新设计内容"
四、一个判断标准,决定"值不值得做 QAT-dequant"
可以用这个经验判断:
- ✅ W8A8 / W8A16 已经很稳
→ QAT-dequant 意义不大 - ✅ W4A16 / W4A8 / KV quant 非常敏感
→ QAT-dequant 非常值得 - ✅ 同一模型,不同 PTQ notebook 结果差异巨大
→ 模型本身量化脆弱,QAT 很可能是"治本"