文章目录
[一、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 很可能是"治本"