优点:

以FP32到INT8量化为例,模型存储占用减小为1/4;

增加数据throughput。

 

什么是量化:

表达式:

tensorflow和torch对比 tensorflow tensorrt对比_模型量化

示意图:

tensorflow和torch对比 tensorflow tensorrt对比_模型量化_02

为什么不使用线性量化(y=ax+b)?因为线性量化后做乘运算会改变分布。

tensorflow和torch对比 tensorflow tensorrt对比_模型量化_03

怎么量化:

TensorFlow Lite量化:

训练后量化和量化训练两种方式。

训练后量化方式:

过程:1.权重量化. 2.infer校准数据集统计activations的最大最小值以量化activations(可选项。对于移动手机来说有浮点计算单元且量化需求没那么高可以只量化权重,对于边缘计算芯片来说可能有的只支持定点计算,这就需要全量化模型。).

小结:对于大模型来说参数冗余比较高,直接量化精度损失比较小,但是对于小模型来说参数冗余低,直接量化精度损失比较大。所以训小模型最好使用量化训练方式。

量化训练方式:

过程:1.训练模拟定点模型(卷积参数为定点数,batch normalization参数为高精度浮点数。注:The forward-pass models quantization, while the backward-pass models quantization as a straight-through estimator,关于straight-through estimator参考论文“Quantized Neural Networks: Training Neural Networks with Low Precision Weights and Activations”)同时统计activations的分布。2.combines batch normalization with the preceding convolutional layer。3.模拟定点模型转全定点模型。

思考:按照TensorRT的量化方案(下面有介绍)来说weights量化对精确率没有什么影响,activations量化对精确率影响较大,这里在训练模拟定点模型时统计activations分布最后直接量化转定点模型似乎有点粗暴,实验结果也表明小模型会损失1-2个点。转全定点模型后再fine-tunning网络会比较好,精确率可以再恢复一点(实习时公司的方案会多这一步,小模型精确率损失0.x个点)。

小结:相对于训练后量化方式过程更复杂一些。量化后小模型平均精度损失1-2个点。

tensorflow和torch对比 tensorflow tensorrt对比_tensorflow和torch对比_04

 

TensorRT量化:

训练后量化。过程:

tensorflow和torch对比 tensorflow tensorrt对比_模型量化_05

 关键点在于第三步:通过校准算法获得最优的尺度因子。

通常来说权重和偏置在训练过程中通过L2正则化会趋于(-1,1)之间分布,量化weights对精确率影响不会太大,但是经过激活后输出值的分布不均,量化activations对精确率影响较大。此时采用下图左边的量化方式会对结果产生较大的影响(可以想象一个极端的例子,假如数据都是正值且分布比较集中,那么量化到int8时可能只有一两个值表示),因此就需要考虑下图右边的量化方式,同时也引入了一个新的问题:寻找最优threshold值。

tensorflow和torch对比 tensorflow tensorrt对比_卷积_06

这个问题可以通过最小化相对熵解决(相对熵原理可以自行百度), 公式如下:

tensorflow和torch对比 tensorflow tensorrt对比_模型量化_07

其中,

tensorflow和torch对比 tensorflow tensorrt对比_卷积_08

表示FP32激活的分布,

tensorflow和torch对比 tensorflow tensorrt对比_tensorflow和torch对比_09

表示量化激活的分布。这样通过迭代计算不同的threshold的KL divergence便可确定最优threshold值。从而确定最优尺度因子。

小结:相比TensorFlow Lite量化方式简单,大模型精度损失0.x个百分点。

tensorflow和torch对比 tensorflow tensorrt对比_tensorflow和torch对比_10

 

全量化模型infer过程:

输入量化,量化输入与量化参数卷积,激活量化,量化输入与量化参数卷积。。。

weights量化模型infer过程:

与全量化模型infer过程不同之处在于,卷积计算时仍是floating-point kernel,即量化weights会转化为浮点数参与计算。