3、TensorRT INT8量化流程:校准(Calibration) -> 量化 -> 推理,整体Pipeline介绍
好,咱们今天聊聊INT8量化的完整流程。
说白了,就是把FP32的模型,经过一套标准工序,变成INT8的推理引擎。我刚开始接触这块时,也觉得挺玄乎的,不就是把32位浮点砍成8位整数吗?后来踩了坑才明白,中间的门道可不少。
整个Pipeline,我习惯分成三步:校准(Calibration)→ 量化(Quantization)→ 推理(Inference)。咱们一步步拆开看。
3.1 校准(Calibration)—— 摸清数据的脾气
校准是第一步,也是最关键的一步。为什么?因为你要知道模型里每一层的数据,到底分布在什么范围。
你想想看,FP32的数值范围是巨大的,从1.4e-45到3.4e38。但INT8只有256个格子(-128到127)。你得决定,把FP32的哪些数值映射到这256个格子里。映射得好,精度损失小;映射得差,模型直接崩掉。
校准的目的,就是通过一小批有代表性的输入数据,跑一遍模型,统计出每一层激活值的分布。我个人习惯用1000张左右的验证集图片做校准。太少,统计不准;太多,浪费时间。
TensorRT支持几种校准算法,我挑最常用的两种说说:
- Entropy Calibration(熵校准):这是默认选项。它通过最小化FP32和INT8分布之间的KL散度,找到最优的阈值。说白了,就是让量化后的信息损失最小。我大部分项目都用它,效果比较稳。
- MinMax Calibration(最大最小值校准):直接用数据的最大值和最小值作为阈值。简单粗暴,但容易受离群点影响。如果数据里有个别异常大的值,整个量化范围就被拉宽了,精度反而下降。
嗯,这里要注意:校准不是训练,不会更新权重。它只是统计,只是观察。
3.2 量化(Quantization)—— 把FP32塞进INT8的盒子里
校准完,拿到了每一层的缩放因子(Scale)和零点(Zero Point),接下来就是真正的量化操作。
量化的核心公式很简单:
INT8_value = round(FP32_value / scale) + zero_point
但实际工程里,TensorRT帮我们做了很多脏活累活。你只需要告诉它:
- 权重怎么量化?—— 通常是逐张量(Per-Tensor)量化,即整个权重矩阵共用一个scale。
- 激活值怎么量化?—— 通常是逐通道(Per-Channel)量化,每个输出通道有自己的scale。精度更高,但计算稍复杂。
我曾经在一个目标检测项目里,直接用了默认的逐张量量化,结果mAP掉了5个点。后来改成逐通道量化,只掉了1个点。所以,别偷懒,能逐通道就逐通道。
量化完成后,模型里的权重和激活值都变成了INT8。但注意,计算过程中的累加器(Accumulator)还是用INT32或FP32的,否则精度损失太大。TensorRT内部会自动处理这个。
3.3 推理(Inference)—— 跑起来,看效果
量化完的模型,生成一个.engine文件。这个文件就是TensorRT的推理引擎,可以直接加载运行。
推理阶段,TensorRT会做两件事:
- 反量化(Dequantization):在需要的时候,把INT8结果转回FP32。比如某些层对精度极其敏感,或者输出层需要FP32。
- 融合(Fusion):把量化、卷积、反量化等操作合并成一个Kernel,减少显存读写。这是TensorRT加速的核心之一。
我见过不少新手,量化完直接跑,发现速度没提升多少。为什么?因为推理时如果频繁地在INT8和FP32之间切换,反而会拖慢速度。所以,尽量让整个网络都跑在INT8上,只在必要的地方做转换。
LayerNorm层,这些层对精度要求高,TensorRT自动回退到了FP32。结果INT8和FP32来回切换,开销比纯FP32还大。后来我手动指定了这些层用FP32,其他层用INT8,才解决了问题。
3.4 整体Pipeline总结
把这三步串起来,就是完整的INT8量化流程:
| 步骤 | 输入 | 输出 | 关键操作 |
|---|---|---|---|
| 校准 | FP32模型 + 校准数据集 | 每层的Scale和Zero Point | 前向推理,统计激活值分布 |
| 量化 | FP32模型 + 校准结果 | INT8权重 + 量化参数 | 将FP32映射到INT8范围 |
| 推理 | INT8引擎(.engine文件) | 推理结果 | 加载引擎,执行INT8计算 |
嗯,整体流程就是这样。说白了,校准是「摸清底细」,量化是「压缩打包」,推理是「高效运行」。每一步都有坑,但只要你理解了背后的原理,调优起来就有方向了。
下一章,我会详细讲讲校准算法的具体实现,以及如何选择最适合你模型的校准方法。到时候咱们再细聊。