TensorRT(1)--8-bit Inference

TensorRT Build Phase

TensorRT需要三个文件去部署神经网络,其分别为:

  1. 网络结构文件(deploy.prototxt)
  2. 训练好的网络权值(net.caffemodel)
  3. 每一个输出类别对应的标签文件

8-bit Inference with TensorRT

基本介绍

在其他条件相同的情况下,使用8-bit的数据格式来进行网络权值以及激活值的表示,随着batch_size的不同,其运算速度可以快两到三倍,同时其精度也没有明显的损失。因此而言,这种数据模型之后是很有前景的。

  • 目标: 在没有明显准确度丢失的情况下将FP32的CNNs网络转换为INT8.(Goal: Convert FP32 CNNs into INT8 without significant accuracy loss.).
  • 理由: INT8类型的存储方式有很高的throughout和较低的内存需求.(Why: INT8 math has higher throughout, and lower memory requirement.).
  • 挑战: 相对于FP32, INT8有明显较低的精度和动态范围.(Challenge: INT8 has significantly lower precision and dynamic range that FP32.).
  • 解决方式: 在将权值以及计算时最小化有效信息损失.(Solution: Minimize loss of information when quantizing model weights to INT8 and during INT8 computation of activations.).
  • 结果: 上述转换可以通过TensorRT来进行实现,同时该方法不需要额外的fine tuning和retraining.(Result: Mathod was implemented in TensorRT. It does not require any additional fine tuning or retraining.).

上述转换方法实现的基本思路是首先构建一种FP32数据向INT8数据的映射关系,该映射中的边界并不是两种数据类型的最大值,而是将FP32设置成一个Threshold,将这个阈值与INT8的最大值(127)构建映射关系,具体实现形式是通过一个scale来进行对应。

首先的问题是,这种映射关系的阈值如何寻找呢?不同的网路显然这一阈值是不同的,因此我们需要一个矫正数据集(calibration dataset)来进行scale的选取,其选择的标准为最小化KL_divergence(: KL_divergence(P,Q):= SUM(P[i] * log(P[i] / Q[i] ), i))

其次的问题是scale的表示与获取。scale的表示相对而言较为简单,如下形式:A = scale_A * QA, 。然后在TensorRT工作流运行时运行矫正算法,来优化scale系数。

矫正(Calibration)

首先,我们在矫正数据集上运行FP32精度的inference, 对于网络的每一层来说,收集激活时的直方图,从而产生不同saturation thresholds对应的量化分布图,然后选取能够最小化KL_divergence(ref_distr, quant_distr)的阈值作为选择的阈值。

TensorRT典型的工作流

在进行INT8的TensorRT inference之前,我们需要训练好了的FP32精度的模型以及矫正数据集(主要是选择阈值以及scale)。

实施的基本步骤是:

  1. 在矫正数据集上运行FP32 Inference
  2. 收集需要的数据(不同阈值下的KL量化分布图)
  3. 运行矫正算法–> 优化scale系数
  4. 量化FP32权值到INT8
  5. 产生CalibrationTable和INT8 execution engine

关于INT8 Inference的源代码在后续进行分析。

参考资料 : 8-bit Inference With TensorRT

你可能感兴趣的:(TensorRT)