Google CVPR 2018论文:CNN量化技术

Google CVPR 2018论文:CNN量化技术

天下武功,无坚不破,唯快不破——火云邪神

深度学习如何做的更快,最好最实用的压缩加速方法有哪些,tensorlite中的MobileNet+SSD为什么那么快?推荐来自Google的CVPR 2018论文,介绍tensorlite的量化技术,有论文有源码,能work的良心大作,MobileNet+int8,快到飞起来

相关论文

  • Jacob B, Kligys S, Chen B, et al. Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference [C]// CVPR, 2018.
  • Google. TensorFlow Lite. tensorflow.org/mobile/t.
  • S. Kligys, S. Sivakumar, et al. Tensorflow quantized training support. tensorflow/tensorflow.
  • Howard A G, Zhu M, Chen B, et al. Mobilenets: Efficient convolutional neural networks for mobile vision applications. arXiv:1704.04861, 2017.

背景简介

计算量限制了我的想象力!

目前SOTA(State Of The Art,顶尖水平)的CNN都不适合在移动设备上部署,两点原因使CNN模型压缩和加速领域快速发展:

  1. 从AlexNet开始,CNN都以ImageNet上的分类准确率作为性能评估的主要甚至唯一标准,这使得CNN架构的发展都没有考虑模型复杂度和计算效率问题。
  2. 想要在智能手机,AR/VR设备,无人机等移动设备上部署CNN,需要模型大小比较小、时耗比较低,才满足设备的内存限制,保证用户体验。

CNN模型压缩和加速领域的主流方法,可以划分为两类:

  1. 设计类:设计新颖的网络结构,研究计算量低,内存消耗少的操作或层。高效的层有1*1 Conv, DepthwiseConv(DwConv), residuals connect, Global Average Pooling(GAP)等,和基于这些层的代表性CNN结构有:SqueezeNet,MobileNet,ShuffleNet,MobileNetV2,NASNet等。还有一种叫Distillation蒸馏法,从大模型teacher指导训练小模型student,压缩和加速的关键还是小模型设计的好不好,Distillation只是辅助训练的方法,所以也属于这一类。
  2. 量化压缩类:将CNN的权值(weights)和/或激活值(activations),从32-bits浮点数 量化到低比特位数表示,代表性方法是Ternary weight networks (TWN), Binary Neural Networks (BNN), XNOR-net, 和Deep Compression等。其中还有一小类Pruning剪枝法,把部分权值变成0并跳过计算,如connection Pruning 部分连接剪掉后会破坏并行和流水线,有时候得不偿失,而Filter/Channel Pruning,仅对冗余很大的大模型有效,天然紧凑的小模型收效甚微,如果用剪枝的大模型,还不如直接上小模型更方便。

设计类不是这篇论文的重点,按下不表(留在下一篇介绍我所认识的MobileNetV2,如果有下一篇的话。。

量化压缩类是这篇论文关注的重点,虽然纷繁复杂、多种多样,但目前压缩量化方法在处理速度-精度的权衡(latency-accuracy trade-off)时有两个通病:

【这是重点,打上高光】

第一个问题:已有压缩量化方法都没有在一个合理的基准CNN结构(reasonable baseline architecture)上进行评估。最常用的CNN结构,如AlexNet, VGGNet, GoogleNet, ResNet等,这些竞赛模型为了在ImageNet上取得最优性能和极限准确率提升,在设计时参数都是严重过量的,因此这些CNN结构很容易获得大倍数或超大倍数的压缩。以两个例子来解释:

  1. FC层问题:AlexNet和VGGNet中参数最多的是那两个FC全连接层,而近期CNN结构都表明去掉这两个FC层,仅用GAP就能获得高精度,如Inception系列和ResNet系列都去掉了FC仅用GAP,所以这两年有很多论文专捡软柿子捏,在FC层上大作文章就能轻易得到亮瞎狗眼的压缩率,把AlexNet和VGGNet压缩个几十倍还能保证精度不变,您怎么不在ResNet或者Inception系列上做实验呢?
  2. CONV层通道/滤波器数量:网络设计时,每个层的通道数通常都是人工设置的,比如最常用的64, 128, 256, 512, 1024等,这些数字都去遍历调参不太可能,而且ILSRVC竞赛打得火热,大家都尽可能的让卷积核/通道的数量比较大,网络宽一点保证性能最优。这其中肯定有很大冗余,所以这两年也有论文研究减少滤波器数量这个点(128换成127试试,哎呦效果不错,再试试125,嘿嘿嘿。。)

所以这篇论文呼吁:这些CNN结构上的实验最多只能证明某方法理念正确,但意义不大,所以这种量化实验要少做,更有意义的挑战是量化那些本来就在速度-精度权衡方面比较高效的模型,如MobileNet

第二个问题:很多压缩量化方法都无法在真实硬件上提供可验证的效率提升。仅量化weight方法的主要理念是减少设备上的存储需求,而不是减少计算量,如int8的权值乘float32的输入得到输出float32,计算量与纯float32完全没有区别。

值得注意的例外情况是二值,三值和bit-shift比特移位网络:

  1. bit-shift方法的权值是0或2的指数倍,这样乘法就可以通过比特移位的方式实现,然而,bit-shift仅能在定制的硬件上比较高效,在采用乘加指令(multiply-add instructions)的已有常用硬件上几乎无法加速。
  2. multiply-add instructions乘加指令的常用硬件,如果能正确使用流水线,乘加运算与单独用加法的速度差别不大,所以bit-shift加速乘法的优化就没有意义了。此外,乘法操作仅在操作位数很宽时才耗时,一旦权值和激活值都被量化到低比特位数,就没有必要避免乘法操作,而且操作位数越少就越不需要避免,所以这类量化方法都不会在设备上实测,都没有给出能验证预期加速的实验结果。
  3. 1-bit看起来更实用,将权值和激活值都量化到1-bit表示,这样乘法和加法都可以通过bit-shift和bit-count实现,如BNN在定制GPU kernels上的展示,但1-bit量化会导致严重的性能下降,这或许对模型表达太过于严苛了。

所以Google这篇论文,在移动硬件上对MobileNet做量化加速,提高latency-vs-accuracy tradeoffs:

  • 核心是量化方案quantization scheme,权值和激活值都量化到8-bit整数,少量参数是32-bit整数;
  • 提供inference framework和高效ARM NEON实现;
  • 提供模拟量化效应的协同训练,最小化量化误差;
  • 在分类检测任务上量化MobileNet的实验验证。

论文分quantized inference和Training with simulated quantization两部分。

Quantized Inference量化预测

参考论文:用8-bit定点计算在x86 CPU上加速预测。

  • V. Vanhoucke, A. Senior, and M. Z. Mao. Improving the speed of neural networks on cpus [C]// NIPSw, 2011.

量化方案,权值和激活值从实数r量化到8-bit定点整数q的公式:

两个量化参数,S是实数scale,Z是零点zero-point的量化值,每个权值矩阵内和每个激活矩阵内的所有值用一组量化参数,不同矩阵不同量化参数。定点后卷积:

累加结果是int32,所以偏置也量化到32-bit保证与累加结果同类型,最后激活值截断到uint8,激活函数用ReLU6

具体推导和细节见论文,就不展开了。

Training with simulated quantization模拟量化训练

参考论文:低精度定点计算加速CNN训练。

  • S. Gupta, A. Agrawal, K. Gopalakrishnan, and P. Narayanan. Deep learning with limited numerical precision [C]// ICML, 2015.

实验发现,浮点数训练后直接量化权值的简单量化方法,对大模型效果较好,但会严重影响小模型的准确率,可能原因:

  • 不同输出通道的权值范围差异较大(有时候超过100倍),如果所有通道量化到同一范围,权值范围较小的通道误差相对更大。
  • 异常权值会降低其他权值的量化后精度。

论文依然采用浮点训练,但在训练的前向传播中模拟量化效应,反向传播保持不变。这部分也不展开了,有兴趣直接看论文:

TensorFlow code(逼我学TF系列):

BN层融入权值层一起量化,节省了单独做BN的计算了:

实验结果

影响CNN性能最重要的一点,是矩阵乘法GEMM,论文中8-bit整数用Google自己的gemmlowp library,32-bit浮点乘法用Eigen library。

量化大模型的实验结果速览:

量化不同深度的ResNet,定点准确率比浮点仅低2%:

ResNet50不同量化方法的比较,这篇论文的方法精度最好,而且预测加速最友好:

InceptionV3用8-bit量化和7-bit量化结果接近,ReLU6比ReLU量化后精度下降更少:


量化小模型的实验结果速览:

量化MobileNet在ImageNet分类任务上的结果,硬件依次是:高功效处理器Snapdragon 835 LITTLE core,高性能处理器Snapdragon 835 big core,专门优化了浮点运算的高性能处理器Snapdragon 821 big core:注意横轴不是均匀的

量化Mobile SSD在COCO目标检测任务上,时间减少50%,精度下降1.8%:

量化Mobile SSD在人脸检测任务上,精度下降2%,耗时下降接近一半,四核加速1.5~2.2倍:

人脸属性分类,即使是优化浮点运算的821 big core,也有明显加速:

消融实验:

  1. 量化比特宽度减少时,权重对变化更敏感
  2. 8bit和7bit量化与浮点模型性能相当
  3. 当总bit深度相同时,保持权值和激活的bit深度相同时更好

END

以上,其实大部分都是论文翻译,很多地方强迫翻译成中文,表达不当之处请见谅!

编辑于 2018-04-29

文章被以下专栏收录

    关注当前目标跟踪方向最火的方法之一,相关滤波的最新工作,分享好论文和心得,推荐好用的高速方法,当然也包括那些结合深度特征或结合CNN训练的相关滤波方法,欢迎道友投稿。近期也会关注深度学习相关的检测、识别算法。