论文阅读——Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference

论文阅读——Quantization and Training of Neural Networks for Efficient
Integer-Arithmetic-Only Inference
from Google

Abstract

随着移动终端的普及以及深度学习模型对算力的巨大要求急需高效且准确的在设备进行推理的方案。本文提出了一种量化方案可以只用整数进行推理,比浮点数效率更高。本文还设计了一种训练程序可以保持量化后端到端的精度。这种方案较好的在精度和设备上端到端的延迟之间取得了较好的均衡,尤其在以高效著称的EfficientNet系列也有显著效果;最终本文在通用CPU上进行了ImageNet分类和COCO目标检测证明了这一方案的有效性。

Section I Introduction

目前SOTA的CNN框架并不能应用于移动终端,自从AlexNet的问世后主要依靠分类精度或检测精度进行评估,随后网络的发展就没有考虑模型效率一路在模型复杂度上高歌猛进。另一方面如果要应用在移动终端或者AR/VR设备或者无人机上,鉴于片上资源有限责需要较小规模的模型,以及低的延迟推理时间。因此,如何在保证基本不损失精度的前提下精简模型尺寸、降低推理延迟成为一大研究热点。

主要由两类技术路线,一是以MobileNey,SqueezeNet,ShuffleNet,DenseNet等为代表的充分利用计算、内存资源的高效模型;二是将32bit浮点数表示的权重和激活值量化为低比特定点数,代表工作由:TWN,BNN,XNOR-net等。但尽管第二类已经有许多前人的工作,但未能很好的在精度和延迟之间进行权衡。
首先,提出的量化方案没能在一些通用的基准模型上进行测试,如AlexNet,VGG,GoogLeNet等为了提升精度都过度参数化。因此很容易对这些模型进行压缩,验证量化的概念效果;另一种更有意义的测试时对已经足够高效的网络,如MobileNet,权衡精度与推理延迟。


第二点,许多量化策略没有在实际的硬件单元上验证其有效性,比如对权重的量化只关注片上存储,于计算效率关系不大。值得注意的例外是二值化、三值化和移位网络,比如最后一个将权重用0或2的幂表示,从而将乘法用移位实现,这样再辅助一些流水技术,计算成本并没有比加法高多少;因为只有在操作数位宽较宽的时候乘法才比较昂贵,如果将权重和激活值的位数都量化到较低位数,就可以有效避免乘法的计算成本。

值得注意的是,这些方法很少有在硬件上真实测试过来说明自身有效性。更适合实时性运行的方法是将权重和激活值量化至1bit,这样乘法和加法就可以用移位和位计数来实现,可以应用到定制的GPU中。然而1bit量化精度下降太多,不足以表征模型。

因此,本文通过在常见的移动硬件平台上改善MobileNet关于精度与延迟的权衡纹理,主要工作包括:


(1)提出的量化策略将权重和激活值都量化为8bit整数,只有少数参数,如偏置量化为32bit整数;


(2)本文还设计了一个量化推理框架可以高效在硬件上进行整数运算,在Qualcomm Hexagon和ARM NEON上进行了实现;


(3)本文还将这一框架应用在MobileNet进行分类和目标检测,在通用ARM CPU上的结果显示出在精度和延迟的平衡上有了较好的权衡。



本文的灵感来自于paper[7][31],其中[7]利用低精度定点数加速CNN的训练,[31]使用8bit定点数加快在x86 CPU上的推断过程。本文的量化策略聚焦于如何在移动端CPU上较好的平衡推理精度与推理速度。

Section II Quantized Inference

Part A Quantization scheme



本节会介绍通用的量化方案,也就是值的bit表示与值的真值之间的映射关系。本文的量化方案是在推理过程中使用整数运算,在训练阶段还是浮点数。因此首先就要提供严格的数学定义,然后分别进行浮点数训练和整数推理。



本文量化策略的主要条件就是只是用整数运算,而避免使用查找表,因为在纯SIMD硬件上往往性能较差。这就需要在整数S与实数Z之间寻找一种映射关系:




在这里插入图片描述

本文会对每一个权重矩阵或特征矩阵使用一组李量化参数,不同的阵列使用不同的量化参数。
比如8bit量化,q就量化为8位,偏置量化为32bit,而常数S则是scale缩放因子,是任意正实数,通常在软件中用浮点数表示,下一节还会说明避免使用浮点数减轻推断的workload的方式。




而常数Z与q实相同类型,实际上Z就是实数0对应的量化值q,这是为了让实数0用能量化值精确表示,因为神经网络中经常需要做0填充。





Part B 整数矩阵乘法





下面解决如何用整数运算完成推理,也就是如何将实数转化为量化值计算,如何将量化值计算变为纯整数计算,即使scale不是整数的情况。
考虑两个NxN的实数矩阵乘法r1 x r2 = r3,矩阵中的每一项表示为r(a)(i,j)
因此映射就变成了:






在这里插入图片描述

根据矩阵乘法的定义,就是:





在这里插入图片描述

可以重写为:






在这里插入图片描述

其中M表示为:
M是唯一的非整数,仅取决于S3,S2,S1,并且观察到M总是在[0,1]之间因此可以归一化为:
在这里插入图片描述

其中M0在[0.5,1]之间,并且M0很适合表示为定点乘法,如使用int32则M0是最接近2^31M0的int32值至少为230,因此至少具有30位相对精度,因此与M0的乘法可以实现为定点乘法;即使需要进行四舍五入,也可以通过移位完成。这部分可参考Appendix B.
Part C Efficient handling of zero-points


高效处理零点
为了高效计算而不必执行2N3次减法,也不必将乘法扩展为16位整数,首先改写计算方程
改写为(7)

论文阅读——Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference_第1张图片

其中乘法聚集在(9),
在这里插入图片描述

这样别的地方就没有矩阵乘法累加了。
Part D Implementation of a typical fused layer


典型融合层的实现
将整层的计算融合到一个操作中并不算优化,因为在训练和推理代码中使用的是相同的短发,因此推理代码中的 bit量化输出必须与训练阶段“伪量化”的格式匹配。
本文在ARM和x86架构上实现时接住了gemmlowp库,其中的GemmWithOutputPipeline 提供了本文所需的融合操作。


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

其中q1代表权重矩阵,q2为激活值矩阵,都是uint8类型,进行累加操作需要一个32位的累加器,本文选择的是带符号的累加器,原因后面会说明。因此,(9)的运算就编程:
而偏置最好也使用int32,但由于偏置只占参数中很小一部分,因此即使使用高精度也无伤大雅;但由于偏置是直接加载激活值上的,因此一点小失误也会影响端到端的精度,因此必须避免这部分的误差。
获得int32累加值后还要做3件事:scale down(将累加值缩放到8bit),cast down(继续将输出值换换位uint8,(activation function)利用激活函数产生最终的8bit输出。
对于激活汗珠,本文只聚焦于clamps使用钳位的激活函数,比如ReLU,ReLU6,这部分没有放在融化层中,而是在AppendixA中进行了讨论。因此激活函数量化需要做的就是将uint8的输出钳制到[0,255]区间内。实际训练时更倾向于在整个[0,255]间隔训练。

论文阅读——Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference_第2张图片

Fig1.1描述了TF中卷积量化前后的对比图。(a)表示推断时仅用整数运算,输入输出都是uint8类型,卷积的计算需要8bit的整数运算以及32bit整数累加,偏置也是32位整数,可以看到非线性的ReLU6只包含整数运算。
(b)则是卷积的模拟量化示意图。所有的变量都是用32位浮点数表示,而权重量化节点(we quan)和激活量化节(act quan)分别在输入后和输出前插入,模拟对变量的量化作用。最终的结果与整数运算的结果相近,以及整个训练过程是用的浮点数。(c)得益于CPU中整数运算电路的快速,在精度和延迟之间得到了较好的平衡。

Section III Training with simulated quantization

模拟量化训练
量化网络常见的训练方法是用浮点数训练然后将得到的权重量化,有时还需要量化后训练进行微调)。



本文发现这种方法对于表征能力强的大型模型效果较好,对于小型网络会导致精度下降。一些失败的训练后量化策略包括:



(1)不同输出通道权重的量化范围相差过大(超过100x),比如Section 2中将同一层的所有通道量化为相同的分辨率就会导致范围较小的通道上的权重具有更大的相对误差



(2)异常的权重值会影响权重量化后的整体精度
。



因此本提出了一种在训练的前向传播过程中模拟量化的方法,反向传播还是像往常一样,以及所有的权重和偏执以浮点数形式储存,这样即使有少量误差也可忽略。通过对浮点数进行四舍五入就可以在前向传播过程中规模推断的量化过程。




(1)权重在于输入运算之前就先进行了量化,以及如果还使用了BN,则在量化之前就将BN参数合并到权重中。3.2节会详细说明;




(2)激活值在进行推断时量化,在卷积或全连接层完成后的输出之后,或者在ResNet的通道concatenation或者旁路连接完成后,进行量化。
每一层根据量化的level和钳位的范围决定如何量化,具体的量化函数为:
论文阅读——Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference_第3张图片

其中r是待量化的实数,n则是比特数,在整个实验中都是固定的,如本文取n = 8bit量化,[]意味着取整。
Part A Learning quantization ranges

量化范围的学习
权重和激活值的量化范围是不一样的:


(1)对于权重而言,基本思路是设定a,b分别为w的最小和最大值。本文中稍作调整,将范围限定在[-127,127]内,不会出现-128这样的值,因为这会带来其他优化的可能,详情参见AppendixB.


(2)对于激活值而言,量化范围则取决于网络的输入。为了估计这一范围,会收集训练过程中落在[a,b]范围内的数据,然后通过指数滑动平均获得均值,这样就可以在数千个训练步中进行平滑处理。但由于EMA计算存在延迟,所以在开始阶段(从5万-2百万)不会对激活值进行量化,等让网络进入到一个较稳定的状态后再进行量化。


在上述两种情况下都会微调[a,b]的范围,以便将0.0量化后精确的表示某一实数,总是就是学习实数到整数的量化映射函数:
论文阅读——Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference_第4张图片

下面描述了Tensorflow中模拟量化的过程,并不包含融合和删除操作,而插入伪量化操作、推理阶段的优化已经在Tensorflow中开源。


此时我们还要注意到偏置是未被量化的,在推断阶段依旧用32位整数表示,与8bit的权重和激活相比,偏置具有更高的范围和精度。此外,偏置的量化参数是从权重和激活值量化中推断得到的。
Part B Batch Normalization的折叠
如果模型运算中包含了BN处理的额复杂程度就又上一层。尽管在训练的时候将BN作为单独的一个运算block,在推断时为了效率考虑会将其“折叠”进卷积或全连接层。为了准确的模拟量化过程,也需要模拟这一折叠步骤。具体实现:
在这里插入图片描述

其中gamma是BN的缩放因子,EMA项则是卷积结果在这一批次中的滑动平均值,epsilon则是为了稳定设定的一个小的常数。
折叠之后,带有BN的卷积操作就简化为了Fig1.1中描述的那样,折叠后的权重为wfold,bias也被折叠。在Appendix中可以看到BN后的卷积层,C.5,C.6分别是量化前的推理阶段和训练阶段;C.7,C.8是量化后。

Section VI Experiments

本文进行了两组实验,第一组用于验证量化训练的有效性,第二组用来说明在通用硬件平台上对延迟和精度的权衡效果。
在神经网络中计算量最大的是矩阵乘法部分(GEMM),8bit的推断代码使用了gemmlowp库。32bit使用了Eigen库。


Part A 大型网络的量化训练



主要在ImageNet数据集上对ResNet和Inception V3进行了量化训练。




ResNets




Table 4.1展示了不同ResNet深度浮点数与整数量化的对比结果,可以看到整数量化与浮点数的精度差在2%左右。




论文阅读——Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference_第5张图片
InceptionV3

Table4.3则展示了量化到7bit\8bit与浮点数的精度对比,还比较了两种非线性激活函数ReLU和ReLU6对量化的敏感程度,其中ReLU6精度下降更小一点异味它的激活范围是[0,6],而ReLU允许激活从更大的区间范围内取值,不同铜带还可以有不同的范围,这说明了固定范围内的值量化后的精度更高。
论文阅读——Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference_第6张图片
Part B MobileNets的量化

MobileNets是一些列轻量级网络,在精度和延迟之间较好的进行了权衡,本节会解释整数量化是如何进一步改善在 硬件上二者的均衡的。


ImageNet



本文在3种Qualcomm内核上度不同的DM和分辨率进行了测试,这三种内核分别代表了3种不同的微结构:




(1)Snapdragon 835 LITTLE
core 在Google Pixel2中的高效微功率处理器




(2) Snapdragon 835大型内核




(3)Snapdragon 821大型内核 在GooglePixel1中使用的高性能内核




分别对应Fig1.1,Fig 4.1 Fig4.2





论文阅读——Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference_第7张图片
论文阅读——Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference_第8张图片

纯整数量化的MobileNet比浮点数的MobileNet精度更高,在Snapdragon 821实时操作中延迟为33ms,但精度相差近10%.尽管其他工作聚焦于如何减少精度损失,本文主张精度-延迟的均衡作为更好的评价指标。可以看出二者的均衡主要取决于硬件中证书运算与浮点数运算的相对运算速度。以Snapdragon 821为例通过优化浮点运算可以有效减少量化模型的延迟。





COCO




本文还测试了量化模型进行移动端实时目标检测的效果,模型为COCO数据集上的MobileNet SSD,将SSD预测层中所有的常规卷积替换为可分离卷积,这样与MobileNet优化思路抑制,提升了计算效率高。从Table 4.4中可以看出早835单线程上延迟减少了近一半,而精度几乎没有损失。





Face detection





人脸检测则是为了测试量化模型在更小范围内的效果,从Table 4.5中可以看出精度也下降2%但latenc却获得了2x的提升;并且浮点运算比整数运算还慢;4.6显示了多线程的情况,比如4内核时加速比可达1.5-2.2倍,而且模型越大,加速比越高。而多线程的开销只占总计算量的很小一部分。




论文阅读——Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference_第9张图片论文阅读——Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference_第10张图片

论文阅读——Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference_第11张图片
论文阅读——Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference_第12张图片
Ablation study
为了更好的理解模型对量化策略的敏感程度,本文还分别评估了权重量化和激活量化不同深度的对比结果,Table 4.7和Table 4.8的结果显示出:

(1)权重对量化深度比激活值更为敏感

(2)8bit和7bit量化模型与浮点模型的性能接近

(3)当整体的量化深度相同时,最好保持权重和激活的量化深度一致。

Section V Discussion

本文提出了一种纯整数运算来近似神经网络中浮点运算的量化策略,量化后的模型与原始模型精度几乎一样。模型规模是原来的1/4,而推理时间进一步减少,较好的平衡了在ARM CPU上的精度与延迟。本文的量化方案以及高效架构的设计联合表明,纯整数运算进行推理可能成为推动计算机视觉技术进入实时和移动终端市场的关键。

你可能感兴趣的:(CV,计算机视觉,神经网络,机器学习,算法)