1. INT8推理概述
各位同学好,我是你们这堂课的主讲人。咱们直接开门见山——INT8推理,说白了就是让模型用8位整数去算,而不是用32位浮点。你可能会问:好好的FP32不用,折腾INT8干嘛?
我当年刚接触这个方向时也有同样的疑惑。直到有一次,我在一个边缘设备上部署一个BERT模型,FP32跑起来直接内存爆了,推理延迟高得离谱。嗯,那次之后我就彻底明白了——精度换性能,有时候是不得不做的交易。
1.1 为什么需要INT8?
先看几个硬核数据:
| 数据类型 | 位宽 | 内存占用(相对FP32) | 理论计算吞吐 |
|---|---|---|---|
| FP32 | 32 bit | 1x | 1x |
| FP16 | 16 bit | 0.5x | ~2x |
| INT8 | 8 bit | 0.25x | ~4x |
看到没?INT8的内存占用只有FP32的四分之一。这意味着什么?
- 模型更小:同样大小的芯片,能塞下更大的模型
- 带宽更低:内存搬运少了,功耗自然降下来
- 计算更快:INT8乘法器比FP32乘法器面积小、速度快
我个人习惯把INT8推理比作「压缩饼干」——体积小了,但营养(精度)不能丢太多。在云端推理场景,比如推荐系统、图像分类,INT8几乎成了标配。我见过一个广告点击率预估模型,从FP32切到INT8后,QPS(每秒查询数)直接翻了3倍,而AUC只掉了0.1%。
核心观点:INT8不是万能的,但在延迟敏感、功耗受限的场景下,它是目前性价比最高的方案。
1.2 量化基本原理
量化听起来高大上,其实核心就一句话:把连续的浮点数映射到离散的整数空间。
最常见的做法是均匀量化。公式很简单:
// 量化:浮点 -> 整数
q = round(r / scale) + zero_point
// 反量化:整数 -> 浮点
r = (q - zero_point) * scale
这里scale是缩放因子,zero_point是零点偏移。举个例子:
假设你的权重范围是[-1.0, 1.0],要映射到INT8的[-128, 127]:
scale = (1.0 - (-1.0)) / (127 - (-128)) ≈ 0.00787zero_point = 0(对称量化时零点为0)
那么0.5这个浮点数,量化后就是 round(0.5 / 0.00787) ≈ 64。
避坑指南:我曾经在一个项目中直接用对称量化处理ReLU后的激活值,结果精度崩了。为什么?因为ReLU输出全是非负数,对称量化浪费了一半的表示范围。后来改用非对称量化(zero_point不为0),问题就解决了。
量化策略主要分两种:
- 权重量化:模型训练完后,对权重做量化。这个相对简单,因为权重分布通常比较稳定。
- 激活量化:对中间层的输出做量化。这个麻烦,因为激活值的分布随输入变化。
我建议新手先从权重量化入手,跑通了再碰激活量化。步子迈大了容易扯着蛋。
1.3 精度与性能的权衡
这是INT8推理最核心的问题——到底能牺牲多少精度来换性能?
先看一个我实际项目中的对比数据:
| 模型 | FP32 Top-1 | INT8 Top-1 | 精度损失 | 推理加速 |
|---|---|---|---|---|
| ResNet-50 | 76.13% | 75.98% | -0.15% | 3.8x |
| MobileNetV2 | 71.88% | 71.52% | -0.36% | 4.2x |
| BERT-Base | 90.8% (F1) | 90.1% (F1) | -0.7% | 3.5x |
你看,大部分模型精度损失都在1%以内,但推理速度翻了3-4倍。这笔账怎么算都划算。
但要注意,不是所有模型都适合INT8。我踩过的一个坑:
曾经有一次,我把一个轻量级语音识别模型直接量化,结果WER(词错误率)从8%飙到了15%。排查后发现,模型中有几个层的权重分布极度不均匀,量化后信息丢失严重。后来用了逐层校准(per-channel quantization),才把WER压回8.5%。
所以,精度与性能的权衡,我总结了几条经验:
- 大模型比小模型更友好:ResNet-50量化损失通常小于MobileNetV2
- 分类任务比回归任务更鲁棒:图像分类掉0.1%可能无所谓,但目标检测的mAP掉0.5%可能就不可接受了
- 校准数据集很重要:用1000张图片做校准和用100张,结果可能差一个数量级
说到校准,这里有个小技巧:校准数据集最好覆盖真实部署场景的分布。我见过有人用ImageNet校准集去量化一个医疗影像模型,结果精度惨不忍睹——因为分布完全不匹配。
知识体系总览
下面这张图,是我自己梳理的INT8推理核心逻辑,你一看就明白:
说白了,INT8推理就是一场「精度换速度」的博弈。你不需要追求零损失,只要损失在业务可接受范围内,性能提升就是实打实的收益。