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.00787
  • zero_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推理核心知识体系 为什么需要INT8? • 内存占用降低75% • 计算吞吐提升3-4x • 功耗显著下降 • 适合边缘/云端部署 量化基本原理 • 均匀量化公式 • scale & zero_point • 对称 vs 非对称 • 权重/激活量化 精度与性能权衡 • 精度损失通常<1% • 大模型更友好 • 分类优于回归 • 校准数据关键 核心权衡逻辑 目标:在可接受的精度损失范围内,最大化推理性能 关键决策点: ① 选择量化策略(对称/非对称、per-tensor/per-channel) ② 确定校准数据集规模与分布 ③ 评估精度损失是否在业务容忍范围内

说白了,INT8推理就是一场「精度换速度」的博弈。你不需要追求零损失,只要损失在业务可接受范围内,性能提升就是实打实的收益。