专栏算法工具链模型压缩理论简介及剪枝与稀疏化在J5上实践

模型压缩理论简介及剪枝与稀疏化在J5上实践

寻找永不遗憾2024-04-03
565
0

本文主要探索 开源网络剪枝(结构化剪枝与稀疏化置零)技术在地平线 J5上的可行性和有效性,涉及到的压缩方案,均不考虑硬件加速特性。

1. 实验结果先解读

表中涉及到结构化剪枝两种(ABCPruner_2020、HRankPlus_2020)、结构化稀疏两种(CHEX_2022、1XN_2022),从实验数据可以看出:

  • 在分类任务中,在不使用数据增强、蒸馏、嫁接等主流且有效提升精度的方法下,结构化剪枝与稀疏化在精度损失较小的情况下,在J5上均可以提升性能(latency、FPS)。

  • 结构化稀疏比结构化剪枝,精度上表现更好,但性能表现弱于后者。

  • 网络稀疏化应用于轻量型网络结构,如mobilenet,压缩百分比相对较小,精度损失相比resnet较大,侧面说明轻量型网络中冗余结构相对较少。

1.1 分类模型

|Model | Params| FLOPs| 论文Top1| 实测Top1| origin_Top1| quanti_Top1| bin_Top1| latency|FPS|
|- | -| -|-| -| -| -| -| -|-|
|Resnet18-base| 11.69M| 1.82B| 69.66% |69.40% |68.78% |68.63% | | 1.59 |1,476.68|
|ABCPruner-100%|9.5M|0.97B|67.80%|67.42%| 67.90%| 67.76%| |1.39|1753.08|
|CHEX| |1.03B| 69.60%| 69.77%| 69.15%| 69.11%| | 1.24| 2043.30|
|Resnet50-base| 25.56M| 4.14B| 76.01%| 75.43%| 74.96%| 74.86%| |3.26| 636.40|
|ABCPruner-80%| 11.75M| 1.89B| 73.86%| 73.20%| 73.83% |73.79%| |1.75| 1346.1|
|ABCPruner-100%|18.02M| 2.56B| 74.84%| 74.16%| 74.76%| 74.75%| |2.42| 903.31|
|HRankPlus_1(step)|15.09M|2.26B|75.56%| 75.04%| 74.57%| 74.34%| |2.13| 1060.92|
|HRankPlus_2(cos)|11.05M|1.52B| 75.83%| 75.37%| 74.78%| 74.46%| |1.63| 1459.36|
|HRankPlus_3(cos)|11.81M|1.38B| 75.60%| 74.98%| 74.43%| 73.78%| |1.82| 1269.95|
|CHEX_1 | |3.047B|78.00%|77.69%| 77.07%| 76.44%| |2.76| 789.85|
|CHEX_2 | |1.036B| 76.00%| 75.75%| 75.21%| 74.35%| 74.30%| 1.86| 1248.77|
|1xN_1x4| | | 76.51%| 75.96%| 75.48%| 75.33%| |2.2| 1029.34|
|MobileV1_base|| |70.61%||||| 0.92| 3,270.54|
|1xN_1x2| | | 70.28%| 68.49%| 70.14%| 68.8%| | 0.81| 4105.11|
|1xN_kernel_prun| | | 70.76%| 69.48%| 69.46%| 68.3%| | 0.81| 4118.36|
|MobileV2_base| | |72.65% | | | | |0.89| 3,472.89|
|1xN_1x2| | | 70.23%| 69.43%| 69.99%| 69.38%| | 0.8| 4102.7|
|1xN_kernel_prun| | | 71.15%| 70.59%| 69.56%| 68.95%| |0.81| 4042.04|
HRankplus和ABCPruner属于结构化剪枝,1XN和CHEX属于结构化稀疏。
复现的文件:https://pan.baidu.com/s/1zmUqTuxE1k5LIGPpqBq_Sw 32sv

1.2 检测模型

使用稀疏化方法CHEX对SSD_resnet50_300x300方法在coco2017检测数据集上进行实践。

model

论文AP

实测AP

quanti_AP

latency

cpu_latency

bpu_latency

FPS

baseline

25.2

11.94

6.02

5.55

278

CHEX_50%

25.9

25.9

25.5

11.14

6.03

4.73

315

已使用hb_verifier工具验证quanti.onnx和bin模型的输出一致性


模型压缩常用的方案包括量化、蒸馏、紧凑型网络设计以及网络剪枝(稀疏化),下面分别对前三种进行简单的介绍(不感兴趣可跳过),对网络剪枝和稀疏化进行详细的介绍(对应上面的实践结果)。

2. 量化

2.1 概述

将网络参数从 32 位浮点数据映射到更低位数(int16/int8/int4等)的数据,这个过程称之为量化。反之,称之为反量化。
量化本质上是对数值范围的重新调整,可以「粗略」理解为是一种线性映射。(之所以加「粗略」二字,是因为有些论文会用非线性量化(对数量化等),但目前在工业界落地的还都是线性量化(对称量化、非对称量化、二值化等),地平线采用的主要是线性量化中的对称量化。
Description
反量化一般没有信息损失,而量化一般会有精度损失。这是由于float32 能保存的数值范围比 uint8 多,因此必定有大量数值无法用 uint8 表示,只能四舍五入成 uint8 类型的数值,继而引起量化误差。
Description

量化的可行性依据:神经网络具有良好的鲁棒性,将高精度模型量化到低精度模型,这个过程可以认为是引入了噪声,而模型对噪声相对不敏感,因此量化后的模型也能保持较好的精度。

量化的目的:降低计算复杂度,提高模型推理速度,降低存储体积,减少计算能耗。在一些对能耗和时间要求更高的场景下,量化是一个必然的选择。

2.2 浮点/定点转换公式

用 r 表示浮点实数,q 表示量化后的定点整数。浮点和整型之间的换算公式为:
Description
其中,S 是 scale,表示实数和整数之间的比例关系,Z 是 zero point,表示实数中的 0 经过量化后对应的整数,它们的计算方法为:
Description

其中,$r_{min}$ 、$r_{max}$分别是 浮点实数r 的最小值和最大值, $q_{min}$ 、$q_{max}$分别是 定点整数q 的最小值和最大值。

重点解释:定点整数的 zero point 代表浮点实数的 0,二者之间的换算不存在精度损失,这一点可以从公式 (2) 中看出来,把 r=0 代入后就可以得到 q=Z。这么做的目的是为了在 padding 时保证浮点数值的 0 和定点整数的 zero point 完全等价,保证定点和浮点之间的表征能够一致。
对称/非对称量化:当实数中的0量化后对应整数Z也是0时,称之为对称量化,否则,为非对称量化。对称量化相比于非对称量化的精度可能要差一些,但速度会快一些,原因可见公式(7),将公式中的Z置零。

2.3 矩阵运算的量化

卷积网络中的卷积层和全连接层本质上都是一堆矩阵乘法,下面我们来看一看如何将矩阵中的浮点运算转换为定点运算。

假设$ r_1$、$r_2$ 是浮点实数上的两个N×N的矩阵,$r_3$ 是$ r_1$、$r_2$ 相乘后的矩阵,矩阵相乘可表示为:
Description
假设$S_1$、$S_2$ 是$r_1$矩阵对应的 scale 和 zero point,$S_2$ 、$Z_2$ 、$S_3$ 、$Z_3$ 同理,那么由 (5) 式可以推出:
Description
整理一下可以得到:
Description

观察 (7) 式可以发现,除了 $S_1S_2/S_3$ ,其它都是定点整数运算。

那如何把 $S_1S_2/S_3$也变成定点运算呢?

假设$M=S_1S_2/S_3$,由于M通常都是 (0, 1) 之间的实数 (这是通过大量实验统计出来的),因此可以表示成$M=2^{−n}M_0$,其中 $M_0$ 是一个定点实数。注意,定点数并不一定是整数,所谓定点,指的是小数位数是固定的。
因此,如果存在$M=2^{−n}M_0$,我们就可以通过 $M_0$ 的 bit 位移操作实现$2^{−n}M_0$,这样整个矩阵计算过程就都在定点上计算了。

3. 知识蒸馏

知识蒸馏是一种基于"教师—学生网络"的方法,属于迁移学习的一个分支,教师网络通常是精度更高的大网络,学生网络通常是结构相对简单的小网络。
主要思想:在网络训练期间,将教师网络的输出信息作为监督信号(知识、软标签),用于指导学生网络去模仿教师网络学习到的信息,继而达到提升学生网络精度的目的。
Description
依据:举个例子,一张dog的图片,它像cat的概率远高于像car的概率,而仅从label上是无法体现出这一点的,因此需要一些“暗知识”来体现这一点,这个“暗知识”就是教师网络的输出信息。
Description
关于如何转移“暗知识”,就有很多花样了,在这里不去阐述。
知识蒸馏在分类任务中有着非常优秀的表现,在目标检测等复杂任务场景中的应用还需要进一步的探索与实践。

4. 紧凑型网络设计

紧凑型网络设计的原理是不使用传统的计算量较大的卷积方法进行特征提取,而是设计、选用一些计算量更小、特征提取能力较强的特殊卷积方法,例如我们耳熟能详的深度可分离卷积。下面对传统卷积和深度可分离卷积的实现进行分析。
Description
传统卷积通过一次卷积,实现self_channel上和channel之间的特征信息都关注,生成4张特征图;
Description

深度可分离卷积,先通过depthwise conv获取self_channel上的特征信息,再通过pointwise conv获取通道间的特征信息,生成4张特征图。

在特征提取能力大致相同的情况下,深度可分离卷积的实现方式,参数量大幅减少。紧凑型网络结构的设计需要大量实验驱动,以保证设计出的网络结构在不同应用场景下均有着良好的表现。

5. 网络剪枝与稀疏化

5.1 总体介绍

网络剪枝的目的:在保证任务精度的同时,剪枝网络中更多的冗余结构,继而加快模型运行速度。

网络剪枝分为非结构化剪枝和结构化剪枝。非结构化剪枝通过剪枝网络每层的神经元来压缩网络,剪枝某个神经元就是将该神经元的值设置为0,本质上是一种稀疏化的过程。由于其可以通过算法深入到神经元进行剪枝,因此可以获得更高的压缩率。这种方法可以通过稀疏化存储方式减少内存占用,较大程度上压缩网络存储体积,但并没有减少计算量。同时,这种剪枝方式也会导致不规则的内存访问,影响网络的在线推理效率,需要特殊设计的软硬件进行加速。

与之相对应的是结构化网络剪枝。结构化剪枝是一种移除网络中Vector或kernel或filter的剪枝方法,剪枝后的网络可以使用基础线性代数程序库,是一种软硬件友好型剪枝方式。尽管相对于非结构化剪枝而言,结构化剪枝压缩率较低,但结构化剪枝不仅可以降低模型在设备上的内存占用,还可以真正意义上减少网络的计算量,加速模型推理。
Description
网络剪枝所面临的挑战主要包括以下三点:
(1) 缺乏权威的度量标准。“Smaller-Norm-Less-Important(SNLI)”流派,网络剪枝基于某度量标准来判断某个结构是否重要,继而进行剪枝,这个度量标准众说纷纭,例如基于L1范数、矩阵中0的个数、导数、信息熵等等,给研究者们带来无限可能。非SNLI流派认为,不是某个网络结构重要,而是网络每层过滤器的保留率重要。
(2) 需要依赖训练数据。针对不同的任务场景,模型剪枝需要依赖数据,现有的大多数剪枝方法采用迭代剪枝的方式,边训练边剪枝,无法在离开数据的情况下获取剪枝模型。
(3) 耗费大量时间与计算资源。网络剪枝通常采用多阶段优化的迭代裁剪(逐层迭代、端到端迭代),最后将迭代裁剪后的网络进行大量重训练来恢复网络精度,需要消耗大量计算资源。

5.2 filter/channel剪枝发展历程

逐层迭代剪枝过程:
Description
端到端迭代剪枝过程:
Description
终极目的都是为了获取过滤器保留率(or压缩率)。
常规卷积剪枝示意图如下:
Description
注意:某一层filter少了,下一层每个filter中的kernel也会跟着减少。
具有短连接的网络剪枝示意图如下:
Description

其中,$C_2 × C_1×1×1$表示卷积层有$C_2$个过滤器(filter),每个过滤器有$C_1$个卷积核(kernel),$C'$表示压缩后的过滤器(or卷积核)个数。

保留率(or压缩率)的获取方案可以分为:人工设置(HRankPlus)和方案搜索(ABCPruner),下面在典型论文中分别进行介绍。

5.3 HRankPlus

CVPR 2020, Oral

5.3.1 理论知识

灵感来自于一个发现:无论 CNN 接收的图像batch数是多少,由单个滤波器生成的多个特征图的平均秩总是相同的。作者提出一种针对低秩特征图所对应过滤器进行剪枝的算法。

剪枝原理:低秩特征图包含的信息较少。

为什么 秩 可以作为衡量特征图信息丰富度的指标?作者通过两个理论、一个实验来证明。

什么是矩阵的秩(Rank) :一个矩阵可以看作多个列向量的组合,如果一个列向量可以被其它列向量的通过一定的线性运算表达出来,就说这些向量是线性相关的。倘若一组向量相互不能够被表达,那么这组向量就是线性无关。一个矩阵的rank就是最大线性不相关的向量个数。一个矩阵的秩反应了矩阵所拥有的有效信息量,不相关的向量组合可以看作是有效的信息,而相关的向量可以用这些有效的信息来表达,它是冗余的。

理论1:对特征图进行奇异值分解,特征图可以分解为包含大部分信息但比原始特征图的秩小一点的矩阵(秩为$$r^{'}$$的矩阵)和包含小部分额外信息的矩阵。这个过程表明矩阵的秩越高,信息量越大(因为大的可以一直分成小的,所以比小的信息量高)
Description
理论2:无论CNN看到多少数据,单个过滤器生成的feature map的平均秩总是相同的,这表明,只使用输入图像的一小部分就可以准确地估计CNN中特征图的秩,从而达到高效的目的。
Description
  • x轴:某层多个特征图的indices

  • y轴:第几个batch喂入的数据

实验1:
Description
  • HRank:剪low_rank

  • Edge:low_rank和high_rank都剪

  • Random:随机剪

  • Reverse:剪high_rank

5.3.2 剪枝过程

多个输入feature map经过一个filter之后的feature map的平均rank几乎是不变的,这表明输出feature map的秩主要是由filter决定的(由输入feature map和filter共同决定)。这给了作者启发:通过少量输入(feature map)就可以估算一个filter生成的feature map的秩的大小,这极大程度上减少了网络剪枝的计算开销,因为不用去计算更多的输入数据了。生成秩的过程中:batch设置为128,使用5个batch来评估CNN卷积层的秩。
Description
首先,将图像输入模型,生成特征图,获取每个特征图的平均秩并对这些秩进行降序排列。
然后,确定各卷积层过滤器的压缩率:经验设置(vgg是layer-by-layer,resnet是block-by-block)
最后,根据计算得到的秩,从filter中筛选出秩高的保留,从而得到剪枝后的模型,微调。

5.3.3 压缩率对网络结构影响的解读

[0.0]:第一个卷积层filter个数压缩率
[0.24]*3:前三个stage的输出filter个数压缩率,最后一个stage输出filter个数不压缩
[0.7]*7+[0.45]*9:4个stage中[3, 4, 6, 3]个每个block中间层filter个数压缩率
[64, 194, 194, 194, 389, 389, 389, 389, 778, 778, 778, 778, 778, 778, 2048, 2048, 2048]
17=1+3+4+6+3=第一个卷积输出+各个残差块输出
[19, 19, 19, 38, 38, 38, 38, 140, 140, 140, 140, 140, 140, 281, 281, 281]
16= 3+4+6+3=各个残差块中间层输出
剪枝前后模型结构示意图如下:
Description

5.4 ABCPruner

IJCAI 2020

5.4.1 理论知识

目前大多数方法是根据经验规则实现通道剪枝:一类是根据规则决定哪些filter(权重)“重要”。另一类是根据经验决定各层剪枝率。
ABCPruner是一种基于人工蜂群(artifical bee colony)算法的通道剪枝方法。目的是有效地找到最佳的剪枝结构,即每一层中的通道数,而不是选择“重要”的channel(启发于19年ICLR上的Rethinking),对最佳剪枝结构的搜索,公式化为一个优化问题,参考ABC算法以搜索策略解决这个问题(启发于18年CVPR上的Amc),减少人为干扰。

5.4.2 剪枝过程

对于一个有L层卷积的网络,裁剪的可能性方案有$$\prod _{j=1} ^{L} c_j$$,这种可能性方案太多,需要进行限制;
将每层的裁剪方案限制成十个,具体做法:假设该层的filter数目为c,取10%c,20%c,...,100%c 十个数作为该层裁剪的选择空间。总结:将通道组合压缩到一个特定空间。

具体实现过程:

  1. 初始化一个 structure set,set中的每个元素表示每层要保留的通道数目(实际上是初始化多个structure set,每个set代表一种剪枝方案)

  2. 根据这个集合对每层进行随机裁剪

  3. 训练少量epochs,测试精度fitness(减少计算资源消耗)

  4. 然后使用ABC来更新 structure set

  5. 重复 2,3,4

  6. 挑选出最优结构,进行微调

Description
T:表示走多少圈ABC算法
$\alpha$:保留率上限
n:被剪枝网络集合中的网络个数
$t_i$:计数器
M:某个网络结构M次没变,重新初始化它
$C^{'}$:被剪枝网络结构
$fit_{C}$:网络结构C的fitness
Description

从2022年发的一些文章上看,大家倾向于往稀疏化置零上进行探索了。相比于上面介绍的结构化剪枝,稀疏化置零不需要考虑维度匹配的限制,通常精度更高,但需要硬件支持稀疏化。

5.5 1xN Pruning

TPAMI 2022

5.5.1 理论知识

kernel级别剪枝:剪枝filter中的某个kernel
filter级别剪枝:剪枝filter中的所有kernel(该方案也会剪枝掉下一层filter中的对应kernel)
1XN Pruning:剪枝具有相同输入channel index的连续N个输出kernel(如:连续4个filter中的第1个kernel)

5.5.2 剪枝过程

1XN剪枝方法依据L1范数,剪枝粒度介于Kernel Pruning和Filter Pruning之间,下图中N取4进行解释。
Description
关于如何实现该方案,会涉及到过滤器重排,稀疏矩阵编解码等复杂操作,这里不再进行详述。
注意:
  • 该剪枝方案是一种稀疏化的操作,是将某些kernel全部置零,理论上属于结构化剪枝(稀疏),考虑到维度匹配问题,在网络搭建时,无法控制到内部kernel级别,故无法获取剪枝后的网络,需要支持稀疏化的硬件才能加速。

5.6 CHEX

CVPR 2022

5.6.1 剪枝过程

在整个训练过程中,通过定期prune channels和regrow channels,降低过早修剪“重要”通道的风险。
Description
  1. 原始模型:Conv-6-8-10,随机初始化子模型结构

  2. Channel pruning stage:根据目标稀疏度,剪枝不重要的channel,每一层的通道数会在这一步使用“sub-model structure exploration technique”进行重新生成,例如,图中step1中的conv-3-4-5,step2中的Conv-2-3-7。

  3. Channel regrowing stage:每一次pruning后,会regrow之前剪枝掉的一部分channel,这些恢复的channel weight,会使用被剪枝前最近一次的weight。

  4. 每进行一次2. 3两步(成对出现),会训练一些epoch,这个过程重复N次,得到剪枝后的网络。

Description

5.6.2 轻量型网络剪枝结果

论文中提供的在轻量型网络上的剪枝效果。
Description

注意:

  • 该剪枝方案是一种稀疏化的操作,虽然是将某filter权重全部置零,理论上属于结构化剪枝,但由于剪枝通道位置是不定的,每一层剪枝率也不定,特别是对于具有shortcut的网络,无法获取剪枝后的网络,因此只能是结构化稀疏置零,故需要支持稀疏化的硬件才能加速。

6. 模型转换与测试性能

6.1 模型转换

大家可以这篇文章进行模型转换(毕竟要做精度评测,校准数据要准备好):https://developer.horizon.cc/forumDetail/118363912788935513

6.2 性能评测

  • latency单核单线程

  • FPS双核多线程

7. 总结与思考

  1. 结构化压缩方案(包括结构化剪枝和稀疏化置零)在地平线J5 上均可以实现加速。

  2. 未来地平线会支持稀疏化训练吗?会有标准的参考文档进行介绍吗?期待中~

8. 参考链接

算法工具链
社区征文前沿技术技术深度解析
+3
评论0
0/1000