论文阅读——EasyQuant: Post-training Quantization via Scale Optimization via Scale Optimization

论文阅读——EasyQuant: Post-training Quantization via Scale Optimization
from DeepGlint
Paper:EasyQuant: Post-training Quantization via Scale Optimization
Code:EasyQuant

Abstract

8bit量化广泛用于深度神经网络推断阶段 的加速,主要由两种量化方式:训练中量化和训练后量化。其中训练中亮化使得会是的训练过程更为复杂,而后量化又可能会导致不可接受的精度下降。
本文通过优化缩放参数(scale)提出了一种更为简单高效的后量化方法,称为EasyQuant(EQ),可以达到与训练中量化相近的精度。

EasyQuant优化了每一层权重和激活值的量化因子的取值,使得卷积后达到更高的量化精度;随后将权重和激活值的位宽降至7bit,中间值以int16形式存储,来加速推理。实验结果显示在不同计算机视觉任务中EQ比TensorRT效果更佳,7bit位宽后量化达到了接近int8的精度。

Section I Introduction

深度卷积神经网络在计算机视觉住过领域取得了巨大的成功,如分类、检测、识别等任务。但是这些模型需要大量的计算,对于一些资源有限的设备,其算力和功耗都是问题。
而低比特量化,如8bit通常比浮点模型,如32bit浮点数相比,精度会寓所损失。

尽管在训练中量化比后量化能达到较高的精度,但在实际应用中也有诸多限制。比如训练一个量化的神经网络十分费时。严重依赖于专家经验;以及在某些场景下训练数据无法完全用于量化后的模型。

本文则提出了一种简易高效的后量化方法-EasyQuant.

对权重和激活值进行量化引入了cosine相似系数来衡量FP32与INT8之间的相似程度,通过交叉搜索权重和激活值的缩放因子(scale)来最大化这一cosine相似性;而整个网络采用的是逐层优化的方式,从而获得每层最优的scale,而每一层中权重和激活值的缩放因子是统一优化的,下一层的scale也于上一层的结果有关。

此外,本文还将中间值以INT16存储,采用Winograd量化算法提升硬件上的推断效率。
最终本文在不同位宽设置下在一些通用的计算机视觉任务上进行了测试。

本文的主要工作总结如下:


(1)提出了一种后量化的scale优化算法,通过搜索交替优化每一层权重和激活值的缩放因子,能够达到和训练中量化相近的进度。


(2)本文还将提出的量化方法实现了7bit量化推理网络,有效提升了INT16中间值存储效率。


(3)在通用计算机任务下进行了一系列测试,其中INT8后量化能达到与训练中量化相近的精度,INT7量化且没有微调能够达到接近INT8的精度,并在实际的ARM平台上完成了EQ INT7的部署。

Section II Related Work

神经网络的量化主要可分为两类:训练中量化和训练后量化,其中训练中量化通常会从头或在FP32预训练网络的基础上进一步微调;而训练后量化通常会江一个浮点训练好的网络直接量化至整数范围。本小姐主要总结在不同硬件平台上部署的不同量化方案的性能。
Part A Training-based Quantization

基于训练的量化通常学习如何用较低比特训练网络,但常常会导致较大的性能下降。

近年来关注的焦点逐渐转移到如何用稍高位数达到与FP32相近的精度,比如增加filter数量、逐渐增大量化的范围,这些工作都是尝试如何用低于8BIT的位数从头训练网络,而在工业应用中还是以8BIT量化最为常用。


另一种则是训练中量化(QAT,quantization aware training),QAT会模拟训练中的量化噪声,在FP32范围内用常规方法进行训练,主要就是弥补INT8量化的精度损失,也几乎不会考虑中间存储的影响。此外一般从头开始训练的时间复杂度都很高,往往需要专家在原域和目标域都有丰富经验,尤其在物体识别和人脸识别领域有所应用。
Part B Post Training Quantization

鉴于前面一种方法存在诸多限制,因此训练后量化就成为了INT8量化的主要量化手段。这方面进行的尝试有:TensorRT,TensorflowLite等。都是用于高性能深度学习推理的优化器。

TensorRT通过计算KL散度来校准激活值量化的最小阈值,通过计算权重的绝对值最大值作为权重量化的阈值;而TensorflowLite则是采用绝对值最大作为激活值的量化阈值,还在权重量化中加入了per-channel量化。

这两种方式都只是根基权重或激活的绝对值最大值进行缩放,在一些网络中都有一定程度的精度下降。
随后Yoni等人将每一层的量化都作为一个优化任务,交替进行黄金分割搜索,但这十分耗时,因为量化向量的搜索空间十分庞大。Bannor等人则在理论上推导出来了激活值的最佳裁剪值,但是对于激活值的分布有严格的假设,因此实际应用中很少使用。


本文则将权重和激活的缩放因子scale进一步优化,尽量减少量化对卷积结果的影响。因此本文的方法对各种模型鲁棒性更佳,并不只是针对于某一特定类型的网络。



Part C 工业应用


对神经网络进行量化很重要的一个好处就是可以有效减少在边缘设备上的推理时间,因为在边缘设备上常常算力有限。但是在实际硬件部署时有的方法[32,24,6]仅对权重进行量化,[27,33,5]等虽然对权重和激活值均进行了量化但都对部署的硬件平台有特定的要求,从而阻碍了量化方案的广泛应用。本文的量化方案适用于一般通用的硬件,并且在ARM上还实现了INT7的硬件量化。

Section III Method

本文与前文谷歌或英伟达的量化方案不同,他们都是直接取绝对值的最大值作为scale,这样存在误差积累的问题,而量化后的数据分布也有可能与原始的浮点型输出分布存在差异。



Part A Linear Quantization Formulation




线性量化可表述为下述公式:

在这里插入图片描述

其中S就是缩放因子scale factor,随后在进行四舍五入,以及对范围外的值进行截断。其中round方式有多种,可以是round,ceil,floor,Zb表示量化bbit对应的范围。
那什么是per-layer逐层量化呢?
可以用{Al,Wl,Sl}分别代表FP32范围下某一层的激活值、权重和缩放因子,以及权重和激活值的缩放因子分别表示为Sw和Sa,均为非负实数,逐层量化中整层均使用统一的缩放因子。

而在逐通道量化per-channel中权重的每一个filter都有自己的一个scale因子。
则量化后的输出则是:每一层量化后的激活值与权重卷积后再反量化的结果:
在这里插入图片描述
在这里插入图片描述

因此,可以看到scale factor决定了截断的阈值,这也是影响量化后与原结果之间结果相似性的因素,本文的目标就是优化缩放因子,增加量化后结果与原结果的相似性。
Part B Scale Optimization

神经网络的量化过程可逐层完成,分别对要进行卷积操作的权重和激活值分别量化,Fig 1展示了卷积层量化的流程,分为三部分:对输入的激活值和权重进行量化->进行卷积->反量化。
论文阅读——EasyQuant: Post-training Quantization via Scale Optimization via Scale Optimization_第1张图片

左侧表示对权重和激活值进行量化,可以看到权重的scale不同颜色代表不同的scale因此是per_channel量化;

中间表示对量化后的INT8表示的权重和激活数据进行卷积,可采用DW,im2col,GEMM,Winograd等实现;

最右侧方框代表下一步操作,如果下一层无需量化则直接进行反量化(dequantize),也就是除以权重和激活的量化因子;如果还需进行量化,进行的是requantize再量化过程,需要乘以下一层的scale factor继续量化。


对于每层权重进行量化时,如果仅使用权重的绝对值最大值作为量化的阈值,就忽略了量化后的结果与原始数据分布上的差异,这样就不能保证量化后做的卷积与原始卷积输出结果的一致性了。
为了解决这一问题,本文就对scale factor进行优化,优化依据则是权重及激活值的scale与原始卷积输出结果的相似性。
Optimal Scale for Each Layer

单层的最佳缩放因子
在量化公式中, Al是根据训练数据集中每batch数据计算出来的结果,则第l层的量化再反量化的输出与原始输出的相似性就是所有N个样本相似性的平均值,优化目标就是使得这一相似度最大。
通常scale越大,更高值才会饱和到量化范围的最大值;scale越小,越多较小的值会被量化到0。

论文阅读——EasyQuant: Post-training Quantization via Scale Optimization via Scale Optimization_第2张图片

本文的scale优化步骤分两步走:

(1)首先固定激活值的缩放因子Sa,调整权重的缩放因子Sw;

(2)随后固定Sw优化Sa。
Sw和Sa交替优化直至cosing相似度收敛或者达到预设的值。

最开始Sw和Sa分别初始化为权重和激活的最大值;随后将搜索空间分为n段进行搜索[aSl,bSl]在这里插入图片描述
,本文中a=0.5,b=2,n=100.
还可以使用更好的搜索方法,但本文发现这种分段的搜索方法已经对于一些异常值具有较好的鲁棒性了。
这种搜索方法也适于逐通道量化,只不过weight的scale现在变成了一组值,分别就是filter的数目。
Optimal Scale for the Whole Network
网络的最佳缩放因子
通过逐层使用前面提及的单层最佳缩放因子搜索方法,就能获得整个网络的最佳缩放因子。

Algorithm 1中也能体现出是Sw和Sa依次交替优化的;当一层的权重和激活的scale都优化完毕后,传递到下一层继续进行下一层scale的优化。


这种逐层优化的贪心算法将整个网络的优化分解为每一层优化,大大降低了搜索空间;此外对于当前层的优化也是考虑了前面所有层的累积误差的基础上进行优化的。


论文阅读——EasyQuant: Post-training Quantization via Scale Optimization via Scale Optimization_第3张图片
Part C INT7 Post-training Inference

接下来本文进行了INT7后量化的推理加速
量化效果在很大程度上依赖于硬件特性,才能发挥出低比特推理的优势。

在常规的卷积计算中,矩阵乘加运算可以通过ARM multiply指令集中的SMLAL(向量乘加)和SADALP指令完成。SALAL完成8bit成家运算输出16bit结果,SADLP指令将两个16bit结果相加得到32bit结果。通过使用这两条指令可以在ARM架构中高效完成卷积运算。Fig 2描述了上述数据流。
论文阅读——EasyQuant: Post-training Quantization via Scale Optimization via Scale Optimization_第4张图片

在INT8量化中,需要使用32bit寄存器存贮中间变量,但在ARM V8.2-A架构发布之前还没有指令用于存贮两个8bit到32bit寄存器中,常用就需要分上述两步走。
在常规卷积运算中8bit符号数只能做两次SMLAL乘加指令,范围[-2^7, 27-1],然后再讲16bit的中间结果[-214,214]进行累加,累加到第二次就有溢出风险[-215,2^15]。
本文提出的7bit符号数可以做8次SMLAL还不会溢出,再进行累加,因此加速效果明显提升,这一点在工业应用中很重要。

Section IV Experimental Results

本节进行了以下实验:

(1)与其他量化方案进行比较
;
(2)实现EQ量化的硬件部署,分别测试了8bit,7bit和低于7bit位宽的效果。
Part A Settings实验设定


本文的量化方案属于训练后量化策略,因此与TensorRT进行对比,TRT使用的样本是1000张。
本文则仅使用了50张训练样本进行scale的优化,1000 vs 50.


在8bit位宽上量化效果几乎一致,7bit量化甚至还有0.1%-0.15%的提升。
scale的划分区间是[0.5S,2S]。

Part B INT8 量化结果

Table I展示了不同网络(SqueezeNetV1,MobileNetV1和VGG16、ResNet50在ImageNet2012上进行INT8和INT7的后量化结果,可以看到无论是INT8还是INT7均好过TensorRT,更为接近浮点运算的结果。

论文阅读——EasyQuant: Post-training Quantization via Scale Optimization via Scale Optimization_第5张图片

在较为复杂的任务中表现更为优异:
Table II和Table III则分别展示了在VOC2017做物体检测以及人脸检测的结果.
论文阅读——EasyQuant: Post-training Quantization via Scale Optimization via Scale Optimization_第6张图片论文阅读——EasyQuant: Post-training Quantization via Scale Optimization via Scale Optimization_第7张图片
Table 4展示的则是与QAT量化的8bit量化效果对比,在Resnet上的表现EQ是优于QAT的。
论文阅读——EasyQuant: Post-training Quantization via Scale Optimization via Scale Optimization_第8张图片

Part C INT7量化结果
7bit量化后保留原来的权重和激活值的信息量就更少了,模型中就会引入更多的量化误差,因此INT7量化需要更先进的量化策略。

从Table 1,2,3中看到INT7量化结果与INT8十分接近,Table 5进一步对比了硬件(RK3399)上的加速效果:
论文阅读——EasyQuant: Post-training Quantization via Scale Optimization via Scale Optimization_第9张图片

而INT7前面分析过,减少了激活和权重1bit的存储为,存储16bit中间值也更安全,不会溢出,推理加速效果比int8更好。使用int16寄存器比INT32寄存器不仅更快而且访存次数更少,这样在不同ARM平台上可以减少20%-33%的计算成本.


Part D 更低bit实验结果



从Fig 3中可以看到,在VOC2017做物体检测时可以看到低于7bitmAP指标显著下降,但在做人脸检测时量化到int5精度都没有明显下降。




Fig 4展示了一些EQ与TRT做检测任务时无误检测的场景。




论文阅读——EasyQuant: Post-training Quantization via Scale Optimization via Scale Optimization_第10张图片
论文阅读——EasyQuant: Post-training Quantization via Scale Optimization via Scale Optimization_第11张图片

Section V Conclusion

本文提出了一种后量化的优化方法,通过对每层scale进行优化在保证量化后精度的基础上有效减少了推理时间。并且INT7量化无需依赖任何特定平台,对精度和推理时间都有一定提升。

而本文的int8量化更适合工业应用,实验结果也显示出这种量化方案适用于多种任务。通过采用16bit存储中间值以及winograd优化,与TRT相比,本文可进一步提升推理速度。

你可能感兴趣的:(CV,神经网络,算法,计算机视觉,卷积,量化)