Quantize Model 是一种模型加速(Model Acceleration)方法。
目前SOTA(State Of The Art,顶尖水平)的CNN都不适合在移动设备上部署,两点原因使CNN模型压缩和加速领域快速发展:
神经网络的训练是一个不断对权重添加细微修正的过程,这种细微修正一般需要浮点精度才能完成 (尽管也有工作试图从这个阶段开始就量化,比如二值化神经网络)。
但是当用一个训练好的模型来做推断时,模型却能够很好地应对较大的输入噪声。比如为了识别照片中的物体,网络必须忽略所有的 CCD 噪声、光照变化,以及其它与之前训练样本之间的非本质差异,而只关注重要的相似之处。这种能力意味着神经网络似乎把低精度计算视为另一种噪声来源,而在数值格式精度较低的情况下仍能给出准确结果。、
1. 神经网络可能会占据很大的存储空间,比如最初的浮点数格式的 AlexNet 大小就有 200 MB。这个大小几乎全部来自神经元连接的权重,因为单个模型里可能就有数百万或者更多个连接。模型大小不仅是内存容量问题,也是内存带宽问题。模型在每次预测时都会使用模型的权重(weights),图像相关的应用程序通常需要实时处理数据,这意味着至少 30 FPS(Frame per Second,每秒帧数)。
2.通常我们在构建神经网络模型中使用的精度都是 32 位单精度浮点数,在网络模型规模较大的时候,需要的内存资源就会非常巨大,而浮点数是由一位符号位,八位指数位和尾数位三个部分构成的。完成浮点加减运算的操作过程大体分为四步:
带来的问题是网络在运行过程中不仅需要大量的内存还需要大量的计算资源。
目前SOTA(State Of The Art,顶尖水平)的CNN都不适合在移动设备上部署,两点原因使CNN模型压缩和加速领域快速发展:
CNN模型压缩和加速领域的主流方法,可以划分为两类:
设计类的解决方案不是本文的重点,暂且不表。
量化压缩类近年来不断涌现出各种方法,目前压缩量化方法在处理速度-精度的权衡(latency-accuracy trade-off)时有两个问题:
1.已有压缩量化方法都没有在一个合理的基准CNN结构(reasonable baseline architecture)上进行评估。
最常用的CNN结构,如AlexNet, VGGNet, GoogleNet, ResNet等,这些竞赛模型为了在ImageNet上取得最优性能和极限准确率提升,在设计时参数都是严重过量的,因此这些CNN结构很容易获得大倍数或超大倍数的压缩。以两个例子来解释:
所以,这两种方式本身就不具备通用性和推广性。
2.很多压缩量化方法都无法在真实硬件上提供可验证的效率提升。仅量化weight方法的主要理念是减少设备上的存储需求,而不是减少计算量,如int8的权值乘float32的输入得到输出float32,计算量与纯float32没有区别。同时,类似于XNOR, BWN, TWN等算法只给出了理论加速。
但是由于这些算法需要特定的硬件支持,所以并不能广泛推广。
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的量化实现中也使用了这种量化方式。
量化的实现是通过把常见操作转换为等价的八位版本达到的。涉及的操作包括卷积,矩阵乘法,活化函数,池化操作,以及拼接。转换脚本先把每个已知的操作替换为等价的量化版本。这包括小的子图,它们之前之后都有转换函数,用来把数据在浮点数和八位数之间转换。
论文分quantized inference和Training with simulated quantization两部分,主要思想如下:
具体等推导和细节介绍,请见下篇。