1. 量化介绍
TensorRT支持使用8位整数来表示量化的浮点值。量化方案是对称均匀量化——量化值用带符号的INT8表示,从量化值到非量化值的转换只是一个简单的乘法。相反转换则使用scale的倒数,并通过rounding和clamping。
量化方案包括激活的量化和权重的量化。
激活的量化方案取决于所选择的校准算法,以找到一个scale s,这个scale s最好地平衡了特定数据的舍入误差和精度误差。TensorRT在下一章节( Post-Training Quantization Using Calibration)详解了支持的不同校准方案。
权重的量化方案通过公式,这里需要找到权值张量的浮点最大值和浮点最小值。
要启用任何量化操作,必须在构建器配置中设置INT8标志。
1.1 量化工作流(workflow)
创建量化网络有两个工作流程:
PTQ:训练后量化(PTQ)是在网络经过训练后得到的尺度因子Scale。TensorRT为PTQ提供了一个称为calibration的工作流。当网络在有代表性的输入数据上执行时,它测量每个激活张量中的激活分布,然后使用该分布来估计张量的scale。
QAT:量化感知训练(QAT)在训练过程中计算尺度因子scale。允许训练过程补偿量化和去量化操作的影响。
TensorRT的Quantization Toolkit(量化工具包)是一个PyTorch库,可以帮助生成可以由TensorRT优化的QAT模型。你也可以使用工具包的PTQ在PyTorch中执行PTQ并导出到ONNX。
1.2 隐式量化和显示量化
量化网络可以用两种方式表示:
在隐式量化网络中,每个量化张量都有一个相关的scale。当读写张量时,scale用于隐式量化和去量化。
当处理隐式量化网络时,TensorRT在应用图优化时将模型视为浮点模型,并适时的使用INT8来优化层执行时间。如果一个层在INT8中运行得更快,那么它就在INT8中执行。否则使用FP32或FP16。在这种模式下,TensorRT只对性能进行优化,你几乎无法控制INT8的使用位置——即使你在API级别显式地设置了一个层的精度,TensorRT也可能在图优化过程中将该层与另一层融合,并丢失它必须在INT8中执行的信息。TensorRT的PTQ能力生成一个隐式量化网络。
在显式量化网络中,在量化值和非量化值之间转换的缩放操作由图中的IQuantizeLayer (C, Python)和IDequantizeLayer (C, Python)节点显式表示——这些节点今后将称为Q/DQ