6.量化相关
系列文章目录
章节1:什么是MLIR
章节2:MLIR的引入
章节3:MLIR完成一个端到端的流程
章节4:编写一个pass
章节5:MLIR相关语法
章节6:量化相关
章节7:训练相关
文章目录
目录
系列文章目录
文章目录
公式对比
核心区别
为什么这样选?
一个直观例子
硬件与计算差异
二、量化校准Calibration
主流校准策略详解
如何选择?
三、QAT(Quantization-Aware Training,量化感知训练)
核心思想
基本流程
为什么需要 STE?
QAT vs PTQ
优点
缺点
一句话总结
总结
一、INT8对称量化和非对称量化
INT8 对称量化和非对称量化的核心区别在于:是否允许零点(zero-point)不为 0,以及如何利用 INT8 的数值范围。
公式对比
对称量化
特点:zero_point = 0,正负对称。
非对称量化
特点:zero_point 可以不为 0,浮点 0 不一定映射到整数 0。
核心区别
| 维度 | 对称量化 | 非对称量化 |
|---|---|---|
| 零点 | 固定为 0 | 可非 0,需存储zp |
| 数值范围 | 通常 [−127,127][−127,127] | 常用 [0,255][0,255] 或 [qmin,qmax][qmin,qmax] |
| 映射中心 | 以 0 为中心 | 以实际 min/max 区间为中心 |
| 适合分布 | 零中心、正负对称 | 偏斜、非零中心 |
| 额外参数 | 只有 scale | scale + zero-point |
| 计算复杂度 | 更低,无 zp 偏移 | 略高,需要处理 zp |
| 典型用途 | 权重量化常用 | 激活量化常用 |
为什么这样选?
对称量化适合权重
权重通常围绕 0 分布,正负都有,且对称量化无零点,计算简单。权重常用per-channel 对称量化,每个通道一个 scale。
非对称量化适合激活
激活经过 ReLU 后往往全为正,分布不关于 0 对称。如果强行对称量化,会浪费一半整数范围;非对称量化能把 [xmin,xmax][xmin,xmax] 更充分地映射到 INT8 范围,误差更小。
一个直观例子
假设激活值范围是 [0,6][0,6]:
对称量化:s=6/127s=6/127,但负数范围 [−127,0)[−127,0) 完全浪费,实际只用了约一半整数。
非对称量化:映射到 [0,255][0,255],整个 INT8 范围都被利用,精度更高。
硬件与计算差异
对称量化:因为 zp=0zp=0,反量化是 x^=sqx^=sq,卷积累加后只需乘 scale,硬件实现简单。
非对称量化:反量化是 x^=s(q−zp)x^=s(q−zp),计算中要处理零点偏移,但现代 NPU/GPU 通常有专门支持。
二、量化校准Calibration
量化校准(Calibration)的核心目的,是用少量有代表性的数据跑一遍浮点模型,为激活值等张量找到最合适的量化参数(scale和zero-point),在将浮点数映射到INT8时,尽可能保留原始信息的分布,从而减少精度损失。这个过程主要针对训练后量化(PTQ)中的静态激活量化,因为激活值的范围会随输入变化,无法提前预知。
主流校准策略详解
不同的校准策略,本质上是选择“截断阈值(Clipping Threshold)”的不同方法,这个阈值直接决定了量化范围。
1. MinMax(最大最小值)
这是最直接的方法,直接使用校准集上观察到的全局最小值和最大值来确定量化范围。
优点:计算简单,实现直接。
缺点:对离群点(Outliers)极度敏感。如果存在个别极大或极小的值,会将量化范围拉得很宽,导致正常数值的量化精度被严重压缩。
适用场景:数据分布比较干净、几乎不存在极端值的场景。
2. Percentile(百分位数)
为了应对离群点,Percentile方法不取绝对的极值,而是取一个百分位数(如99.9%)作为截断阈值,将超出该范围的极端值直接“裁剪”掉,用边界值代替。
优点:能有效抑制离群点的干扰,为大部分正常数据保留更多的量化精度。
缺点:需要预设一个百分位数,如果设置不当,可能会损失掉一些重要的尾部信息。
适用场景:激活值存在明显长尾分布或离群点的模型。
3. KL Divergence / Entropy(KL散度/熵校准)
这是一种信息论方法。它不直接看数值大小,而是尝试找到一个截断阈值,使得量化后的数据分布与原始浮点数据分布之间的KL散度(相对熵)最小,从而在信息层面保留最多的原始分布特性。
优点:从分布相似性的全局视角出发,通常能取得比MinMax更好的精度,对离群点也有较好的鲁棒性。
缺点:计算量相对较大,需要进行分布统计和搜索。
典型应用:NVIDIA TensorRT就采用此方法作为其默认的校准策略之一。
4. MSE(均方误差)校准
该方法旨在最小化量化后反量化值与原浮点值之间的均方误差(MSE),通过搜索找到使MSE最小的截断阈值。
优点:目标直接,就是让数值上的误差最小,在回归类任务中概念清晰。
注意:有研究表明MSE校准在某些场景下可能并不稳定,存在严重失败的案例,因此并非总是可靠选择。
5. EMA(指数移动平均)
EMA通常与MinMax结合使用,用于平滑地跟踪激活值的范围。它不直接使用当前批次的极值,而是用新范围 = α * 当前范围 + (1-α) * 历史范围的方式进行更新。这可以避免因个别异常批次导致量化范围剧烈波动,使校准过程更稳定。
6. 自适应/混合策略(前沿方向)
没有一种策略是万能的。前沿研究倾向于根据每一层激活值的实际分布,自适应地选择或融合不同的校准策略(如Min-Max、KL散度、百分位裁剪)。例如,对于分布正常的层用MinMax,对离群点严重的层用Percentile或KL,从而在整体上取得更优的精度-效率平衡。
如何选择?
校准策略的选择是一个权衡过程:
追求速度与简单:MinMax或EMA-MinMax是默认选项。
应对离群点:Percentile或KL Divergence通常是更稳健的选择。
关注数值误差:可以尝试MSE,但需注意其潜在的不稳定性。
追求极致精度:可以考虑分层(Layer-wise)应用不同策略,或探索自适应混合校准等更精细的方案。
三、QAT(Quantization-Aware Training,量化感知训练)
是一种在训练或微调阶段就模拟量化误差的模型压缩方法。它的目标不是训练完再量化,而是让模型在训练过程中“提前适应”低精度(如 INT8)带来的舍入、截断误差,从而在最终部署为低精度模型时尽量保持精度。
核心思想
普通训练用 FP32 计算和更新权重。QAT 在前向传播中插入伪量化节点(Fake Quantization),模拟:
权重量化:FP32 → INT8 → 反量化回 FP32
激活量化:同样模拟量化再反量化
这样前向计算看到的数值已经带有量化误差,但反向传播仍然可以更新 FP32 权重。
基本流程
准备 FP32 预训练模型
插入伪量化节点
在权重和激活处加入
quantize → dequantize模拟通常使用对称/非对称量化公式
用训练数据微调
前向:模拟量化误差
反向:用STE(Straight-Through Estimator,直通估计器)近似梯度
导出量化模型
去掉伪量化节点,生成真正的 INT8 权重和量化参数
部署到推理引擎
为什么需要 STE?
量化中的round()和clamp()不可导或梯度为 0。STE 的做法是:反向传播时直接把量化节点的梯度“直通”过去,近似认为:
∂q∂x≈1∂x∂q≈1
这样 FP32 权重仍然能收到有意义的梯度并更新。
QAT vs PTQ
| 维度 | PTQ(训练后量化) | QAT(量化感知训练) |
|---|---|---|
| 是否需要训练 | 不需要 | 需要微调 |
| 精度 | 通常较低,敏感模型可能掉点明显 | 通常更高,能更好恢复精度 |
| 成本 | 低,校准即可 | 高,需要训练资源和时间 |
| 适用场景 | 常规 CNN、精度要求不极端 | Transformer、检测、分割、低比特量化等敏感场景 |
优点
精度损失通常比 PTQ 小
能处理对量化敏感的层和模型
支持更低比特(如 INT4)探索
缺点
需要训练数据和训练流程
计算成本高
实现比 PTQ 复杂,需要伪量化节点和 STE
一句话总结
QAT 就是在训练时“假装已经量化了”,让模型学会适应量化误差,最终部署成真正的低精度模型时精度更稳。它和 PTQ 的核心区别是:PTQ 是“事后校准”,QAT 是“训练时提前适应”。