CNN 量化技术

Quantize Model 是一种模型加速(Model Acceleration)方法。

背景介绍

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

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

为何量化能工作

神经网络的训练是一个不断对权重添加细微修正的过程,这种细微修正一般需要浮点精度才能完成 (尽管也有工作试图从这个阶段开始就量化,比如二值化神经网络)。

但是当用一个训练好的模型来做推断时,模型却能够很好地应对较大的输入噪声。比如为了识别照片中的物体,网络必须忽略所有的 CCD 噪声、光照变化,以及其它与之前训练样本之间的非本质差异,而只关注重要的相似之处。这种能力意味着神经网络似乎把低精度计算视为另一种噪声来源,而在数值格式精度较低的情况下仍能给出准确结果。、

为何需要量化

1. 神经网络可能会占据很大的存储空间,比如最初的浮点数格式的 AlexNet 大小就有 200 MB。这个大小几乎全部来自神经元连接的权重,因为单个模型里可能就有数百万或者更多个连接。模型大小不仅是内存容量问题,也是内存带宽问题。模型在每次预测时都会使用模型的权重(weights),图像相关的应用程序通常需要实时处理数据,这意味着至少 30 FPS(Frame per Second,每秒帧数)。

2.通常我们在构建神经网络模型中使用的精度都是 32 位单精度浮点数,在网络模型规模较大的时候,需要的内存资源就会非常巨大,而浮点数是由一位符号位,八位指数位和尾数位三个部分构成的。完成浮点加减运算的操作过程大体分为四步:

  • 0 操作数的检查,即若至少有一个参与运算的数为零直接可得到结果
  • 比较阶码大小并完成对阶
  • 尾数进行加或减运算
  • 结果规格化并进行舍入处理

带来的问题是网络在运行过程中不仅需要大量的内存还需要大量的计算资源。

目前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,仅对冗余很大的大模型有效,天然紧凑的小模型收效甚微,如果用剪枝的大模型,还不如直接上小模型更方便。

设计类的解决方案不是本文的重点,暂且不表。

量化压缩类近年来不断涌现出各种方法,目前压缩量化方法在处理速度-精度的权衡(latency-accuracy trade-off)时有两个问题:

1.已有压缩量化方法都没有在一个合理的基准CNN结构(reasonable baseline architecture)上进行评估。

最常用的CNN结构,如AlexNet, VGGNet, GoogleNet, ResNet等,这些竞赛模型为了在ImageNet上取得最优性能和极限准确率提升,在设计时参数都是严重过量的,因此这些CNN结构很容易获得大倍数或超大倍数的压缩。以两个例子来解释:

  • FC层:很多网络中参数最多的是两个FC层,如AlexNet/VGGNet等,很多实验基于这样的网络,去掉FC仅仅使用GAP(Global Average Pooling),以获得高的压缩率。但这种效果很难在本来已经很紧凑的网络模型中应用,比如ResNet/InceptionNet等。
  • CONV层通道/滤波器数量:为了尽可能保证性能,很多原始网络会增加通道的数量,使用宽的网络,但是,由于时间有限,无法通过调参去调试每个参数,所以很多原始网络存在很大冗余,通过调试的方式缩减通道数量可以使网络瘦身

所以,这两种方式本身就不具备通用性和推广性。

2.很多压缩量化方法都无法在真实硬件上提供可验证的效率提升。仅量化weight方法的主要理念是减少设备上的存储需求,而不是减少计算量,如int8的权值乘float32的输入得到输出float32,计算量与纯float32没有区别。同时,类似于XNOR, BWN, TWN等算法只给出了理论加速。

但是由于这些算法需要特定的硬件支持,所以并不能广泛推广。

Google提出的压缩方案

Google在论文[Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference]中介绍了一个简单的压缩方案:存储每层的最大和最小值,然后把这个区间线性分成 256 个离散值,于是此范围内的每个浮点数可以用八位 (二进制) 整数来表示,近似为离得最近的那个离散值。比如,最小值是 -3 而最大值是 6 的情形,0 字节表示 -3,255 表示 6,而 128 是 1.5。计算细节之后再说,因为涉及到一些微妙的东西,但大致说来就是可以把文件大小缩小 75%,使用的时候转换回普通的浮点数就可以仍旧使用原来的代码。

通过完全使用八位格式的输入和输出来降低推断计算需要的计算资源。这个实现起来要难很多,因为需要修改所有涉及计算的地方,但可能带来额外的回报。八位数值的存取相对浮点数而言内存带宽降到 25%,这样可以更好地利用缓存并且避免 RAM 存取瓶颈。也可以使用“单指令多数据流” (SIMD) 操作实现在每个时钟周期进行更多操作。

Google的压缩方案在移动硬件上在MobieNet这种本已经很紧凑的网络上实验,证明了其有效性。

在Tensorflow的量化实现中也使用了这种量化方式。

Google量化的实现

量化的实现是通过把常见操作转换为等价的八位版本达到的。涉及的操作包括卷积,矩阵乘法,活化函数,池化操作,以及拼接。转换脚本先把每个已知的操作替换为等价的量化版本。这包括小的子图,它们之前之后都有转换函数,用来把数据在浮点数和八位数之间转换。

论文分quantized inference和Training with simulated quantization两部分,主要思想如下:

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

具体等推导和细节介绍,请见下篇。

References:

  • Jacob B, Kligys S, Chen B, et al. Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference
  • Google. TensorFlow Lite.https://www.tensorflow.org/lite
  • S. Kligys, S. Sivakumar, et al. Tensorflow quantized training support. https://link.zhihu.com/?target=https%3A//github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/quantize
  • Howard A G, Zhu M, Chen B, et al. Mobilenets: Efficient convolutional neural networks for mobile vision applications.

你可能感兴趣的:(深度学习)