第1章:量化技术实战——INT8/INT4量化原理、对称/非对称量化、QAT与PTQ,以及量化对精度和延迟的影响

1.1 量化到底在干什么?

量化,说白了就是把模型里的浮点数(FP32)换成整数(INT8、INT4)。

为什么要这么干?因为整数运算快,功耗低,占内存小。你想想看,一个FP32的权重是4字节,换成INT8就变成1字节,直接省了75%的存储。在AI芯片上,这意味着一块SRAM能塞下更大的模型,或者同样的模型能跑得更快。

我个人习惯把量化理解成“精度换速度”的生意。你损失一点精度,换来几倍的推理加速。这笔账划不划算?得看你的应用场景。

核心公式:

量化值 = round(浮点值 / scale) + zero_point

反量化:浮点值 = (量化值 - zero_point) × scale

这里的 scale 是缩放因子,zero_point 是零点偏移。这两个参数决定了量化映射的方式。

1.2 对称量化 vs 非对称量化

这是量化里最基础的选择题。

对称量化:零点固定在0。说白了就是正负对称,映射范围是 [-127, 127](INT8)。好处是计算简单,硬件实现方便。坏处是如果数据分布不对称,比如全是正数,那负半轴的量化区间就浪费了。

非对称量化:零点可以偏移。映射范围是 [0, 255](INT8)。好处是能充分利用量化区间,精度损失更小。坏处是计算时多了一个零点偏移,硬件实现稍微复杂一点。

我在项目中遇到过一个问题:某个激活层的输出全是正数,用对称量化时,量化后的有效范围只有 [0, 127],相当于只用了一半的精度。换成非对称量化后,精度直接提升了0.3%。

我的建议:

权重一般用对称量化,因为权重分布通常接近对称。激活值用非对称量化,因为ReLU后的输出全是非负的。

1.3 INT8 vs INT4:精度与速度的博弈

量化位宽 存储节省 理论加速比 精度损失 适用场景
INT8 75% 2-4x 较小(<1%) 大多数推理场景
INT4 87.5% 4-8x 较大(1-5%) 边缘设备、大模型

INT8是目前最成熟的量化方案。大多数AI芯片都原生支持INT8计算。INT4呢?嗯,这里要注意,INT4的精度损失确实更大,但存储节省更明显。我记得有一次在嵌入式设备上跑BERT,FP32模型太大装不下,换成INT4后刚好塞进内存,虽然精度掉了2%,但推理速度翻了6倍。

避坑指南:

我曾经在某个项目里直接对模型做INT4量化,结果精度掉了8%。后来发现是某个层的激活值范围太大,量化后信息丢失严重。解决办法是:先做INT8量化,再对敏感层做混合精度(INT8+INT4)。

1.4 训练后量化(PTQ)

PTQ是最简单的量化方式。模型训练完后,拿一小部分校准数据跑一遍,统计出每层的scale和zero_point,然后直接量化。

优点:不需要重新训练,速度快。

缺点:精度损失不可控,尤其是小模型或敏感层。

我一般这么用PTQ:

  1. 准备100-500张校准图片(覆盖典型场景)
  2. 跑一遍前向推理,收集每层的激活值分布
  3. 用KL散度或MSE找到最优的scale
  4. 量化权重和激活值
  5. 验证精度
# 伪代码示例:PTQ流程
calib_data = load_calibration_data(500)
model = load_fp32_model()
for layer in model.layers:
    activations = run_inference(layer, calib_data)
    scale, zero_point = calibrate(activations, method='kl_divergence')
    layer.quantize(scale, zero_point)

1.5 量化感知训练(QAT)

QAT是在训练过程中模拟量化效果。说白了,就是让模型在训练时就“习惯”量化带来的误差。

做法是:在前向推理时插入伪量化节点(fake quantize),把权重和激活值量化后再反量化。这样反向传播时,梯度就能感知到量化误差,从而调整权重来补偿。

QAT的精度通常比PTQ高0.5-2%。但代价是训练时间增加20-50%。

QAT的关键点:

  • 伪量化节点只影响前向,不影响反向
  • 训练完成后,移除伪量化节点,导出真正的量化模型
  • 学习率要调小,一般用原始学习率的1/10

我个人习惯的做法是:先用PTQ快速验证量化可行性,如果精度达标就直接用。如果精度不够,再上QAT。毕竟QAT的训练成本不低,没必要一上来就搞。

1.6 量化对精度和延迟的影响

精度和延迟是跷跷板的两头。量化越狠,延迟越低,但精度也越低。

我整理了一个实际项目的数据:

量化方案 精度(Top-1) 延迟(ms) 模型大小(MB)
FP32 76.3% 12.5 240
INT8 (PTQ) 75.8% 3.2 60
INT8 (QAT) 76.1% 3.2 60
INT4 (PTQ) 73.5% 1.8 30
INT4 (QAT) 74.8% 1.8 30

你看,INT8 QAT只比FP32掉了0.2%的精度,但延迟降到了原来的1/4。INT4虽然延迟更低,但精度掉了1.5%。

为什么会这样?因为INT4的量化区间只有16个值,信息损失太大了。QAT能帮你找回一部分,但不可能完全恢复。

我的经验:

如果精度要求高(比如医疗影像),用INT8 QAT。如果延迟要求高(比如自动驾驶),可以考虑INT4混合精度。如果两者都要...嗯,那得在模型结构上动刀了。

1.7 量化知识体系总览

下面这张图总结了量化技术的核心逻辑,我画出来方便你理解:

量化技术知识体系 模型量化 量化原理 量化方式 量化方法 scale & zero_point 量化/反量化 对称量化 非对称量化 PTQ QAT INT8 INT4 混合精度 精度影响 延迟影响 存储影响 量化 = 精度与速度的博弈,关键在于找到平衡点

这张图把量化技术的核心脉络理清楚了。从量化原理出发,到选择对称还是非对称,再到PTQ还是QAT,最后落到位宽选择和实际影响。你顺着这个结构往下学,思路会清晰很多。


想要更多资料,联系可可