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帮我们做了很多脏活累活。你只需要告诉它:

  1. 权重怎么量化?—— 通常是逐张量(Per-Tensor)量化,即整个权重矩阵共用一个scale。
  2. 激活值怎么量化?—— 通常是逐通道(Per-Channel)量化,每个输出通道有自己的scale。精度更高,但计算稍复杂。

我曾经在一个目标检测项目里,直接用了默认的逐张量量化,结果mAP掉了5个点。后来改成逐通道量化,只掉了1个点。所以,别偷懒,能逐通道就逐通道

我的经验:量化时,权重通常用对称量化(范围对称,zero_point=0),激活值用非对称量化(范围不对称,zero_point非0)。这样精度和计算效率能取得平衡。

量化完成后,模型里的权重和激活值都变成了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计算

嗯,整体流程就是这样。说白了,校准是「摸清底细」,量化是「压缩打包」,推理是「高效运行」。每一步都有坑,但只要你理解了背后的原理,调优起来就有方向了。

下一章,我会详细讲讲校准算法的具体实现,以及如何选择最适合你模型的校准方法。到时候咱们再细聊。