随着深度神经网络(DNN)的规模不断增长以提高准确性并解决更复杂的问题,其能耗也会随之扩大。权重剪枝通过删除多余权重来减少DNN模型的大小和计算量。但是,我们在各种硬件平台上对几个流行的网络实施了权重剪枝,并观察到令人惊讶的结果。对于许多网络,尽管模型尺寸大大减小并且需要进行多次累加操作,但由于权重剪枝导致的网络稀疏实际上会损害整体性能。同样,对剪枝后的网络的稀疏格式进行编码会导致额外的存储空间开销。为了克服这些挑战,我们建议使用Scalpel,它通过将剪枝后的网络结构与数据并行硬件组织进行匹配来对基础硬件定制DNN剪枝。 Scalpel包含两种技术:可感知SIMD的权重剪枝和节点剪枝。对于低并行度的硬件(例如,微控制器),支持SIMD的权重剪枝将权重保持在对齐的固定大小组中,以充分利用SIMD单元。对于高并行度的硬件(例如GPU),节点剪枝会删除冗余节点而不是冗余权重,从而在不牺牲密集矩阵格式的情况下减少了计算量。对于具有中等并行度的硬件(例如台式机CPU),可将SIMD感知的权重剪枝和节点剪枝协同应用。在微控制器,CPU和GPU上,Scalpel的平均速度提高了3.54倍,2.61倍和1.25倍,同时模型尺寸减小了88%,82%和53%。相比之下,传统的重量剪枝在这三个平台上的平均速度提高了1.90倍,1.06倍和0.41倍。
深度神经网络(DNN)在包括计算机视觉[15],自然语言处理[11]和语音识别[4]在内的各种应用领域中已经无处不在。最近的证据表明,网络深度至关重要[22,38]。具有更多参数的更深层次的模型极大地提高了DNN的准确性。 1990年代的先驱网络使用少于1M的参数来对手写数字进行分类[32]。二十年后,AlexNet [29]和VGG [38]分别采用61M和138M参数对1000个ImageNet图像类别进行分类。具有大量内部冗余的大型DNN模型可以实现高精度,但要付出大量计算和能源需求的代价。权重剪枝通过删除DNN模型的内部冗余来压缩它们。一种这样的方法,深度压缩[19,20],将AlexNet和VGG-16中的权重数量分别减少了9倍和13倍。压缩网络在CPU和GPU上均达到3-4倍的逐层加速。为了更深入地研究重量剪枝,我们重新实现了深度压缩,并测量了三个硬件平台(ARM Cortex-M4微控制器,英特尔酷睿i7-6700 CPU,NVIDIA GTX Titan X GPU)上五个流行网络的性能。我们发现了令人惊讶的结果。对于8/15配置,权重剪枝后的网络性能实际上比剪枝前差。尽管平均减少了80%的权重,但剪枝会损害性能。例如,即使删除了89%的权重,AlexNet在CPU上的执行时间也增加了25%。对于其余的配置,通过剪枝权重可以观察到性能提升,但是性能提升远远落后于乘积(MAC)操作的实际降低。例如,权重剪枝可以删除LeNet-5中的76%的MAC操作[32],但是微控制器上的执行时间仅减少了16%。对于经过测试的硬件,在GPU上始终观察到性能下降,而在微控制器上观察到适度的性能提升。 CPU产生的结果好坏参半,有些网络获得了收益,而另一些网络则造成了损失。
为了理解这些与直觉相反的结果,我们需要更深入地研究权重剪枝以及网络的结构以及两者与底层硬件的相互作用。 DNN由两种类型的层组成:完全连接层和卷积层。它们分别执行矩阵向量乘法和矩阵矩阵乘法。权重剪枝技术[19、21、31]测量每个权重的重要性,并删除那些不重要的权重,从而导致内存存储量和计算量减少。剪枝权重后,将删除冗余权重和相关的MAC操作。剪枝后的网络中的矩阵计算变得稀疏,因此剩余的权重以稀疏矩阵格式存储。剪枝后的网络的稀疏性通常会导致DNN计算的性能下降。稀疏的权矩阵失去了稠密矩阵的规则结构,并且稀疏矩阵乘法需要额外的计算才能解码稀疏格式。权重剪枝对性能的影响在很大程度上与底层硬件交织在一起。在微控制器上,权重剪枝始终可以提高DNN性能。微控制器的简单架构无法隐藏内存访问延迟。因此,模型尺寸的减小可以弥补稀疏矩阵乘法的计算效率低下的问题。但是,执行时间的减少仍然远远少于计算的减少。对于GPU,权重剪枝始终会降低性能。稀疏矩阵计算无法充分利用受支持的硬件,例如内存合并。同样,密集矩阵优化(如矩阵平铺)效果较差。对于CPU,权重剪枝的效果因不同的网络而异,并且取决于完全连接层和卷积层之间的计算分解。对于完全连接的层,权重剪枝可以提高性能,因为总内存占用量对于矩阵矢量乘法至关重要。但是对于执行矩阵矩阵乘法的卷积层,矩阵数据将被多次重用,并且减少内存占用的好处有限。因此,稀疏矩阵格式固有的效率低下将损害CPU上卷积层的性能。除性能下降外,权重剪枝的另一个挑战是需要大量数据来记录稀疏矩阵结构。每个非零权重都需要一个额外的列索引来记录其位置。这种额外的开销减少了权重剪枝在所有硬件平台上的影响。
为了解决这些挑战,我们建议Scalpel将DNN剪枝定制为基础的数据并行硬件结构。 Scalpel包含两种方法:SIMD感知的权重剪枝和节点剪枝。它创建了可以在目标硬件平台上有效执行的剪枝后的网络。对于微控制器等并行度较低的硬件,SIMD感知的权重剪枝会删除多余的权重,但会将其余权重归为一组。将所有组的大小调整为SIMD宽度,从而通过确保充分利用SIMD单元来提高性能。由于相同组中的权重可以共享相同的列索引,因此还可以减少剩余的模型大小。对于具有高度并行性的硬件(例如GPU),节点剪枝通过使用掩码层动态查找和删除不重要的节点来删除DNN中的冗余节点。删除节点可保持权重矩阵的密集格式,因此计算不会受到传统权重剪枝方法所造成的稀疏性的影响。对于具有中等并行度的硬件平台(例如台式机CPU),可以将SIMD感知的权重剪枝和节点剪枝进行协同组合并一起应用,以减少执行时间和模型尺寸。与原始模型相比,Scalpel生成的剪枝后的DNN模型不会损失预测准确性。
本文做出了以下贡献:
深度神经网络(DNN)通常包含大量的冗余权重。 带有重新训练的权重剪枝可以安全地去除那些多余的权重,而不会降低预测精度
所有DNN的基本组成部分都是神经元。神经元将其加权输入和偏差值结合起来,以确定通过激活函数进行的输出激活。 DNN将卷积(CONV)层和完全连接(FC)层集成到端到端多层网络中[22]。图1显示了用于图像分类的典型DNN。它包括两个CONV层,然后是两个FC层。在FC层中,所有输入值都连接到每个神经元。对于CONV图层,如图1所示,它们由一堆名为特征图的2D矩阵组成。在输入要素图和权重之间执行卷积运算以生成输出。 FC层执行矩阵矢量乘法,而CONV层执行矩阵矩阵乘法。每层的权重可以分为权重矩阵。对于FC层,输入值存储在1D向量(输入向量)中。然后,可以将权重矩阵与输入向量相乘以生成也是1D向量的输出。对于每个CONV层,其输入实际上是3D阵列。图像到列(im2col)函数将3D数组重新排列为2D矩阵(输入矩阵)。然后,权重矩阵将与输入矩阵相乘以生成输出矩阵,可以将其转换回下一层的3D阵列。
权重剪枝可以大大减少DNN模型的大小和MAC操作的数量。但是,传统的DNN剪枝技术存在一些挑战。
第一个挑战是稀疏权矩阵花费太多额外数据来记录稀疏矩阵格式。例如,如图2(C)所示,压缩稀疏行(CSR)格式使用三个1-D数组(A,IA,JA)存储m×n矩阵W。A保留所有非零值。 IA将索引记录到W的每一行中第一个非零元素的A中。JA存储非零元素的列索引。由于索引数组JA与数据数组A具有相同的大小,因此CSR格式的数据中有一半以上用于存储稀疏矩阵格式。
第二个挑战是权重剪枝会损害DNN的计算性能。图3显示了相对于原始DNN模型,通过深度压缩中的权重剪枝方法剪枝的网络模型的相对执行时间,模型大小和MAC操作。前三个栏显示了微控制器,CPU和GPU上的相对执行时间。如图所示,相对执行时间比相对模型大小和MAC操作要高得多。权重剪枝会损害LeNet-5(在GPU上),ConvNet,NIN和AlexNet的性能,这会导致这些网络的执行时间增加。我们生成了CPU上密集型和稀疏DNN模型的执行时间的细分,如图4所示。稀疏网络的预期执行时间(预期)显示了剩余的相对MAC操作,而忽略了MAC的开销。稀疏存储实现。相对于未剪枝的基线(密集),显示执行时间。传统的权重剪枝大大减少了FC层的实际执行时间,这与之前的工作[19]中显示的结果相似。对于FC和CONV层,剪枝后的网络的实际执行时间与期望值之间存在很大的差距。性能提升明显落后于MAC操作的减少。
最后,权重剪枝对CONV层无效,导致ConvNet,NIN和AlextNet的执行时间大大增加。实际执行时间与预期执行时间之间会出现间隔,因为稀疏权重矩阵失去了密集对等矩阵的规则结构。例如,在密集矩阵中,所有行的大小均相同,而对于稀疏矩阵则不适用。假设稀疏权重矩阵以CSR格式存储。为了执行稀疏矩阵矢量乘法,如图2中的虚线所示,对于存储在数组A中的每个非零权重,我们首先需要从JA加载相应的列索引,然后使用该索引从输入矢量加载输入值。输入值的这种索引需要其他计算和内存访问。
更糟糕的是,由于稀疏矩阵失去规则结构,因此许多适用于稠密矩阵的优化例如矩阵平铺,无法应用。对于CPU计算,FC层受这些原因的影响不那么大,因为与CONV层相比,它们具有低得多的计算/内存访问比。为了更详细地了解剪枝对内存访问行为的影响,我们考虑第二层(conv2)来自AlexNet的代表层。由于该层是CONV层,因此它执行矩阵矩阵乘法。图5显示了此层的缓存访问和缓存未命中数,这些数据按加载和存储进行了细分。
我们测量了三种情况:原始密集层(Dense),稀疏层,其中80%(Sparse-0.80)和60%(Sparse-0.60)的权重已删除。我们使用Callgrind分析计算。稀疏-0.60表示该层的实际剪枝率,而稀疏-0.80表示达到收支平衡性能点所需的剪枝率。如图所示,由于稀疏表示,权重剪枝导致L1 D-Cache负载丢失,存储和存储丢失的大幅增加。剪枝60%时,这些开销不会因计算减少而得到抵消,因此观察到净性能损失。剪枝80%时,适度降低内存访问开销和减少计算量的结合可实现收支平衡。剪枝速率必须超过80%,才能克服该层的内存访问开销并获得净性能提升。
为了解决传统剪枝技术带来的挑战,我们在本文中提出了Scalpel。 它由两种方法组成:SIMDaware权重剪枝和节点剪枝。 Scalpel根据其并行性为不同的硬件平台定制DNN剪枝。
图6显示了Scalpel的概述。 Scalpel的第一步是分析和确定硬件平台的并行度。 根据其内部并行性,所有通用硬件平台均分为三类:低并行性,中等并行性和高并行性。 对于低并行度的硬件,将应用支持SIMD的权重剪枝。 它会按组剪枝权重,并将其余的权重按对齐的组。 所有组的大小与SIMD宽度相同,并且同一组中的权重共享相同的列索引,从而减少了稀疏格式的开销。 对于高并行度的硬件,将应用节点剪枝。 它通过删除冗余节点而不是冗余权重来删除DNN冗余。 删除节点不会破坏密集权重矩阵的规则结构。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1jAds862-1577952242923)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1577094564482.png)]
对于具有中等并行度的硬件,我们结合使用SIMD感知的权重剪枝和节点剪枝。 SIMD感知权重剪枝用于全连接层,节点剪枝应用于卷积层。 通过针对不同的硬件平台定制剪枝技术,Scalpel可以减少所有通用处理器的DNN模型大小和执行时间,而不会损失DNN的准确性。
根据通用处理器的并行度,我们将其划分为三个主要类别。表1展示了这三个类别的基本特征。
低并行度:低功耗处理器(如微控制器)通常具有较低的并行度。这些处理器包含具有“浅”pipeline的有序内核,并且没有缓存。它们的存储空间也非常有限。 SIMD单元用于加速计算,但是它们的宽度仍然有限。例如,ARM Cortex-M4具有3级顺序pipeline和2路SIMD单元。我们仅使用的测试板具有128KB SRAM和512KB闪存。
中等并行度:乱序处理器(例如Intel Core i7-6700 CPU)可以归类为中等并行度硬件。除SIMD单元外,指令级并行性(ILP)和存储器级并行性(MLP)还可用于加速计算。为了充分利用ILP和MLP,中等并行度处理器需要较深的缓存层次结构。它们通常连接到大型片外DRAM,因此,存储大小足够大,可以视为不受限制。
高并行度:诸如GPU之类的高并行度硬件利用线程级并行度(TLP)进一步改善了并行度以加速计算。它着重于高计算吞吐量,因此,DNN模型大小并不重要。高并行度硬件的应用程序往往对带宽敏感,这需要具有高带宽的内存层次结构。像中等并行度的硬件一样,可以认为存储大小是无限的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZHgvXj7G-1577952242925)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1577094689661.png)]
可以批量处理同一DNN的多个输入,以减少内存访问。 权重矩阵可以一次加载并共享以计算多个不同的输入。 批处理将增加计算吞吐量,但也会增加延迟。 在低并行度和中等并行度的硬件上,我们将批处理大小设置为1,因为实时应用程序需要DNN在短延迟内完成计算。 但是,对于高并行度的硬件,计算是受吞吐量驱动的,并且大批量的DNN计算仍可以满足延迟要求。 在这种情况下,我们将批处理大小设置为50,以在高并行度硬件上进行DNN计算。 Han等将批处理大小设置为1进行GPU测试,这实际上是不切实际的。
对于低并行度的硬件,我们将支持SIMD的权重剪枝应用于DNN。 SIMD感知权重剪枝的主要步骤如图7所示。我们使用ARM Cortex-M4微控制器作为低并行度硬件的示例。它具有用于16位定点数字的2向SIMD单元。第一步是权重分组。将所有权重划分为对齐的组,其大小等于支持的SIMD宽度。图8(A)显示了权重分组的简单示例。所有组的大小均为2,即Cortex-M4的SIMD宽度。第二步是剪枝权重组。我们计算每个组的均方根(RMS),并用它来衡量权重组的重要性。 RMS值低于阈值的组将被删除。图8(B)显示了剪枝权重组后的权重矩阵示例。然后将剪枝掉权重矩阵。重复应用剪枝权重组和重新训练DNN的步骤,直到重新训练的DNN无法保持原始精度为止。SIMD感知的权重剪枝功能可以逐层进行。每个层的执行时间将在开始时生成,并且剪枝过程从执行时间最长的层开始。每次对剪枝的DNN进行重新训练后,每层的执行时间都会更新。如果重新训练的DNN不会失去原始精度,则将在下一次迭代中剪枝新的最慢层。我们不会剪枝冗余度低的层并且无法通过SIMD感知的权重剪枝来提高性能。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s8rG1pp6-1577952242925)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1577094856284.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1fgEkMvS-1577952242926)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1577095229686.png)]
在了解SIMD的权重剪枝过程中,我们需要调整Dropout率。 Dropout是防止过度拟合的一种广泛使用的技术。 在网络训练过程中,通过使神经元以一定概率p保持活动状态,否则将其设置为零来实现Dropout。 此过程可以视为对神经网络进行采样,并且仅需要通过此迭代训练来更新网络的采样部分。 对于下一次迭代,应该对网络进行重新采样。 支持SIMD的权重剪枝将删除连接并减少DNN模型的容量。 我们使用与Han等人使用相同的技术调整Dropout率。 假设对于第i层, C i C_i Ci是连接数,其中 C i o C_{io} Cio是原始网络,而 C i r C_{ir} Cir是其余网络。 我们可以将Dropout率调整为
D r = D o C i r C o r D_r = D_o\sqrt{\frac {C_{ir}} {C_{or}}} Dr=DoCorCir
D o D_o Do是原始的Dropout率, D r D_r Dr是调整剪枝后用来重新训练剩余网络的Dropout率。
感知SIMD的权重剪枝后,我们使用一种经过修改的CSR格式来记录稀疏的权重矩阵。 修改后的CSR格式(如图8(C)所示)包括三个一维数组: A ′ A' A′, I A ′ IA' IA′和 J A ′ JA' JA′。 A ′ A' A′以原始顺序存储所有非零权重组。 I A ′ IA' IA′将索引记录到W的每一行中第一个非零元素的 A ′ A' A′中。 J A ′ JA' JA′存储每个组的列索引。 仅记录每个组中第一个元素的列索引。 在实际计算中,如图8中的虚线箭头所示,我们可以成组地将非零权重加载到数组 A ′ A' A′中。 然后,仅使用数组 J A ′ JA' JA′中的一个索引来加载相应的输入值。 由于输入值现在也位于连续地址中,因此可以使用单个SIMD指令加载它们。 加载输入值和权重后,SIMD单元将执行计算。
感知SIMD的权重剪枝可以减少低并行度硬件上DNN的模型大小和执行时间。对每个权重组使用一个列索引可以显著减少索引数组 J A ′ JA' JA′的存储大小和整个模型的大小。对于DNN计算,用一条SIMD指令加载多个连续的输入值可以减少计算指令。减小模型大小还可以减少内存占用。因此,可以通过SIMD感知的权重剪枝提高DNN的计算性能。图9显示了SIMD感知的权重剪枝带来的最佳性能收益。 x轴是剪枝率,这意味着我们可以从权重矩阵中删除多少权重。对于稀疏矩阵向量(MV-Sparse)和矩阵矩阵(MM-Sparse)乘法,我们需要分别删除超过68%和73%的权重矩阵以减少执行时间。但是,通过支持SIMD的权重剪枝(MV-SIMD稀疏/ MM-SIMD稀疏),我们只需要除去48%和56%的权重即可。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NdvZU6ao-1577952242927)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1577168519842.png)]
对于具有高并行度的硬件,采用节点剪枝来消除DNN中的冗余。我们使用NVIDIA GTX Titan X GPU作为高并行度硬件的示例。传统的权重剪枝技术会降低高并行度硬件上所有DNN层的性能。图10显示了在GPU上稀疏矩阵矩阵乘法的相对执行时间与剪枝速率的关系。这两个矩阵的大小分别为4096x4096和4096x50。它估计具有4096个输入和4096个输出的全连接层的性能。计算批处理大小设置为50。如图所示,需要去除超过96%的权重才能实现性能提升。但是,在不损失准确性的情况下,从DNN层中删除这么多的权重是不切实际的。权重剪枝导致的矩阵稀疏性将损害所有层的计算性能。为避免这种性能下降,节点剪枝通过删除整个节点而不是权重来删除DNN冗余。它使用mask层动态找出不重要的节点并阻止其输出。训练mask层后,将移除被阻塞的节点。删除所有冗余节点后,将删除mask层,并对网络进行重新训练以获取剪枝的DNN模型。全连接层中的一个神经元或卷积层中的一个特征图被视为一个节点。删除DNN中的节点只会缩小每层的大小,而不会导致网络稀疏。节点剪枝后的其余DNN模型将保持规则的密集DNN结构,并且不会遭受网络稀疏性的开销。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xEq1dlT6-1577952242927)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1577168411967.png)]
图11显示了节点剪枝的主要步骤。 首先,我们将为每个DNN层(输入和输出层除外)添加一个mask层。 图12给出了用于全连接层的mask层的示例。 A层的输出值在传播到下一层之前需要经过mask层 A ′ A' A′。 mask层中的每个节点都包含两个参数 α \alpha α和 β \beta β。 α \alpha α是布尔变量 α ∈ { 0 , 1 } \alpha \in \{0, 1\} α∈{0,1}, β \beta β是0到1之间的浮点数 β ∈ [ 0 , 1 ] \beta \in [0, 1] β∈[0,1]。 令数组Y和 Y ′ Y' Y′为原始层A和mask层 A ′ A' A′的输出激活数组。 对于 y i ′ ∈ Y ′ y'_i \in Y' yi′∈Y′和 y i ∈ Y y_i \in Y yi∈Y,我们有
y i ′ = α i ∗ y i y'_i = \alpha_i*y_i yi′=αi∗yi
当 α i \alpha_i αi置为0时,相应的节点就可以被认为已经被移除了,因为对应的 y i ′ y'_i yi′为0。
对于卷积层,特征图i中的激活将通过相同的mask节点i并生成保持相同大小的mask特征图。 因此,以特征图的粒度对卷积层进行剪枝,并且我们将每个特征图视为一个节点。 下一步是训练mask层。 对于mask层中的单个节点i, α i \alpha_i αi和 β i \beta_i βi都初始化为1,当训练的迭代次数大于等于1时, α i \alpha_i αi按照如下方式计算:
α i ∣ k = { 1 T + ϵ ≤ β i ∣ k α i ∣ k − 1 , T ≤ β i ∣ k < T + ϵ 0 , β i ∣ k < T \alpha_i|_k=\begin{cases} 1 &\ T+\epsilon \le \beta_i|_k\\ \alpha_i|_{k-1}, &\ T \le\beta_i|_k \lt T +\epsilon \\0, &\ \beta_i|_k \lt T \end{cases} αi∣k=⎩⎪⎨⎪⎧1αi∣k−1,0, T+ϵ≤βi∣k T≤βi∣k<T+ϵ βi∣k<T
其中T ( 0 < T < 1 ) (0 \lt T \lt 1) (0<T<1)是所有mask层共享的阈值。 ϵ \epsilon ϵ是一个让训练更稳定的小值,使 α \alpha α不会在0和1之间跳跃。 β i \beta_i βi在反向传播过程中被更新,截断到[0, 1]中。
我们使用L1正则化来控制删除的节点数量。正则化用来惩罚参数的大小。对于mask层,每个参数 β i \beta_i βi的惩罚可以计算为
R i , L 1 = λ ∣ β i ∣ = λ β i R_{i,L1} =\lambda|\beta_i|=\lambda\beta_i Ri,L1=λ∣βi∣=λβi
其中, λ \lambda λ是权重衰减系数(正则强度)。它迫使 β i \beta_i βi接近零。如果相应的节点不重要,则 β i \beta_i βi将减小到低于阈值T,并且该节点将被临时删除。如果发现某些已删除的节点很重要,则将通过DNN训练将其保留。由于阈值T在节点剪枝中是固定的,因此增加权重衰减系数 λ \lambda λ将增加 β i \beta_i βi的惩罚,并使更多参数 β i \beta_i βi变小使其低于T。因此,将删除更多节点。
节点剪枝还需要调整Dropout率。与SIMD感知的权重剪枝不同,Dropout率是在训练mask层的步骤中动态更新的。在第k次迭代中,Dropout率的计算公式为
D r o p o u t ∣ k = D r o p o u t ∣ 0 × N ∣ k N ∣ 0 Dropout|_k = Dropout|_0×\frac {N|_k} {N|_0} Dropout∣k=Dropout∣0×N∣0N∣k
其中 D r o p o u t ∣ 0 Dropout|_0 Dropout∣0是初始dropout率, N ∣ 0 N|_0 N∣0是节点的初始数量, N ∣ k N|_k N∣k是迭代k中的剩余节点数量。
在训练mask层的步骤中,其他层的参数不固定。其他层的权重和bias会被更新,以适应新的删除了节点DNN架构。
在训练mask层之后,在mask层上的L1正则化的权重衰减系数增加。然后,在训练mask层的下一次迭代中将删除更多节点。训练mask层和增加权重衰减这两个步骤将会被迭代使用,直到重新训练无法保持DNN精度为止。节点剪枝的最后一步是删除被屏蔽的节点,删除mask层并重新训练网络。删除所有具有等于零值的节点和特征图。例如,在图12中,将删除 α 3 = 0 \alpha_3 = 0 α3=0的节点 A − 3 A-3 A−3。然后去除mask层,剩余节点的输出激活可以直接传播到下一层。剩下的网络经过重新训练,以获取最终的剪枝DNN。
对于具有中等并行度的硬件,例如Intel Core i7-6700 CPU,可以将SIMD感知的权重剪枝和节点剪枝组合起来并应用于同一DNN。 为了限制实时应用程序的计算延迟,DNN计算通常在中等并行度的硬件上具有较小的批处理大小。 此处,批大小固定为1,小批大小将产生相似的结果。 DNN可以分为两部分:全连接层和卷积层。 批大小为1时,全连接层执行矩阵矢量乘法,卷积层执行矩阵矩阵乘法。 在这种情况下,Scalpel将SIMD感知权重剪枝应用于完全连接的层,并将节点剪枝应用于卷积层。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bl5xGDpz-1577952242927)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1577171286032.png)]
图13和图14分别描述了Intel Core i7-6700 CPU上稀疏矩阵向量乘法和矩阵矩阵乘法的相对执行时间。 MKL-Dense和MKL-Sparse通过Intel MKL库显示了密集矩阵和稀疏加权矩阵的结果。简单稀疏是我们对稀疏库的实现。 SIMDSparse显示了将非零元素分组并对齐的结果,如SIMD感知的权重剪枝一样。
图13显示了通过SIMD感知的权重剪枝,矩阵向量乘法的相对执行时间减少。英特尔i7-6700具有一个用于32位浮点数的8路SIMD单元。因此,可感知SIMD的权重剪枝可删除8个一组的权重。与使用英特尔MKL库(MKL-Sparse)的稀疏矩阵矢量乘法相比,可感知SIMD的权重剪枝(SIMD-Sparse)可以显着提高计算性能。 为了实现加速而需要删除权重的百分比从52%降低到3%。因此,对于执行矩阵矢量乘法的全连接层,可以应用SIMD感知权重剪枝以提高性能并减小模型大小。
可以感知SIMD的权重剪枝可以大大减少中等并行度硬件上的执行时间,这有以下三个原因。首先,通过减少索引数,减少了计算的内存占用量。其次,将权重分组并与可识别SIMD的权重剪枝对齐,这会增加读取权重和相应输入的空间局部性。第三,计算指令的数量减少了,因为我们只需要为每个组加载一个索引,并且可以使用SIMD指令加载相应的输入值。
图14是矩阵矩阵乘法的相应相对执行时间减少。与使用Intel MKL库的稀疏矩阵矩阵乘法(MKL-Sparse)相比,支持SIMD的权重剪枝(SIMD-Sparse)无法提高执行性能。为了通过传统的剪枝技术或SIMD感知的重量剪枝提高性能,至少需要去除79%的权重。但是,在不损失准确性的情况下,对于在中等并行度硬件上运行的DNN,很难从卷积层中除去这么多的权重。与全连接层相比,卷积层的冗余要少得多,因为所有权重都需要在卷积操作中重用。因此,权重剪枝将损害计算性能,并且无法应用于卷积层。在这种情况下,Scalpel将节点剪枝应用于卷积层,因为它保留了权重矩阵的规则结构,以避免由于权重剪枝而导致性能下降。
要将SIMD感知的权重剪枝和节点剪枝都应用于同一网络,我们将首先使用节点剪枝来去除卷积层中的冗余节点。然后,固定卷积层,并使用SIMD感知权重剪枝从完整连接的层中剪枝多余权重。