模型压缩与推理加速
01 为什么要压缩模型
卷积神经网络(CNN)早已成为图像分类、目标检测、语义分割等计算机视觉任务的主流方法,经典的卷积神经网络从AlexNet、VGG到ResNet,网络层数、参数量和模型大小都不断增加。这也给深度学习模型的落地与应用带来了挑战,将模型部署在实际应用中通常会受到以下几个因素的限制:
· 模型的大小。卷积神经网络强大的特征表达能力源于数以百万计的可训练参数,这些参数与模型结构一起存储在磁盘上,在推理时加载到内存中。例如一个在ImageNet上训练的CNN模型通常会消耗300MB的存储空间,难以部署到嵌入式设备。
· 运行时内存。在推理的过程中,即使batch size为1,CNN的中间激活值/响应的占用内存空间甚至远远超过模型参数的存储空间,这对高性能的GPU不是问题,而其他低算力的硬件却很难承担。
· 计算量。在高分辨率图像上的卷积运算是计算密集的,一个大的卷积神经网络在嵌入式设备上处理单张影像可能需要花费几分钟时间,耗时在实际应用中是难以接受的。
为了解决卷积神经网络模型在部署与落地中的困难,多种深度学习模型的压缩和加速方法被提出,其中模型剪枝、模型量化是常用的手段,本文接下来将对这两种方法做简要的介绍。
02 模型剪枝
2.1 什么是模型剪枝
卷积神经网络中存在着大量冗余的参数,将这些参数除去后不影响模型的表达能力,推理过程也不需要这么多的参数就可以预测出正确的结果,这种情况被称为“过参数化”。模型剪枝就是删除冗余的参数,实现模型“瘦身”的方法。
根据剪枝粒度的不同,可以将剪枝分为如下几个类别:
· 权重级别的剪枝。对神经元进行剪枝,是细粒度最小的剪枝。
· 卷积核级别的剪枝。删除某个卷积核。
· 滤波器级别的剪枝。会引起卷积层输出通道数量的变化。
· 网络层级别的剪枝。删除整个网络层。
其中权重级别的剪枝灵活性最高、能够实现最高的压缩比,但需要特定的软硬件的支持。与此相反,网络层级别的剪枝是最粗粒度的,尽管不需要特定的软硬件实现推理加速,网络层整体被删除也导致这种方法丧失了更多的灵活性。而介于两者之间的滤波器剪枝,取得了灵活性和易实现性的平衡,广泛应用到卷积神经网络的“瘦身”。接下来介绍两种经典的剪枝算法,Network Slimming算法从Batch Normalization层切入,L1-Norm剪枝算法从卷积层切入,对冗余的通道进行剪枝。
2.2 经典的剪枝算法
Network Slimming
在展开Network Slimming剪枝方法之前,首先回顾一下常见的Batch Normalization层,BN层具有加快网络的训练和收敛速度等作用。BN层的计算如下所示,和分别为BN层的输入和输出,为当前的mini-batch,与为输入激活值的均值和标准差,和为可学习的参数。每个通道在BN层的输出与可学习的参数(缩放因子)正相关。若缩放因子越小,则输出的激活值也越小。可以认为在网络中,趋近于0的缩放因子所对应的通道是冗余的,对结果不重要的,是可以将其删除的。然而在正常的训练过程中,BN层的的参数近似符合正态分布,很少有趋于0的参数。稀疏训练解决了这个问题,具体做法给损失函数增加一个正则约束:其中,为训练数据的输入和输出,为可训练的权重,为损失函数,为平衡两项的超参数,函数,即正则约束。
网络经过稀疏训练后,BN层中就会出现近似为0的缩放因子,如下图左图所示,橙色对应的通道是即将被剪枝的通道。通常会预先设定一个百分比阈值,例如70%,对缩放因子进行排序,将排序靠后的缩放因子对应通道删除。
出自参考文献:Learning Efficient Convolutional Networks through Network Slimming
了解BN层进行剪枝的基本原理后,对网络进行剪枝的整体流程为:首先对原始网络进行稀疏训练,使得BN层中存在趋近于0的缩放因子,我们认为对应的通道是不重要的,可以被剪枝的。接着将这些对结果贡献较小的通道删除。由于通道和权重被删除,可能暂时会引起网络性能的下降,通过Fine-tune重新训练模型不仅可以补偿剪枝带来的损失,在一些场景下甚至可以超过原始网络的精度。
L1-Norm Pruning
另一种经典的模型剪枝方法从卷积层切入,对卷积层中滤波器的权重进行排序,删除不重要的卷积核。我们用代指卷积层第个输入通道,为输入特征图的高度和宽度。卷积层会把的输入特征图转换为的输出特征图,并且会作为下一个卷积层的输入特征图。卷积的操作是通过将个的三维滤波器与个输入通道做卷积运算,每个滤波器会生成一个输出的特征图。
出自参考文献:Pruning Filters for Efficient ConvNets该方法从训练好的模型中删除相对不重要的滤波器,衡量滤波器重要性的指标是权重绝对值之和,即L1-norm。该值反映了输出特征图的重要性,具有较小卷积核权重的滤波器倾向于生成激活值较弱的特征图。对卷积神经网络中第个卷积层进行剪枝的步骤如下:
1. 对于每一个滤波器,计算其卷积核权重的绝对值之和。
2. 根据对卷积核进行排序。
3. 删除排序较低的滤波器以及对应的特征图,下一个卷积层对应通道的卷积核同样需要删除。
4. 第和第个卷积层得到新的卷积核矩阵。
03 模型量化
3.1 模型量化基础
深度学习模型通常是以32位浮点数进行计算和存储的,FP32精度具有更高的动态范围。整数运算通常比浮点数运算更快,因此模型量化可以加快推理速度、减少运行时内存。
为需要进行量化的数据的范围(激活范围),表示量化位数,我们需要将数据从映射到,最容易想到的,也是最易实现、运算最快的方法是在这两个范围之间构造一个线性转换,即,或者,前者称为非对称量化,后者称为对称量化,下图展示了非对称量化与对称量化两种方式,对原始数据到int8的转换。有相关研究表明,去掉偏置项不仅能减少计算成本,也不影响精度,因此通常采用对称量化。
非对称量化与对称量化利用线性量化,将激活范围内的真实值,映射到b-bit整型值的实现原理如下。
3.2 量化校准
校准是指为深度学习模型的权重和激活值选择激活范围的过程。在上一节的讨论中,我们选择使用线性的对称量化,因此相应的激活范围是一个对称的范围,即。对于的取值,最容易想到的就是统计需要量化的数据的绝对值最大值,这种方法虽然简单,但存在着一定的问题。
非饱和量化与饱和量化
如上图左图所示,以INT8量化为例,上图左图给出了最值法量化示意图,我们看到由于数据分布不均匀,在的激活范围内,存在没有数据的区域范围,映射到后同样存在“被浪费”的数据范围,我们称之为非饱和量化,有实验表明,非饱和量化会造成很大的精度损失。与之相反的饱和量化如上图右图所示,引入阈值,在范围之外的数据会被直接映射为最小/最大值,这种方法充分利用了量化前后的动态范围,是更优的量化方法。计算激活范围的过程即校准,这就是量化校准如此重要的原因。
除了暴力统计绝对值最大值作为阈值以外,其他常用的校准方法包括百分位法和相对熵的方法。
· 百分位法。校准过程中统计数据绝对值的直方图分布,选定一个百分位数作为阈值。例如选取99%作为百分位数,那么将截取其中最大的1%的数据。
· 相对熵法。相对熵即K-L散度,用于衡量两种分布之间的差异。可以认为量化前的数据为分布,量化后的数据为分布,量化前后的分布均描述相同的信息。因此相对熵法的思想就是选取一个阈值,使得量化前的分布和量化后的分布差异最小。
以ResNet-50网络的layer3校准为例,下图展示了激活值的直方图分布,并且直观地给出了不同校准方法如最值法、百分位法和相对熵法选取阈值的不同。
出自参考文献:Integer Quantization for Deep Learning Inference: Principles and Empirical Evaluation
3.3 后训练量化
上述关于量化的讨论是基于训练完成的模型,在校准数据集上执行推理,计算激活值和权重范围的动态范围,而不涉及训练过程,因此称之为后训练量化。量化感知训练的方法本文不展开叙述。后训练量化的一般流程为:
1. 输入一个训练完成的模型和校准数据集。校准数据集可以是验证集的一部分,用于统计激活值的数据。
2. 收集激活值分布的统计信息。
3. 校准,为网络层的输入张量计算激活范围。
4. 基于校准得到激活范围,对模型进行量化。
5. 将浮点运算转换成整型运算。
04 总结与展望
本文首先阐述了深度学习模型部署与落地遇到的问题与挑战,模型压缩是一种相应的解决方法。接着介绍了模型剪枝的基本概念,以及两种经典的剪枝方法。最后介绍了模型量化的基础,后训练量化的原理。受限于篇幅以及笔者的知识水平,模型压缩领域还有知识蒸馏、量化感知训练等方面内容并未展开。
参考文献
1. Pruning Filters for Efficient ConvNets
2. Learning Efficient Convolutional Networks through Network Slimming
3. Integer Quantization for Deep Learning Inference: Principles and Empirical Evaluation
作者信息:朱宜宣(花名颐轩),硕士,毕业于武汉大学测绘遥感信息工程国家重点实验室,研究方向为遥感AI模型推理加速及模型服务化,曾多次获得过中国大学生计算机设计大赛全国一等奖、省特等奖。
【转载于:AI Earth数知地球】
- 上一篇:联合国气候变化大会历史由来和第27届联合国气候变化大会三大目 2022/11/20
- 下一篇:如果不再下发EC产品,你还会做预报吗? 2022/11/16