第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:
- 准备100-500张校准图片(覆盖典型场景)
- 跑一遍前向推理,收集每层的激活值分布
- 用KL散度或MSE找到最优的scale
- 量化权重和激活值
- 验证精度
# 伪代码示例: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 量化知识体系总览
下面这张图总结了量化技术的核心逻辑,我画出来方便你理解:
这张图把量化技术的核心脉络理清楚了。从量化原理出发,到选择对称还是非对称,再到PTQ还是QAT,最后落到位宽选择和实际影响。你顺着这个结构往下学,思路会清晰很多。
想要更多资料,联系可可