一、INT8推理概述:为什么需要量化?
大家好,我是你们的老朋友。今天咱们聊聊INT8推理。
说实话,我刚入行那会儿,对量化这事也挺抵触的。你想啊,模型训练得好好的,FP32精度多高啊,干嘛非要砍成INT8?这不是自废武功吗?
后来我踩了个坑。有个客户要求把模型部署到边缘设备上,那设备内存只有512MB。FP32模型一加载,直接OOM。嗯,从那以后,我再也不敢小看量化了。
1.1 为什么需要INT8量化?
说白了,就三个字:快、省、小。
- 快:INT8计算比FP32快2-4倍。我实测过,在T4显卡上,ResNet-50的INT8推理比FP32快了将近3倍。
- 省:内存带宽省4倍。你想想看,同样读一批数据,INT8只要读FP32的1/4大小。
- 小:模型体积缩小4倍。从500MB变成125MB,部署起来轻松多了。
核心观点:INT8量化不是锦上添花,而是很多场景下的刚需。尤其是边缘计算、移动端、IoT设备,没有量化,很多模型根本跑不起来。
1.2 量化原理:对称 vs 非对称
量化到底在做什么?我习惯用一个比喻来解释。
想象你有一把尺子,FP32的刻度非常密,能精确到小数点后很多位。INT8的刻度就粗多了,只有256个格子。量化,就是把FP32的数值映射到这256个格子里。
映射方式有两种:对称量化和非对称量化。
对称量化
对称量化,就是零点在0的位置。公式很简单:
Q = round(x / scale)
其中scale = max(|x|) / 127。注意这里用的是127,不是128。为什么?因为INT8的范围是[-128, 127],对称量化只用到[-127, 127],留一个-128给特殊情况。
我在项目中遇到过一个问题:如果模型权重分布很对称,比如均值为0,那对称量化效果很好。但如果分布偏了,比如ReLU后的激活值全是正数,对称量化就浪费了一半的表示范围。
非对称量化
非对称量化引入了零点(zero point),公式变成:
Q = round(x / scale) + zero_point
scale = (max - min) / 255,zero_point = round(-min / scale)。
这样就能充分利用INT8的256个格子了。对于ReLU后的激活值,非对称量化明显更优。
| 对比项 | 对称量化 | 非对称量化 |
|---|---|---|
| 零点位置 | 固定在0 | 可偏移 |
| 表示范围利用率 | 低(分布偏时) | 高 |
| 计算复杂度 | 低 | 稍高(需处理零点) |
| 适用场景 | 权重(通常对称) | 激活值(通常非对称) |
我的建议:权重用对称量化,激活值用非对称量化。这是业界最常用的组合,我在多个项目里验证过,效果稳定。
1.3 精度与性能的权衡
量化不是免费的午餐。你省了内存和计算,但精度会掉。问题是:掉多少?
我做过一个实验,拿MobileNetV2在ImageNet上测试:
- FP32:Top-1准确率 71.8%
- INT8(校准集100张):71.2%
- INT8(校准集500张):71.5%
你看,只掉了0.3%-0.6%。对于很多应用来说,这个损失完全可以接受。
但有些模型就没这么幸运了。我记得有一次部署一个轻量级检测模型,量化后mAP直接掉了5个点。排查了半天,发现是某个层的激活值分布太广,量化误差被放大了。
避坑指南:我曾经遇到过量化后模型直接输出NaN的情况。后来发现是某个层的scale值计算时,分母出现了0。所以一定要检查校准数据是否覆盖了所有可能的输入范围。
影响精度损失的因素主要有三个:
- 模型结构:大模型(如ResNet-152)量化损失通常小于小模型(如MobileNet)
- 校准数据集:校准集要能代表真实数据分布。我一般用500-1000张图片做校准
- 量化粒度:逐层量化 vs 逐通道量化。逐通道量化精度更高,但计算更复杂
1.4 知识体系总览
下面这张图,是我自己总结的INT8量化知识体系。你看一眼,就能明白今天讲的内容在整个框架中的位置。
这张图把INT8量化的核心脉络理清楚了。你从根节点往下看,三个分支对应我们今天讲的三个核心问题。每个分支下面还有更细的子问题,后面几章我们会逐一展开。
1.5 小结
好了,今天的内容就到这里。总结一下:
- INT8量化是为了解决模型部署中的速度、内存、体积三大问题
- 对称量化和非对称量化各有适用场景,权重用对称,激活用非对称是我个人的最佳实践
- 精度和性能的权衡是量化的核心,校准数据集的选择往往决定了最终效果
下一章,我们会深入讲解量化感知训练(QAT)和训练后量化(PTQ)的具体实现。到时候我会带大家手写一个量化工具,保证你学完就能用。
想要更多资料,联系可可