1、INT8量化基础:什么是模型量化、为什么需要INT8、量化与精度权衡、TensorRT中的量化流程概览

1.1 什么是模型量化?

模型量化,说白了就是把模型里的高精度数字,换成低精度数字来存、来算。

你想想看,我们训练好的模型,权重和激活值默认都是FP32(32位浮点数)。每个数占4个字节。一张RTX 3090有24GB显存,听起来挺大对吧?但一个ResNet-152就有好几百MB,更别提那些动辄几十亿参数的Transformer了。

量化的核心思路很简单:用更少的比特位去近似表示原来的数值。INT8就是8位整数,取值范围是[-128, 127](有符号)或者[0, 255](无符号)。

我刚开始接触量化时,总觉得这像是有损压缩。嗯,确实是有损的。但关键在于——这个“损”能不能控制在可接受范围内。

量化本质:将一个连续的、高精度的数值空间,映射到一个离散的、低精度的数值空间。这个映射过程会引入量化误差,但可以通过校准和优化来最小化。

1.2 为什么需要INT8?

这个问题我问过自己很多遍。FP32跑得好好的,为什么要折腾INT8?

三个字:快、省、大

  • 快:INT8的计算吞吐量是FP32的2-4倍。TensorRT利用NVIDIA的Tensor Core,INT8矩阵乘法比FP32快得多。我在项目中实测过,一个BERT模型从FP32切到INT8,推理延迟从12ms降到了3ms左右。
  • 省:模型体积直接缩小4倍。一个500MB的模型,量化后变成125MB。这对边缘部署、移动端部署来说,简直是救命。
  • 大:显存占用也缩小4倍。原来放不下的batch size,现在能塞进去了。原来跑不动的超大模型,量化后可能就刚刚好。

举个例子。我去年做一个实时视频分析的项目,客户要求1080p@30fps。FP32的YOLOv5s跑在Jetson Xavier上,死活只能到22fps。换成INT8量化后,直接飙到35fps。你说这INT8香不香?

个人经验:我建议在部署前先做一次量化可行性评估。不是所有模型都适合INT8,有些对精度极其敏感的任务(比如医疗影像、金融风控),可能需要保留FP16甚至FP32。

1.3 量化与精度权衡

这里有个绕不开的话题:精度损失。

INT8量化一定会掉点精度,这是物理规律决定的。但掉多少,能不能接受,这才是关键。

精度类型 比特数 相对FP32精度损失 典型场景
FP32 32 0%(基准) 训练、高精度推理
FP16 16 通常<0.1% 大多数推理场景
INT8 8 0.1%~2%(视模型而定) 实时推理、边缘部署
INT4 4 1%~5%+ 极端低资源场景

为什么会掉精度?因为量化本质上是在做“四舍五入”。FP32的数值范围是±3.4×10³⁸,而INT8只有256个离散值。把一个大范围映射到小范围,必然有信息丢失。

但好消息是:深度学习模型对噪声有天然的鲁棒性。我见过很多模型,INT8量化后精度只掉了0.3%,但推理速度翻了3倍。这种trade-off,绝大多数业务场景都能接受。

避坑指南:我曾经在一个语义分割项目上踩过坑。模型量化后mIoU从0.78掉到了0.62,直接没法用。后来发现是某些层的激活值分布极其不均匀,校准集选得也不对。换了校准策略后,精度恢复到了0.75。所以——量化不是无脑操作,校准集的选择和量化策略的调优,非常关键。

1.4 TensorRT中的量化流程概览

TensorRT做INT8量化,整体流程其实不复杂。我把它拆成几个关键步骤:

  1. 准备模型:把训练好的模型(PyTorch、TensorFlow、ONNX等)导出为ONNX格式。这是TensorRT的“通用接口”。
  2. 选择校准集:准备一小批有代表性的数据(通常几百到几千张图片/样本),用于统计每层激活值的分布范围。
  3. 运行校准:TensorRT在校准集上跑一遍前向推理,收集每层的激活值统计信息(最小值、最大值、直方图等)。
  4. 计算量化参数:根据校准结果,为每层计算scale(缩放因子)和zero-point(零点偏移)。
  5. 构建INT8引擎:TensorRT把量化参数嵌入到优化后的推理引擎中,生成一个.engine文件。
  6. 部署推理:加载INT8引擎,像使用FP32引擎一样进行推理。

嗯,这里要注意:校准集的选择直接影响量化质量。我个人的习惯是,从训练集中随机抽取500-1000个样本,覆盖各种典型场景。如果校准集太偏,量化后的模型在真实数据上可能会翻车。

核心要点:TensorRT的INT8量化是“训练后量化”(Post-Training Quantization, PTQ)。它不需要重新训练模型,只需要一次校准过程。这也是它被广泛使用的原因——省时省力,效果还不错。

说到校准算法,TensorRT支持几种不同的策略:

  • Entropy Calibration:基于KL散度,最小化量化前后信息损失。这是默认选项,大多数场景表现良好。
  • MinMax Calibration:直接取激活值的全局最小/最大值。简单粗暴,但对异常值敏感。
  • Percentile Calibration:取某个百分位数(比如99.9%)作为阈值。能容忍少量异常值。

我一般先用Entropy Calibration跑一遍,如果精度损失过大,再试试Percentile。有一次在NLP模型上,Entropy掉了1.2%的F1,换成Percentile后只掉了0.4%。所以——别迷信默认参数,多试试。

小技巧:如果你不确定校准集选多少合适,我建议从1000张开始。太少的话统计不稳定,太多的话校准时间太长。1000张是个不错的平衡点。

好了,这一章我们聊了量化的基本概念、为什么需要INT8、精度权衡的要点,以及TensorRT量化的整体流程。下一章我会深入讲解校准算法的原理和实现细节,到时候咱们再细聊。