6.量化相关

发布时间:2026/11/5 8:02:05
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 区间为中心
适合分布零中心、正负对称偏斜、非零中心
额外参数只有 scalescale + 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 权重。

基本流程

  1. 准备 FP32 预训练模型

  2. 插入伪量化节点

    • 在权重和激活处加入quantize → dequantize模拟

    • 通常使用对称/非对称量化公式

  3. 用训练数据微调

    • 前向:模拟量化误差

    • 反向:用STE(Straight-Through Estimator,直通估计器)近似梯度

  4. 导出量化模型

    • 去掉伪量化节点,生成真正的 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 是“训练时提前适应”。


总结