网络模型int8量化中使用的一些量化方法

深度学习中网络的加速主要有如下的几种方式:

1)设计高效且小的网络,如MobileNet系列、shuffleNet系列、VoVNet等;
2)从大的模型开始通过量化、剪裁、蒸馏等压缩技术实现网络的小型化;
3)在inference阶段使用特殊的计算库实现计算的加速,比如MKL、TensorRT等;
在上面的方法中最简单的方法就是降低模型运算过程中的bits数量,降低到16bits、8bits甚至2bits。这样做具有如下的优点:

1)在众多的使用场合与模型中可以广泛使用,并不需要设计再设计特殊的网络结构,而且量化是从训练好的模型上进行的,并不需要重训练,且损失精度比较少。目前现有的大部分硬件计算资源都是支持这样的运算模式的,因而也不需要重新设计专门的硬件;
2)模型量化可以显著减少模型的尺寸大小,理论上可以减少模型的尺寸4倍,并且模型的性能损失很小;
3)使用更低bits数的模型可以减少在运算过程中的内存与缓存消耗;
4)大多数的处理器对8bits的运算更快;
5)8bits的计算拥有更好的实现效率,因而进行对应的计算所消耗的能量更少;
2. 量化的方法
2.1 Uniform Affine Quantizer
网络模型int8量化中使用的一些量化方法

 

 

 

2.2 Uniform symmetric quantizer
网络模型int8量化中使用的一些量化方法

 

 

 


2.3 Stochastic quantizer
网络模型int8量化中使用的一些量化方法

 

 

 

3. 训练好的模型上的量化
对于已经训练好的模型进行量化的方式有两种:只量化权重和量化权重和激活。这两种量化策略在下面的内容会讲到。文中经过证实采用逐通道(per-channel)与非对称范围的量化的模型精度与浮点型是比较接近的。

3.1 只量化权值
只量化权值是只将权值数据量化到8bits上,因而不需要量化校准集。这样量化方式只适用于对性能要求不高且要求模型大小比较高的场景下,这种方法一般不予以采纳。

3.2 权重与激活量化
这里除了对权重参数进行per-channel的量化之外,还需要额外准备校准数据集,以提供对激活的量化参数的确定,这样的方法其量化的结果也是比较好的。在TensorRT中也是采用了这样的量化方式进行网络的量化技术,也达到了很不错的性能。

3.3 量化性能对比
只量化权重对性能的影响,其中包含量化粒度的对比(per-channel、per-layer):网络模型int8量化中使用的一些量化方法

 

 

 

权重与激活都量化对于性能的影响:

网络模型int8量化中使用的一些量化方法

 

 

 

基于上述实验结果,得到如下的结论:

1)Per-channel的权值量化与activation量化可以使得量化之后的模型与浮点型运算得到的结果相差尽量减小;
2)activation的量化可以有效减少精度上的损失,下面的这几个操作会使得activation的范围较小:(a)在batchnorm之后没有添加scale;(b)ReLU6将激活之后的值限定在( 0 , 6 ) (0,6)(0,6)的范围内。
3)拥有更多参数的模型,例如ResNet与Inception-V3,其量化的鲁棒性是好于参数少的模型的;
4)当权重在层的粒度(非channel)上被量化时,会有很大的性能下降(这主要是由于batchnorm导致的数值波动),特别对于MobileNet网络;
5)大多数情况下由量化引入的性能下降是由于权值的量化过程;
————————————————
版权声明:本文为CSDN博主「m_buddy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m_buddy/article/details/103640139

上一篇:为什么int8的取值范围是-128 - 127


下一篇:模型量化-对称量化和非对称量化