论文阅读——Quantizing deep convolutional networks for efficient inference: A whitepaper

  • 时间:
  • 来源:互联网
  • 文章标签:

Quantizing deep convolutional networks for efficient inference: A whitepaper

Abstract

本文针对如何对卷积神经网络的整数量化方法进行综述。


1.8bit权重的逐通道量化和激活值的逐层量化与全精度浮点数网络在分类精度上仅有2%的误差。



2.8bit量化后模型可压缩4倍,主要通过对权重量化后训练达到。




3.与CPU上运行的浮点框架相比,本文在CPU和DSP上运行的。量化后模型,时延有2-3x的提升。在一些特定处理器上(如高通HVX平台DSP)处理定点SIMD加速比可达10x。





4.训练中引入量化可进一步提升性能,使得8bit的精度差距在1%。训练中引入量化甚至可以进一步将权重压缩至4bit,当然也会导致精度下降10%.






5.本文的量化方案已应用于Tensorflow和TensorflowLite的模型量化中。






6.本文认为对权重使用逐通道量化和对激活值使用逐层量化是最合适的配置方案。为了进一步优化推断本文还设计了加速器的硬件及处理单元,可以支持4,8,16bit等不同精度。

SectionI Introduction

深度网络广泛用于边缘应用中,一些典型的边缘设备一般算力较低,内存和电量资源有限,需要降低模型传输的功耗以及网络连接的需求。所以,压缩模型规模、使得推断更快,功耗更低是十分有必要的。
关于模型压缩已经开展了广泛的研究,主要有:







[1][2][3]构建更高效的模型;








[4][5][6]通过量化、剪枝、压缩技术等减少模型尺寸;









[7]-[14]借助高效的计算平台可以加速推断,虽然一定程度上降低了精度。









一种简单易行的方法就是通过降低权重和激活值的精度来降低模型复杂度,这种方法有诸多优点:










(1)适用于广泛的应用场景和何种模型。无需为了提升速度设计新的网络结构。许多情况下只需要对浮点运算的网络快速量化至某一定点位数即可,也无需重新训练,没有精度下降。已经有许多硬件平台或库支持量化后的快速推理,因此也无需等待新硬件的开发。










(2)激活值所需的内存和缓存更少。因为缓存主要用于储存中间计算的成果,用于下一层的计算;精度降低后需要存数的数据所需内存就更少,也可以使得缓存复用的更好。










(3)计算更快。绝大多数处理器处理对8bit数据计算都很快。










(4)功耗更低。移动8bit的数据比移动32bit浮点数,前者比后者效率高4倍。在许多深度框架中,访问内存的次数是功耗的主要来源,减少数据搬运的次数可以有效减少功耗。
上述要素使得量化后推断更快,通常会带来2-3倍的加速。如果对低精度向量运算的处理器和硬件做进一步优化器,速度和功耗会进一步提升。

Section II Quantizer Design
量化器设计

Part A Uniform Affine Quantizer 均匀映射量化










考虑一个浮点数位于(xmin,xmax)区间,需要量化到(0,Nlevel-1) ,需要设置两个参数:scale和zero-point完成浮点数到整数的映射。










scale定义了量化步长,zero_point表示浮点数0映射到该点,确保0是没有量化误差的。这个零点对0填充等操作很重要,不然会产生量化误差。
如果是单边分布,则需要放宽(xmin,xmax)范围使之包含0点,然后再进行量化。这种方法对于极端的单边分布就会产生误差。










一旦scale和zero-point定义好了后,量化过程定义如下:










在这里插入图片描述
在这里插入图片描述
反量化过程,即恢复为浮点数过程如下:










在这里插入图片描述
注意到,均匀映射量化除了存储量化后的权重和激活值,还有额外存储零点的开销。考虑进行2D卷积操作时:
在位宽更宽(16/32bit)时吞吐量会下降2-4x。而在量化后的卷积实现中,除了最后一项是常数项,其余三项每一项都需要N次乘法,比8bit点乘多出3x的计算量。
推断阶段注意到权重和激活值都是常量,因此激活值的和都是一样的,这样可以进一步优化。但这就需要优化卷积核了,会在[16]中深入讨论。
在这里插入图片描述
Part B Uniform symmetric quantizer均匀对称量化

对称量化是映射量化的简化版本,直接将zero-point约束为0,因此量化过程简化为:
在这里插入图片描述

为了完成更快的SIMD单指令多数据六,需要进一步约束权重范围到:
在这里插入图片描述

反量化为:


在这里插入图片描述
Part C Stochastic quantizer随机量化
随机量化将量化器建模为额外添加的噪声,随后再经过四舍五入,量化过程表述为:
在这里插入图片描述

反量化过程同part A
随机量化通过将范围外的值钳位到一定范围来减少浮点型权重的传输,这种方法适合于梯度的计算,但在推断中不使用这种量化方法,绝大多数硬件推理平台也不支持这种量化。


Part D Modeling simulated quantization in the backward反向传播中的模拟量化模型



训练中引入量化训练时,将量化操作通过“模拟量化模型”等效实现,模拟量化过程包含两步:量化器和反量化器。




由于模拟的均匀映射量化器在每一个点的导数就几乎为0,因此需要在反向传播过程中使用一个近似量化器,来近似这一个导数。
反向传播中将这一模型称之为“straight through estimator”,其中deltain 是模拟量化输出loss的反向传播误差。




在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Part E Determining Quantizer parameters确定量化器的参数
量化器的参数需要根据一定的标准进行设定。比如在TensorRT中将原始数据与量化数据之间的KL散度来决定步长。本文使用的方法更简单。

对于权重,就是用实际权重的最大最小值来决定量化器的参数;


对于激活值,则使用每一个batch中最大最小值的滑动平均值来作为量化器的参数。


对于训练后量化方案,通过仔细的选择量化器的参数可有效提高模型量化的精度。



Part F Granularity of quantization
量化粒度



逐层量化:per-layer quantization,对一个张量使用一个量化器




逐通道量化:per-channel quantization,对一个张量的每一个卷积核都使用一个不同参数的量化器,因为每一个通道都对应输出一个特征图谱,每一个卷积核的scale和offset都是不同的。




对于激活值不考虑使用逐通道量化方案,因为这会增加卷积和内积运算的复杂性。
以及逐层量化和逐通道量化都可以高效的实现卷积和点乘运算,因为核中的量化器参数都是固定的。

Section III Quantized Inference:Performance and ACCURACY

在Section I中已经介绍了模型量化的好处,接下来则主要讨论各种量化方案对模型性能的影响。

3.1 Post Training Quantization
训练后量化

训练后量化就是模型训练后直接量化进行推断,没有进行重新训练,只是通过压缩权重和激活值来加速推理。训练后量化实施简单,在有限数据上就能完成,本节分别测试只对权重量化和权重激活均量化两种方案。并且展示非对称的逐通道量化在大部分网络中都可以与浮点型网络精度接近。





在这里插入图片描述

Case 1:weight only quantization






这种设置下只对权重量化至8bit,以及无需验证数据集的参与就能实现。Fig 2左侧展示了量化过程。
如果仅仅指向压缩网络存储传输规模,不太在意推断时浮点运算的开销时,可以考虑此种量化方案。
Case 2:quantizing weights and activations

此种设置会将权重和激活值均量化至8bit,此时就需重新计算激活值的动态范围了,一般使用100个mini-batches就足够估计出激活值的动态范围了。


Experiments


本文在下述不同网络上测试不同量化方案的效果,Table I分别展示了模型参数浮点精度下的Top-1准确率。
主要包括MobileNet系列、Nasnet-Mobile,Inception和ResNet系列。


在这里插入图片描述

Case 1:weight only quantization




Table2展示了仅权重量化下各种量化方案的效果对比,可以看到非对称的逐通道量化与浮点精度最为接近



Case 2:weight and activation quantization




权重分别考虑了对称、非对称、逐层、逐通道的不同方式,激活值则使用了逐层量化。
从TableIII的结果可以看出,使用逐通道量化权重和逐层量化激活值在所有网络中精度最佳,非对称效果会再提高一点。



在这里插入图片描述
在这里插入图片描述在这里插入图片描述

有如下观察结果
(1)逐通道量化后精度更高,可以作为训练后量化权重和激活的基线模型,与对称量化相比,非对称对于所有模型都能进一步提高精度,更接近浮点精度。

(2)激活值进行8bit量化后,精度几乎不会损失,同时动态范围较小,原因是:

(a)BN没有缩放,确保所有特征图的激活值服从均值是0方差是1的分布;

(b)ReLU6的使用将激活值限定在(0,6)区间内,也不会导致太大的动态范围

(3)参数更多的网络比参数少的网络,如ResNet和InceptionV3等,对量化的鲁棒性更佳;

(4)尤其对于MobileNet网络对权重采用逐层量化时精度有严重下降;


(5)几乎所有的精度损失都是由于权重量化而导致的。
这是因为在进行逐层权重量化时BN在每一层的动态范围波动会很大,这就引起了严重的精度损失。

Appendix A 中对BN的作用做了更详尽的解释。而逐通道量化的量化粒度在kernel上,就跳过了这一问题,因此逐通道量化的精度与BN缩放是无关的。但是激活值仍然采用对称的逐层量化方式。


需要注意到其他量化方案,比如权重正则化等也可以提高训练后量化的模型精度,相关文献参考[22]。

3.2 Quantization Aware Training
训练中量化**



训练中量化比训练后量化可以达到更好的精度。本节就会介绍如何在训练中进行量化,以及这一过程如何在TensorFlow中高效实现的。同样也对不同的量化方案进行评估,实现结果显示出4bit量化精度下训练中量化比训练后量化的精度更高,甚至采用逐层量化也能达到更高的精度。
本节将权重和激活值君良华,在反向传播过程中使用Section II中介绍的straight through estimator来模拟量化;因此在前向和反向传播中均使用模拟量化后的权重和激活值进行计算,但是在梯度更新时使用的是浮点型权重,这样确保用较小的梯度更新权重,也不会造成梯度溢出。


更新过后的权重再经过量化,用于后续的前向和反向传播过程。因此,权重更新过程为:


在这里插入图片描述

训练中的量化均通过TensorFlow中的量化库完成,在训练和推断时在计算图中插入模拟量化操作,但将BN混合了进去,在训练或推断时仅需要一行代码就可以完成模拟量化的插入。
在这里插入图片描述在这里插入图片描述

训练中量化的步骤分为:

(1)(推荐)在已保存的浮点模型上进行微调,在预训练好的浮点模型上继续训练,或从头训练

(2)修改Estimator,向其中添加量化操作:tf.contrib.quantize增加伪量化操作模拟量化运算

(3)训练模型,训练过程结束后,皆可以获得量化后的带有权重、激活值各种量化参数的模型


(4)转换模型:使用tf.contrib.lite.toco convert将保存的量化模型转换为flatbuffer文件,此文件会将权重转为整型,也包含了激活值的信息


(5)执行模型:将转换后的带有整型权重的模型放在编译器或CPU上执行
Fig 5展示了量化前后卷积的运算过程

3.2.1Operation Transformations for Quantization
量化后的运算转换

很重要的一点就是确定量化过程中的所有误差都在训练时忠实的保留了下来,这会对加法、级联等操作有重大影响;此外还要保证推理阶段的融合在训练时也被正确模拟了,比如绝大多数平台在推理时会将加法与ReLU融合,为了匹配这一点,伪量化操作就不能加在加法和ReLU中间。

3.2.2 Batch Normalization

本小节主要讨论如何量化BN层,下一节会展示如何修正BN能够达到最佳精度。
BN批归一化操作会将每一层各个通道的统计量进行归一化,从而减少层间依赖性,提升模型精度。
BN的定义如下:


Training:

在这里插入图片描述

Inference:
在这里插入图片描述
其中µB和σB分别代表一个batch的均值和标准差,而 µ和σ则带代表整个数据集的均值和标准差,可以通过滑动平均值得到。
推断的时候会将BN运算融合进卷积,计算出新的权重Winf和偏置Biasinf:
在这里插入图片描述
在量化推理阶段,首先将BN融合进卷积操作然后再进行训练,可以看到训练时BN使用的是每一batch的统计信息,预测的时候则使用的是全数据集的统计信息,而每一个batch的统计信息会存在波动从而引起量化后权重的抖动,从而引起精度的下降。

一个简单的解决办法就是:

在训练时也是用全局的统计值(均值和标准差)。但这就消除了BN的作用,会引起训练的不稳定性。
因此重写计算图(graph rewriter)也是一种解决办法,可以消除训练与推断时BN的不一致。
在这里插入图片描述
总结一下:

(1)我们在量化之前总是要给权重施加一个修正因子,该修正因子是基于全数据集的统计信息得到的,这样可以确保不会因为batch统计信息的波动引起量化后权重的抖动;

在这里插入图片描述

(2)在训练的最初阶段,不对权重进行缩放(scaling),确保输出是正常BN后的输出结果,对于bias也做相应调整;

在这里插入图片描述

(3)在充分训练后,将常规BN切换至使用全局的均值和标准差进行权重和偏置的计算,一般在30000步或40000步后。
在这里插入图片描述

要注意到,此时使用的全局的均值和标准差是已经冻结的不再变化的,从而避免训练的不稳定性;其实就相当于推理时使用全局的统计参数。
3.2.3 Experiments
训练中量化可以缩小与浮点模型精度的差距,即使只对权重进行逐层量化。我们重复了前面对权重和激活值的量化实验,基于浮点型的checkpoint继续训练,同时冻结BN层,结果如Fig11\12和Table 4所示。

所有试验的设定如下:


(1)基于浮点型checkpoint后继续微调模型;


(2)微调时使用随机梯度下降法训练,学习率1e-5


我们注意到:


(1)对称与非对称量化的精度差距很小;


(2)这种训练方式即使使用很简单的量化方案,与浮点型精度差距也很小,即使使用逐层量化的方式也与浮点型精度相差无几。
详情参见Table IV.
在这里插入图片描述
3.2.4 低精度网络

8bit量化使用训练后量化已经比较接近浮点型的精度,为了进一步理解训练中量化的好处,本文进一步测试了4bit量化的效果,进行了以下实验:


实验1:4bit精度时逐通道量化显著优于逐层量化,在所有网络上君如此。在8bit精度时差距并没有如此显著,因为模型有足够的位宽容量,可以较好的保留权重信息;而4bit精度时就可以很明显的看出来逐通道量化的优势,详情请参考Table 5的2-3列。



实验2:在较低位宽时使用微调会显著提升模型精度。这一点对绝大多数网络而言是很有趣的一个发现,就是采用4bit微调 也只比8bit位宽精度下降5%左右,原因是微调在4bit时效果更显著。需要注意的是在这些实验中激活值一直是8bit量化的。




实验3:较低位宽的激活值。本文还研究了对所有层的激活值采用4bit并且不进行微调,要明确激活是逐层量化的,而权重还是采用8bit逐通道量化的。此时由于激活值量化造成的精度下降要比权重量化损失的多得多,详情参见Table6.



但因为权重和激活值的量化粒度不同,所以这一比较并不十分公平。本文只能假定量化后的激活值引入了随机误差,使得不同图片之间的模式存在较大差异,而权重量化是确定的,这就使得网络能更好的学习权重,从而弥补权重量化引入的误差。



在这里插入图片描述在这里插入图片描述

Section IV Training best practices
最佳训练配置

本文测试了量化模型的不同配置方法,首先比较了随机量化和确定性量化;随后探究了从头训练是否比微调的精度更高。
本文还测试了不同方法量化BN层的效果,实验发现BN层修正后进行量化的效果最佳,本文还比较了使用权重平均和不使用权重平均值的效果。
1.随机量化无益于精度提升。
随机量化会将浮点值确定下来,无益于提升模型鲁棒性;此外不同batch之间还存在波动性,因此在推断阶段量化值已经确定了,就会引起与训练时的不匹配,正是这种失配使得随机量化于确定量化相比表现不佳,而确定量化可以在训练时更好的进行补偿。
在这里插入图片描述2.在浮点型checkpoint上继续微调会得到更高的精度。
这就回答了到底是从头训练还是使用预训练模型进行量化,这一结论也与其他工作的结论一致,即基于浮点型checkpoint继续量化会得到更好的精度。所以最好现在较大自由度内训练模型,随后在以这个模型作为老师来引导小模型的训练。
在这里插入图片描述

3.推断时融合BN可以减少抖动,提升精度。

Fig14中对比了在MobileNet上使用原始的BN和修正后的冻结的BN,可以看到使用本文提出的方法使得精度获得提升,可以看到在训练时修正BN并且冻结BN可以进一步提升精度。
在这里插入图片描述

4.慎用指数滑动平均。在浮点型模型中,经常使用权重的滑动平均来提升精度,但是本文在反向传播时用的是量化后的权重和激活值,其浮点值可能会位于量化的决策边界上,即使瞬时值和滑动平均值之间有微小差异也会导致权重大大不同,从而影响性能,可以从fig15中使用EMA精度drop看出。
在这里插入图片描述

Section V模型架构推荐

本节将探讨如何选择激活函数以及如何权衡网络精度和网络宽度。


1.不要约束激活值的范围。



如果将激活函数由ReLU6替换回ReLU会带来精度上的微小提升,因此就让模型在训练过程中自己确定量化范围吧。




2.模型精度与宽度的权衡:
参量冗余更高的模型更适合量化,而即使是较为精简的网络也可以在精度与宽度之间进行权衡。



在这里插入图片描述

比如Fig17展示了4bit逐通道量化和8bit不同深度multiplier量化的对比,这样可以较好的评估网络深度与量化之间的权衡关系,本文一个有趣的发现就是,将权重进行4bit量化后的模型精度与直接将模型压缩25%的模型精度相差无几。

Section VI Run Time measurements
运行时间测评

本文在Google Pix2单核设备上测试了浮点型和量化模型的运行时间,也在高通DSP上测试了运行时间。在Google Pix2上量化模型比浮点模型推理速度加速2-3x,在高通DSP上加速10x。
在这里插入图片描述

Section VII神经网络加速器建议

为了让量化模型充分发挥优势,建议在设计神经网络加速器时考虑以下内容:


1.尽可能多的运算融合。

尽可能在一次运算中融合尽可能多的运算,这样可以降低访问内存的开销,提升实时运行时间,降低功耗。


2.压缩访存次数。

可以通过权重和激活的解压缩来优化内存带宽,一种简单的实现方式就是允许存储低精度的权重和激活值。


3.低精度运算。


通过支持各种精度的运算可以进一步进行加速,本文推荐的是支持4、8、16bit的权重和激活值运算。其中4、8bit对于分类任务足够了,更高精度主要用于回归任务,如超分辨率会让HDR高动态范围图像处理。



4.逐层选择位宽。



我们希望网络中尽可能多的层能以较低位宽运行,这样可进一步减少模型尺寸和运行时间。




5.逐通道量化。




支持权重的逐通道量化对实现以下几点是至关重要的:





(a)模型更方便在各种硬件上部署,不需要特定硬件上继续进行微调;





(b)低精度计算。

Section VIII结论

对本文进行的实验做如下总结:
1.模型量化

(1)对权重使用对称的逐通道量化,加上训练后量化方法,可以作为模型量化的起点;如果精度有下降则有选择的进行微调。


(2)训练中量化可进一步缩小量化模型与浮点模型之间的精度差距,8bi量化时差距在5%以内,即使4bit量化时精度差距也是差不多如此。


2.性能


(1)8bit量化在CPU上可以加速2-3倍,在特定DSP上加速比可达10倍。



(2)通过均匀量化可以在模型压缩4倍的情况下还不引起精度下降;更高的压缩比可以通过非均匀量化技术实现,如K-Means



3.训练技巧



(1)训练中量化可以显著提升模型量化后精度
;



(2)推断时的量化要与训练时的量化过程匹配,这一点是至关重要的;




(3)在量化模型中对BN进行调整,对于提升量化模型精度十分重要;




(4)训练过程中使用随机量化不如确定量化效果好;





(5)慎用指数滑动平均,可能会在引起精度下降。





4.量化模型结构





(1)需要在网络模型复杂福与网络规模之间进行权衡,一般规模越大的网络对量化误差的容忍性越高;






(2)在一个框架内,需要在特征图谱的数目与量化之间进行这种,因为特征图越多,就可以使用更低位宽的卷积核;






(3)不限制激活值的动态范围,直接对输出值进行量化,比约束激活值动态范围的精度要高,也就是说激活函数使用ReLU比ReLU6再进行量化效果要好。






接下来,本文希望进一步增强这一自动量化工具达到更好的量化效果,主要在以下方面进行探索:







1.使用正则化技术,从而更好的控制权重和激活值的动态范围,进一步提升性能;








2.蒸馏技术,进一步提高模型的精度;









3.对于权重和激活的逐层量化,提供进一步的硬件加速器,强化学习也许有助于解决这一问题。

本文链接http://www.taodudu.cc/news/show-1781897.html