ICML 2023 | 苹果提出:无约束通道剪枝,剪枝的同时提升精度!
点击下方卡片,关注“CVer”公众号
AI/CV重磅干货,第一时间送达
AI/CV重磅干货,第一时间送达
作者:岳廷(源:知乎,已授权)| 编辑:CVer
https://zhuanlan.zhihu.com/p/665510545
在CVer微信公众号后台回复:苹果剪枝,可以下载本论文pdf、代码,学起来!
paper:https://arxiv.org/pdf/2307.08771
code:https://github.com/apple/ml-upscale
摘要
随着神经网络规模和复杂度的增长,推理速度在下降。为了应对这一点,通道剪枝这样的压缩技术通过删除权重的通道来删除参数。但是,对于模型的多分支段来说,删除通道可能会引入推理时的内存复制操作。这反过来会增加推理延迟,以至于剪枝后的模型比未剪枝的模型慢。为了应对这一点,剪枝方法通常会约束某些通道一起剪枝。这可以完全消除内存复制,但如本文所示,它大大降低了精度。作为变通方法,本文的思路是在导出时重新排序通道,以减少内存复制并提高精度。基于这一思路,本文设计了一个通用算法UPSCALE,可以剪枝具有任意剪枝模式的模型。通过消除约束,本文将ImageNet精度提高2.1个点。进一步地,通过重新排序通道,与基准相比,UPSCALE将推理速度提高了2倍。本文的工作为更广泛的剪枝算法打开了大门。
1、Introduction
深度神经网络模型对越来越多的实际应用来说是必不可少的,但是与此同时神经网络架构也在逐年增长规模和复杂度。这对具有推理时间约束的许多使用场景来说成为一个大问题,这使得模型压缩技术变得必要。
通道剪枝是最有效的模型压缩方法家族之一,它通过删除卷积或全连接权重的整个通道来减少推理时延迟。尽管其效果显著,但是通道删除过程本身在多分支网络段并不简单,且常被忽视。这导致两种不可取的通道剪枝选择:1) 按照约定增加约束,结果是会降低精度;2) 消除约束,但会增加推理延迟。
首先,没有约束时,导出网络的多分支段尤其复杂。在这些段中,不同分支的层可能都使用相同的输入特征图,并同时剪枝不同的通道。这会导致不兼容的维度,更重要的是,在推理时网络必须执行内存复制以确保张量在内存中是连续的。这些内存复制非常耗费延迟,以至于剪枝后的模型可能比未剪枝的模型更慢(图2)。
其次,为了应对这一点,早期工作通过建立约定来增加约束,具体是约束段的所有分支剪枝相同的通道。这些约束简化了导出,因此现代剪枝工作更关注剪枝哪些通道,而不是如何在导出时删除它们。尽管在结构化剪枝方面取得了显著进步,但这些约束降低了精度。直观地,约束限制了可能的剪枝模式集合,限制了剪枝的有效性(图3)。
为了解决这个问题,本文有两个思路:1) 重排序通道可以使张量的子集保持连续;2) 张量的连续切片“免费”使用,不需要内存复制。简而言之,这允许本文放弃常规的剪枝约束以获得更高的精度。此外,通过消除内存复制,这允许精度收益以较小的延迟代价获得。
这些思路产生了一个通用的导出算法“UPSCALE”,它可以剪枝具有任意剪枝模式的模型。这支持更广泛的剪枝算法类,因为它使未约束剪枝的模型延迟更加适中,在某些情况下几乎完全消除冗余内存复制。本工作做出以下三点贡献:
比较不同约束对精度的影响,涵盖各种剪枝启发式方法、架构和稀疏度水平。不受约束的剪枝提高了ImageNet的后训练剪枝精度,平均提高2.1个点。
一个通用的导出工具UPSCALE,与基准相比将推理时间提高2倍以上。这个可插拔工具使未来研究人员可以抽象出导出问题。据本文所知,本文是第一个开发可以支持不受约束剪枝模式的导出工具的。
将内存复制最大化抽象为图形,这可能为进一步的延迟优化打开新的方向。
2、Related Work
结构化与非结构化剪枝。现有的剪枝工作可以分为非结构化方法和结构化方法。非结构化方法通过阈值和零化单个权重值,而结构化方法在不同粒度层面施加稀疏模式来进行结构约束,从剪枝成块到删除整个通道。后者称为通道剪枝,其优势不依赖于定制稀疏矩阵原语。其优势来自于在导出时删除卷积权重通道,以减少推理时的资源消耗。
通道剪枝策略。除了其独特的优势外,通道剪枝还引入了一个独特的挑战:复杂拓扑的通道删除尤其困难,特别是当网络的多个分支使用或生成共享张量时。为了应对这一点,先前的工作增加约束,限制网络复杂部分的可能剪枝模式。大多数结构化剪枝工作关注剪枝的其他方面,而不是导出,包括剪枝的启发式方法、量化粒度、掩码学习技术等。值得注意的是,这些工作忽视了两个导出相关的挑战:1)大多数工作在训练时使用零一掩码来模拟剪枝,而不会最终删除通道;这意味着多分支段的导出挑战从未出现。2)大多数工作用FLOPs作为延迟的代理;这意味着如果这些工作删除约束,内存复制的延迟影响从未被发现。这两种做法组合起来,隐藏了导出相关的挑战。为了补救这一点,本文直接研究导出,以允许更广泛的剪枝算法类,展示现有的剪枝启发式方法可以通过简单地消除这些约束来获得更高的精度。
3、Method
先前的研究主要关注剪枝策略,这些策略在训练期间通过“零化”通道来模拟剪枝模式。本文的工作与这一研究方向无关,而是专注于如何导出无限制的剪枝模式。
卷积核中的输入通道和输出通道都可以被剪枝;剪枝前者称为“输入剪枝”(即将剪枝掩码放在卷积层之前),剪枝后者称为“输出剪枝”(即将剪枝掩码放在卷积层之后)。为了方便起见,本文将重点放在无限制的输入剪枝上,不失一般性地,可以参考附录F中的明确描述来了解无限制的输出剪枝。本文还经验性地观察到,输入剪枝通常优于输出剪枝(图A.15,A.16),这激发了本文对输入剪枝的关注。
请注意,在本方法部分中,本文明确指定“卷积”以便于理解。然而,本文的算法可推广到任何输入通道数量独立于输出通道数量的操作,例如全连接层。
3.1 Step 1 - Reduce to a Segment
本文的算法将网络架构划分为多个段(segments)(图4中的步骤1),非正式地说,是一组可以独立于网络的其余部分进行剪枝的层。一个段包括(a)产生输出的卷积层,称为“producers”,以及(b)消耗这些张量的卷积层,称为“consumers”。
为了确定segments,从任意一个producers开始。找到该producers的所有consumers,然后找到这些consumers的所有producers。重复迭代,直到两个集合都收敛。详见算法1的更准确的公式表述。
例如,在图4(步骤1)中,从producersA开始。找到A的consumers:{B,D}。找到它们的producers:{A,C}。找到它们的consumers:{B,D}。注意到本文的consumers集合已经收敛,因此本文的段已经完成。现在,这个segments可以独立于网络的其余部分进行剪枝,将剪枝网络的问题简化为剪枝单个segments的问题。
3.2. Why Memory Copies Occur
简而言之,当consumers剪枝不同的通道时,会出现内存复制。为了解决这个问题,先前的方法只是将所有consumers约束为剪枝相同的通道,如图2中的“Constrained”。由于两个consumers都被约束为剪枝相同的通道,因此导出实现是微不足道的:只需删除所有consumers剪枝的producers输出通道即可。
然而,现在考虑图2中的无约束情况:“Inefficient”。假设consumers II剪枝的通道consumers III没有剪枝。在导出时,无法删除II剪枝的通道,因为III仍然需要它。相反,在推理期间,本文会选择producers的输出 - 将II所需的每个未剪枝的通道复制到一个新的张量中 - 然后将其传递给II。这种方法是导出无约束剪枝模型的基准方法。不幸的是,基准方法中的内存复制会在推理时间产生显著的延迟成本,以至于这个剪枝模型的延迟比原始未剪枝模型更高(图7)。
本文的关键见解是连续的切片是“免费的”。换句话说,每个consumers取输入张量的一个切片,而不是将通道复制到一个新的张量中。因此,本文设计了一个算法,可以重新排序producers的输出通道和consumers的输入通道(图2,“Ours”,第3.6节)。现在本文将讨论如何计算这个重新排序。
3.3 Formulate as a Graph
为了简化说明,本文将在接下来的内容中研究consumers保留的通道,而不是它剪枝的通道。
为了规范化本文的目标,将本文的约束条件形式化为一个无向图(图4,第2步):本文图中的每个节点代表一个consumers保留的通道集。如果两个节点共享一个或多个保留的通道,则它们之间共享一个无向边。每个节点的奖励是保留的通道数,每个边的奖励是共享保留通道数的负数。本文很快就会解释为什么要这样做。有了这个图,可以将内存复制最大化目标规范化。
目标是找到一条路径 - 或者换句话说,一个节点序列:由于每个节点都是一个consumers,节点的序列表示一系列consumers。反过来,每个consumers序列都有一个零复制的通道顺序。例如,假设本文有两个consumers,节点序列为A、B。零复制通道顺序可以通过:首先排序仅由A保留的通道,然后是A和B共享的通道,最后是仅由B保留的通道。这种顺序可以确保零内存复制,因为A和B的输入已经在内存中是连续的。本文可以无限期地为任意数量的consumers继续这个过程,只要consumers按顺序排列即可。总之,路径可以转化为零复制的通道顺序。更多例子可以参见附录B。
目标是找到一个无环路径:假设路径中的第一个和最后一个节点共享通道。现在,问题在于:将共享通道放在通道顺序的开头还是结尾?无论哪种方式,至少一个consumers的输入都将在内存中非连续分布。更一般地,序列中的非相邻consumers不能共享通道。换句话说,没有两个不相邻的节点可以共享一条边 - 或者更简洁地说,路径必须是无环的;否则,在推理期间将需要为共享通道引入额外的内存复制。
目标是找到最大奖励的无环路径:如前所述,路径中的所有通道都需要零复制,因此为了最小化内存复制,本文需要最大化路径中包含的通道数。之前本文定义了节点和边的奖励,使得路径奖励等于路径中包含的通道数。因此,最终最大化包含通道数就是最大化路径奖励。
本文最终的正式目标是找到最大奖励的无环路径(maximum reward acyclic path)。关于如何通过这样做来最小化内存复制的端到端示例,请参见附录C或图A.10。
3.4. How to Find Maximum Reward Acyclic Path
本文首先计算最大奖励路径的奖励,简称为“mrp”。为了计算图 G 的 MRP(G) 奖励,本文遍历所有节点 s ∈ G,并计算从节点 s 开始的最大奖励路径的奖励 f(s)。
现在本文的目标是定义 f(s)。为此,考虑节点 s 的所有邻居:n ∈ A[s],其中 A 是邻接矩阵。直观地说,mrp 的奖励 f(s) 是所有邻居节点 f(n) : n ∈ A[s] 的最大奖励路径的最大奖励 (a),以及到其邻居节点的奖励 Re[s, n],其中 Re 是边缘奖励矩阵,表示共享通道的数量。这可以用以下递归关系总结:
其中 Rn 是节点奖励矩阵,表示consumers保留的通道数量。这可以找到最大奖励路径,但它不能处理无环约束。请注意,mrp 路径 p 是通过动态规划优化目标(即方程式1)获得的节点序列。
处理无环约束:将最大奖励无环路径缩写为“mrap”。为了处理无环约束,定义一个节点集 I,其中包括所有无效节点。无效节点包括 (a) 已经遍历的节点,包括当前路径中的节点,以及 (b) 邻近路径的节点,即与路径中的节点共享边缘的节点。如果从不遍历邻近路径的节点,则路径保证是无环的。重新定义子问题为 f(s,I),即从源节点 s 开始且不包括节点 I 的 mrap 的奖励。
然后可以修改原始目标为以下目标。初始无效集 I 是路径中唯一的节点,即 {s}。
然后修改递归关系为以下关系。为方便起见,将仅从 s 到 n 而避免无效集 I 的旅行的定义因子 g(s, n, I) 提取出来。
简而言之,方程式 4 在考虑要遍历的邻居节点时排除所有无效节点。在考虑每个邻居节点时,通过添加邻居节点本身 {n} 和源节点的邻居 A[s] 来扩展无效集 I。
3.5. Step 3 - Compute Channel Order From Graph
注意,最大奖励无环路径 p 可以通过动态规划解决优化问题(即方程式 3)得到,表示为 p ← MRAP(G)。此外,mrap 路径 p 可能不包含所有节点,例如,如果所有节点都在一个环中。因此,继续在剩余节点 MRAP(G-p) 上寻找路径,直到没有更多节点为止。
在前一步骤中找到路径然后被转换为最终的通道顺序。如第 3.3 节和图 4(情况 2)所示,假设有两个consumers A、B。排序通道仅由 A 保留,然后通道由 A 和 B 共享,然后通道仅由 B 保留。例如,如果 A 保留 1、3,B 保留 2、3,则先排序A 的专有通道(1),然后是共享通道(3),最后是 B 的专有通道(2),生成最终顺序:1、3、2。
更一般地,将 mrap 路径中的排序节点表示为 p = [n1,n2,n3,...]。首先取所有仅由第一个节点保留的通道,将其表示为 n˜1。第一个节点只应与第二个节点共享通道,因此这等价于计算集合减法:
更一般地,将“唯一”于节点 i 的通道表示为 n˜i。第 i 个节点只应与前 ni-1 和后 ni+1 个节点共享通道,因此取差集以查找所有“唯一”于节点 ni 的通道。
然后,取第一个和第二个节点共享的所有通道,n1 ∩ n2。然后,取第二个节点的“唯一”通道 n˜2。然后,取第二个和第三个节点共享的通道,n2 ∩ n3。对于路径中的所有节点,继续这样做。总排序如下所示:
当路径耗尽时,继续使用以下路径中的节点排序。一旦所有路径耗尽,排序就完成了。此通道排序在 Algorithm 1 中被总结为一个置换矩阵 Π。请参见图 4(步骤 3)或图 A.11 的示例。
3.6. Step 4 - Reorder Weights
然后,使用上一步中的通道排序对producers和consumers中的通道进行重新排序。首先,通道顺序直接决定了该段中所有producers的输出通道顺序。更正式地,对于模型权重 W 和producers索引 pi 的列表,本文将通道重新排序表示为 W[pi]Π。其次,对于每个consumers,相应地重新排序consumers的输入通道(即W[ci]Π)。请参阅算法 1 中的完整算法、附录 G 中的说明或图 4 中的示例(步骤 4)。
3.7. Generalized Method
一些节点是其他节点的子集。例如,consumersA保留1,2,3;consumersB保留1、2;consumersC保留2、3。A是父节点,B、C 是子节点。尽管A、B、C形式本文图中的一个循环,可以实现零内存复制适应所有三个consumers的解决方案。简单地将通道排序为 1、2、3。这与本文的非循环路径相矛盾要求。为了解决这个问题,引入两个修改:(1)拒绝循环时忽略父子边路径,以及 (2) 如果路径中的子节点包含所有父节点节点通道,然后将父节点的奖励添加到路径的奖励。有关此子集的扩展描述案例及其解决方案,参见附录 D。
多个producers。上面的算法假设有只有一个producer。为了处理多个producers,发现哪些渠道在各个producers之间是相互对应的。假设producers A 和 B 的输出简单相加。在这个在这种情况下,A 的通道 1 相当于 B 的通道 1。A 的通道 2 相当于 B 的通道 2,所以等等。知道了这一点,可以简化为单个producers案例,作为 A 的过滤器自动排序提供 B 的过滤器的排序。
然后运行本文的方法,假设卷积 A 是唯一的producer。之后,当重新排序producers的权重时(即步骤 4),通过上述提到的同等通过映射 Πi,将原始排列 Π 映射为每个producers。然后按 W[pi 排序权重]ΠiΠ。为了更多详细描述和示例参见附录E。
实验
本文进行了大量的实验来表明,相比于有约束剪枝,无约束剪枝可以显着提高准确率,特别是对于较大的和具有复杂拓扑的模型。对于这些无约束剪枝模型,本文证明UPSCALE 在推理时间上优于基线导出的延迟 - 事实上,在没有 UPSCALE 的情况下,剪枝后的模型延迟实际上增加了,这使得 UPSCALE 成为必要导出方法。先前所有的方法都利用约束剪枝,在本文的实验中,消除了这些限制,取而代之的是使用 UPSCALE 导出。
对于训练后设置,无约束剪枝相比有约束剪枝将 ImageNet top-1 准确率提高高达 76.7%。本文的目标是评估从有约束切换到无约束剪枝时的精度影响。为了简单起见,本文使用以前用于有约束剪枝的剪枝算法,通过删除零一掩码,来实现无约束剪枝。评估效果受约束或无约束剪枝,本文进行实验时没有微调,使用训练后剪枝:(1)采用模型在 ImageNet 上进行预训练,(2) 应用各种剪枝启发式方法使用不同的稀疏度级别进行训练, (3) 查看 ImageNet top-1验证准确性。本文以间隔稀疏参数2.5% 从 0% 到 100% 并测试 5 种剪枝策略15+ 架构。
虽然这些剪枝策略是为有约束剪枝而设计的,但本文发现在所有设置中,无约束剪枝实现的精度与有约束剪枝相当或更好,平均获得了 2.1 个百分点的更优。对于一些情况,特别是对于复杂的拓扑结构和较大的模型(图 3),无约束剪枝可以获得显著的精度提升,ImageNet 精度平均提高了 21.7 个百分点(DenseNet121,L1),在所有稀疏度水平上平均提高,或在特定稀疏度水平上提高了高达 76.7 个百分点(EfficientNetV2-Small,LAMP,12.5%)。这说明无约束剪枝在适当的情况下可以提供额外的好处。本文在图 6 中总结了结果,并在图 A.22 和图 A.23 中报告了完整的结果。附录 A 中的微调初步结果也显示了相当大的(5 个百分点)精度差距。
相对于无约束剪枝模式的基准导出,使用 UPSCALE 导出剪枝模型的延迟可以提高高达 52.8%。这个基准在第 3.2 节中有描述。为了独立评估本文的重排序算法的有效性,本文采取以下步骤:(1)对在 ImageNet 上预训练的模型进行训练后剪枝;(2)导出带有和不带有 UPSCALE 的未受限制剪枝模型;(3)对导出的模型的延迟进行基准测试。UPSCALE 可以平均减少所有设置的导出模型的延迟达 8.6%,并在所有稀疏度水平上获得显著的延迟优势,最高可达到 24.9%(SqueezeNet1-1,L1),平均值为所有稀疏度水平(ResNet18,FPGM)达到 52.8% 的延迟降低。需要注意的是,导出未受限制的剪枝模型而没有使用 UPSCALE 实际上会增加延迟,相对于原始的未剪枝模型来说;在相同的设置中,UPSCALE 能够实现更适当的延迟降低。
本文在图 7 和图 3 中总结了结果,并在图 A.24 中报告了完整的结果。需要注意的是,本文的算法中没有可以控制性能的超参数,因此本文在所有模型上均匀地运行本文的算法以获得这种性能。本文还绘制了理论上的零内存复制解决方案的延迟,说明任何未受限制的剪枝导出所能达到的最大延迟降低;本文观察到 UPSCALE 常常表现得近乎最优,延迟几乎与零内存复制延迟相匹配。
设置。本文使用一张 V100 GPU,配备 32 GB RAM。为了计时导出模型,本文在提供的模型上运行现有的剪枝策略,使用 UPSCALE 进行导出,然后使用 PyTorch 的 jit trace 生成一个不含 Python 的可执行文件。然后,使用 PyTorch 内置的分析工具对这个跟踪模型进行基准测试,包括 CUDA “activities” 和跟踪张量内存分配。需要注意的是,该工具会自动处理预热,例如在启动定时运行之前运行多个正向传递。本文所有的延迟测量是 100 次运行的总和,并报告平均值和标准差。所有的精度都是在 ImageNet ILSVRC 2015(Russakovsky 等人,2015)验证数据集上报告的。
结论
本文引入了无限制通道剪枝导出(UPSCALE)来更通用地支持剪枝导出;UPSCALE 可以直接应对剪枝现代神经网络的主要挑战:即内存和延迟效率问题。此外,本文提出了一个框架和一个近似解决方案,以减少推理时的内存复制,从而减轻效率低下的问题。最终结果是一个通用的剪枝导出库,扩大了现有和新的剪枝算法可操作的范围,允许导出任何剪枝模式,并使得无限制剪枝成为传统受限制剪枝的有力竞争对手。
在CVer微信公众号后台回复:苹果剪枝,可以下载本论文pdf、代码,学起来!
后台回复:CVPR2023,即可下载CVPR 2023论文和代码开源的论文合集
后台回复:ICCV2023,即可下载ICCV 2023论文和代码开源的论文合集
模型剪枝和Transformer交流群成立
扫描下方二维码,或者添加微信:CVer444,即可添加CVer小助手微信,便可申请加入CVer-模型剪枝或者Transformer微信交流群。另外其他垂直方向已涵盖:目标检测、图像分割、目标跟踪、人脸检测&识别、OCR、姿态估计、超分辨率、SLAM、医疗影像、Re-ID、GAN、NAS、深度估计、自动驾驶、强化学习、车道线检测、模型剪枝&压缩、去噪、去雾、去雨、风格迁移、遥感图像、行为识别、视频理解、图像融合、图像检索、论文投稿&交流、PyTorch、TensorFlow和Transformer、NeRF等。
一定要备注:研究方向+地点+学校/公司+昵称(如模型剪枝或者Transformer+上海+上交+卡卡),根据格式备注,可更快被通过且邀请进群
▲扫码或加微信号: CVer444,进交流群
CVer计算机视觉(知识星球)来了!想要了解最新最快最好的CV/DL/AI论文速递、优质实战项目、AI行业前沿、从入门到精通学习教程等资料,欢迎扫描下方二维码,加入CVer计算机视觉(知识星球),已汇集近万人!
▲扫码加入星球学习
▲点击上方卡片,关注CVer公众号
整理不易,请点赞和在看
▲扫码或加微信号: CVer444,进交流群
CVer计算机视觉(知识星球)来了!想要了解最新最快最好的CV/DL/AI论文速递、优质实战项目、AI行业前沿、从入门到精通学习教程等资料,欢迎扫描下方二维码,加入CVer计算机视觉(知识星球),已汇集近万人!
▲扫码加入星球学习
整理不易,请点赞和在看▲点击上方卡片,关注CVer公众号
微信扫码关注该文公众号作者