Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

机器之心编辑部机器之心专栏

NPAS:一个为实现超越实时移动端加速的、编译器感知的网络剪枝与结构搜索框架

本研究课题由美国东北大学王言治教授研究团队领衔,提出了新型的适用于各种 DNN 层的细粒度结构化剪枝,以及支持不同 DNN 和不同剪枝方案的综合编译器自动代码生成框架,并在此基础上进一步提出了编译器感知的NPAS框架,统一了神经网络剪枝与架构搜索。


随着在移动边缘设备上高效部署深度神经网络的需求不断增加,减少不必要的计算和提高执行速度变得愈加重要。为实现这一目标,先前的研究工作探索了模型压缩和神经网络架构搜索 (NAS) 的方法。但这两种方法在很大程度上是独立执行的,并且先前的研究工作没有充分考虑编译器级优化,而这一部分对于移动加速来说是必不可少的。本研究课题由美国东北大学王言治教授研究团队领衔,提出了新型的适用于各种 DNN 层的细粒度结构化剪枝,以及支持不同 DNN 和不同剪枝方案的综合编译器自动代码生成框架,并在此基础上进一步提出了编译器感知的 NPAS 框架,统一了神经网络剪枝与架构搜索。在高通 Adreno 640 移动 GPU 上,我们只需要 6.7ms 推理时间达到 78.2% ImageNet 准确率。该文章已被 CVPR 2021 会议收录为 Oral 论文。


研究背景

随着深度学习的快速发展,它在学术界、工业界以及现实生活中的各种应用中取得了巨大的成功。但是随着深度神经网络的模型规模越来越大,密集的计算和内存成本阻碍了深度学习在资源有限的移动设备上的部署。小尺寸的模型以及快速的推理过程对移动端的人工智能部署与应用非常重要。为了降低模型尺寸并且加快推理速度,同时保持模型的稳健性和准确性,人们尝试了不同方法,例如模型压缩,以及针对小型网络的网络结构搜索等等。

神经网络剪枝是模型压缩中一种典型的压缩算法。网络剪枝可以按照剪枝方案和剪枝算法分为非结构化剪枝,粗粒度结构化剪枝,以及细粒度结构化剪枝。如图 1 (a) 和 (b) 所示,非结构化剪枝可以裁剪任意位置的模型权重。虽然它可以大大减少 DNN 模型中的权重数量,但所产生的稀疏权重矩阵结构不规则,使得在硬件设备上进行并行运算变得非常困难,导致加速效果非常有限。为了克服非结构化剪枝的局限性,许多工作研究了粗粒度结构化剪枝。如图 1 (c) 和 (d) 所示,粗粒度的结构化剪枝删除了模型中的整个滤波器或通道。剪枝后的模型仍然保持着高规则性的网络结构,可以在硬件设备上实现高并行度的运算,从而达到比较显著的加速效果。但是,粗粒度结构化剪枝的缺点在于去除整个滤波器 / 通道后,模型精度会有比较明显的下降。为了保证模型精度,我们通常不能使用过大的压缩率。

细粒度结构化剪枝主要是指模式化剪枝(Pattern based pruning)。如图 1 (e) 所示,它结合了前两种方案的优点。它从一个预定义的库中分配 pattern 结构。卷积层中的每个卷积核可以被完全删除或根据一种分配的 pattern 结构保留 4 个非零权值。Pattern-based 可以在编译器的帮助下同时实现模型高精确度和高硬件加速。但是这种剪枝方式也有其局限性,它暂时只能用于 3×3 的 CONV 层。

这些剪枝算法有一些共同的问题,比如现有的研究中基本是对一个模型应用同一种剪枝算法,而在一个模型中对不同的层应用不同的剪枝算法,这种方法还没有被广泛的研究过。此外,这些剪枝方法通常需要预先人为设定每一层的压缩率。然而不同的压缩率设定会导致对应层不同的推理速度,同时也会影响模型输出结果的精度。这种人为规定每一层的压缩率的做法很难找到神经网络整体压缩的最优解,并且会消耗大量人力。如何去获得比较合理的压缩率配置并且实现较高的精度和速度,是一个值得研究的问题。

图 1 卷积层与全连接层上不同的剪枝方法对比

神经网络结构搜索是另一种可以缩小模型的方法。它可以通过自动化的模型结构搜索,找到一个符合一定条件的神经网络模型。它有很多代表性的实现方法,比如基于加强学习的,或者基于进化算法的搜索方法等等。最近的一些工作,如 MnasNet、FBNet 意识到了硬件协同设计的重要性,并将硬件的推理速度纳入神经网络结构搜索的优化目标中。这种设计会比用计算量去估计推理速度的方法更加的准确直观。

在小尺寸模型所面向的设备中,手机作为一个重要的应用平台,已经成为了人们日常生活中必不可少的电子设备。在移动端部署深度神经网络有很高的实际应用价值。基于移动端的推理执行框架也引起了工业界和学术界的广泛关注。对于 DNN 推理框架,有很多具有代表性的先进工作,比如 TensorFlow-Lite(TFLite),阿里巴巴移动神经网络(MNN),以及 TVM 等等。最近的工作 PatDNN 和 PCONV 揭示了利用编译器优化实现 DNN 移动端加速的新方法。所采用的基于编译器的优化,能够高效地支持细粒度结构化剪枝,实现移动设备上的端到端的模型推理加速效果。我们测试了一系列不同的滤波器和剪枝方法在编译器优化下的加速效果,如图 2 所示。这些实验都是在三星 Galaxy S10 智能手机上进行的。我们发现即使计算量相同,不同的滤波器类型和裁剪方案在编译器优化下依然有不同的加速性能。

在手机端的神经网络模型加速中,编译器优化为我们的研究引入了一个新的优化维度,这是在之前的神经网络结构搜索中所没有考虑过的。为了实现在编译器优化的支持下,在目标移动设备上最大化 DNN 的准确性的同时满足推理速度的约束条件,我们设计了一种自动化的搜索方案,搜索神经网络中每层的网络结构、剪枝方案和压缩率,并且在搜索的同时考虑编译器优化以及移动端推理速度等因素。

 图 2 (a)不同滤波器类型的速度与计算量的对比;(b)不同剪枝方法的加速效果与压缩率的对比

新型细粒度结构化剪枝

如研究背景章节所述,模式化剪枝方案揭示了一个新的优化维度, 即细粒度结构化剪枝,可以在编译器优化的帮助下同时实现高准确率和高推理加速。由于模式化剪枝只适用于 3×3 的 CONV 层,并不具有普适性,因此我们提出了一个可以应用于各种 DNN 层的通用细粒度结构化剪枝稀疏方案:针对 FC 层的基于块的剪枝稀疏方案 (block-based pruning scheme)和可适用于不同内核大小的 CONV 层的区块打孔剪枝稀疏方案(block-punched pruning scheme)。 

基于块的剪枝稀疏方案:如图 3 (b) 所示,整个权重矩阵被划分为若干大小相等的块,然后在每个块内对权重的整列或整行进行裁剪。与粗粒度的结构化剪枝相比,基于块的剪枝提供了一个更加精细的剪枝粒度,以更好地保持 DNN 模型的准确性。在选择适当的块大小的情况下,块内的剩余计算仍然可以在在编译器的帮助下于移动设备上进行并行化处理。因此,基于块的剪枝可以在相同的总体剪枝率下实现与粗粒度结构剪枝相当的硬件推理性能。  

区块打孔剪枝稀疏方案:受基于块的剪枝的启发,我们开发了为 CONV 层量身定做的块打孔剪枝方案,它可以使用相同的编译器优化来加速。如图 3 (a) 所示,区块打孔剪枝需要在一个区块内的所有滤波器和所有通道的相同位置裁剪权重,以便从内存和计算的角度利用硬件并行性。通过有效的编译器级可执行代码的生成,也同样可以实现硬件的高并行度(和移动端的推理加速)。

图 3. 块打孔剪枝稀疏方案与基于块的剪枝稀疏方案

除此之外,我们开发了一个全面的、基于编译器的自动代码生成框架,来对提出的(区块打孔 / 基于块)的剪枝方案进行统一支持。这个框架同时还支持其他剪枝方案,如非结构化剪枝、粗粒度结构化剪枝,以及模式化剪枝。  事实上,非结构化和粗粒度结构化剪枝方案只是块打孔剪枝的特例,前者的块大小为 1×1,后者的块大小为整个权重矩阵。

为了找到合适的剪枝区块大小,我们进行了相关的实验与分析。图 4 显示了在 ResNet-50 上应用不同块大小的区块打孔剪枝后的准确性与推理延迟结果。  在这个实验中,所有层都采用统一的剪枝率(即 6 倍)和块大小。在相同的剪枝率下,非结构化剪枝(即 1×1 的块大小)保持了最高的准确性,但其在推理延迟方面表现最差。与之相对应的是,粗粒度结构化剪枝(即把整个权重矩阵作为一个块)实现了最低的延迟,但准确率下降也最为严重。区块打孔剪枝同时实现了高精确度和高推理速度(低延迟)。这个现象的原因是:硬件并行度受计算资源的限制,即使把权重分成块,每个块的剩余权重仍然足以满足设备上的硬件并行要求,这一点在资源有限的移动设备上尤为明显。一个合理的块大小应当让每个块中包含的通道数量与目标移动 CPU/GPU 上的向量寄存器的长度相匹配(例如 4),以确保高并行度。然后通过考虑给定的设计目标来确定需要包含的滤波器的数量(如 8 个)。

图 4. 统一 6 倍剪枝率下,不同区块大小的剪枝结果比较(ImageNet 数据集,ResNet-50 模型)

NPAS 框架总览

图 5 显示了我们提出的 NPAS 框架。为了充分利用最新的神经网络结构搜索成果并加速 NPAS 的进程,我们以一个预先训练好的 DNN 模型作为起始点,然后进行如图中所示的三个阶段得到最终结果。

第一阶段:替换对移动端不友好的算子。某些算子在移动设备(移动 CPU 和 GPU)上执行效率很低。例如,sigmoid、swish,这些指数级的计算操作需要消耗大量算力,成为移动端推理的延迟瓶颈。这些对硬件不友好的算子将被效果相似但更加简易的算子替代,例如用 hard-sigmoid 和 hard-swish 替换 sigmoid 和 swish,这一步对模型精度的影响可以忽略不计。

第二阶段:NPAS 方案搜索。该阶段生成并评估候选的 NPAS 方案。NPAS 方案由每层过滤器类型、剪枝稀疏方案和剪枝率三部分组成。由于需要额外搜索每层剪枝稀疏方案和剪枝率,第二阶段的搜索空间比以往的 NAS 要大很多,这使得具有代表性的 NAS 算法(如基于 RL 的算法)变得低效。为了加速这种搜索,我们提出了一个基于 RL 与贝叶斯优化(BO)的元建模(meta modeling)程序以及一套针对 NPAS 方案搜索的准确度快速评估方法。

除此之外,我们在 NPAS 方案搜索的奖励函数中有效纳入了整体的 DNN 延迟约束,确保这种约束能够在这些搜索结果中得到满足。在这里,整体的 DNN 延迟是对目前正在评估的候选 NPAS 方案在目标移动端 CPU/GPU 上进行实际测量得到的。在这里,我们依靠实际的测量来给出延迟信息反馈,而不是像许多先前的 NAS 工作那样进行每层的推理延迟建模,是因为我们的编译器优化中包含了层融合技术,这种技术对于 DNN 执行的提速相当有效,但同时使得每层网络的延迟建模变得不太准确。

第三阶段:剪枝算法搜索。在前一阶段我们已经确定了每层的滤波器类型,剪枝稀疏方案和剪枝率,保证了编译器生成的代码可以满足整体延迟约束,那么 剩下的任务便是找到最合适的压缩算法并进行实际的模型压缩和训练。

由于每层剪枝率已经确定,可供选择的剪枝算法仅限于那些预先确定的每层剪枝率的算法,包括基于幅度(magnitude-based)的渐进式剪枝算法,基于 ADMM 的剪枝算法,等等。作为对先前工作的扩展,我们对这些算法进行了概括,以便在 group-Lasso 正则化的帮助下实现不同的疏散方案。在第三阶段中,我们在几个 epoch 的训练中对候选剪枝算法所产生的 DNN 准确度进行比较,选择其中准确度最高的一个来完整执行,得出最终的 DNN 模型以及对应的编译器代码。

图 5. NPAS 框架总览

编译器系统总览

为了可以有效的利用剪枝后 DNN 模型,我们进行了多维度的编译器设计及优化,以支持模型中不同的剪枝方案,并实现在移动端的推理加速。在 NPAS 中,我们使用了非常标准且全面的编译器设计及优化流程,如图 6 所示。

首先,在 NPAS 搜索的第二阶段中,每当我们得到一个稀疏的候选模型之后,我们以计算图的形式来表示模型。之后,我们基于这个模型来进行多种的编译器优化,如消除负载冗余,层融合,压缩权重存储,以及参数自动调整等。在完成上述步骤之后,我们会生成移动设备可使用的执行代码,如移动 CPU 端使用的 C++ 代码,移动 GPU 端使用的 OpenCL 和 OpenGL 代码,并与我们的以紧凑形式存储的模型一起部署到移动端进行 DNN 推理。以下为 NPAS 框架使用的一些主要的编译器优化技术:

图 6. 编译器设计及优化总览

1. 消除负载冗余(Load redundancy elimination)

通过在内核执行代码生成过程中通过分析处理两个寄存器级负载冗余问题,解决了基于卷积核模式化剪枝对内存性能的挑战。在内存和缓存之间的数据移动已通过高级数据平铺技术进行了优化的前提下,这种负载冗余消除有着更加重要的意义。

2. 层融合(Layer fusion)

在我们的编译器优化中,我们加入了层融合技术来融合计算图中的计算运算符,并有效降低推理延迟。我们根据多项式计算中的两种属性来识别模型中的所有融合候选层:计算规律(即关联属性、交换属性和分配属性)和数据访问模式。完成了层融合之后的模型,可以大幅少运算符的数量和计算时间,并且减少中间结果的内存消耗。

3. 压缩权重存储(Compressed weight storage)

压缩权重存储格式是为 NPAS 中包括的不同稀疏方案所专门设计的。我们为所用到的各种细粒度剪枝方案中的卷积核与输出通道进行重排结合,这种紧凑的数据结构比传统的 CSR(压缩稀疏行)格式能够产生更好的压缩率。

4. 参数自动调整(Parameter auto-tuning)

参数自动调整专门测试关键性能参数的不同配置,包括将数据放置在各种 GPU/CPU 存储器上,不同的数据平铺大小以及每个处理单元上每个 DNN 层的循环置换的策略,从而为生成最优的模型执行代码扫清了障碍。

推理精度与加速性能展示

图 7. (a) 在移动 CPU 上准确率与推理延迟的对比         (b) 在移动 GPU 上准确率与推理延迟的对比

在图 7 中,我们将 NPAS 与当今流行的 DNN 推理加速框架 MNN, PyTorch Mobile,以及 TensorFlow-Lite 在准确率和推理延迟两个维度上进行了比较。为了结果的直观性,我们在比较中引入了四个具有代表性的不同大小的深度神经网络稠密模型,它们分别是:MobileNet-V3, EfficientNet-B0,以及两个 ·EfficientNet-B0 的直接缩小版,分别包含了原始网络计算量的 70% 和 50%。这里,所有测试均是在三星 Galaxy S10 智能手机上进行的,移动 CPU 为高通 Kryo 485,移动 GPU 为高通 Adreno 640。由于 Pytorch Mobile 尚不支持移动端 GPU 加速,所以我们 GPU 比较中没有包含相应结果。测试数据集为 ImageNet。

图中红色五角星表示了 NPAS 在不同推理延迟约束条件下产生的结果,其他四种颜色的五角星表示单纯使用编译器优化时在四种稠密深度神经网络上的运行结果。实验数据表明,即使在没有加入 NPAS 来进行网络搜索的情况下,我们的编译器优化已经可以有效加快深度神经网络的推理速度。以 MobileNet-V3 为例,在与目前移动端表现最佳的 MNN 框架相比,我们的编译器在移动 CPU 和 GPU 上分别达到了 46% 与 141% 的加速比。在此基础上,结合了 NPAS 框架进行搜索得到的模型在 compiler 上的表现稳定优于四个具有代表性的稠密模型,并达到了准确率和推理延迟方面的帕累托最优。在 NPAS 得到的结果中,准确率最高可达 78.2% (Top-1),在此情况下,移动 CPU 与 GPU 上的端到端的推理延迟分别只有 11.8 毫秒和 6.7 毫秒。在 MobileNet-V3 级别的准确度(75% Top-1)下,我们的推理时间分别为 9.8ms(CPU)和 5.9ms(GPU)。  在 MobileNet-V2 级别的准确度(71% Top-1)下,推理时间达到了 6.9ms(CPU)和 3.9ms(GPU)。目前而言,任何现有的 NAS 或权重剪枝工作都无法做到这一点。

我们在表 1 中给出了更多模型细节,与有代表性的手工调参模型以及硬件感知的神经网络结构搜索模型相比,NPAS 所得到的结果在相同准确率下得计算量(MACs)更少,且移动端推理速度有极大的提升。这是由于在之前的研究中,既没有将神经网络裁剪与结构搜索相结合,也没有考虑到针对编译器特性的网络结构优化。这使我们更加确信,编译器感知的神经网络裁剪与结构搜索是一个正确的方向。

表 1.NPAS 结果与具有代表性的轻量级网络的对比


敬请期待:  我们将继续开发并发布更多的 AI 功能,待续! 
有关更多信息,请通过 info@cocopie.ai 与我们联系。 
或者访问 www.cocopie.ai 以获取我们技术的更新资讯。 
关注我们的哔哩哔哩:https://space.bilibili.com/573588276 以获取更多的手机 AI 功能。
理论架构搜索网络剪枝
1
相关数据
感知技术

知觉或感知是外界刺激作用于感官时,脑对外界的整体的看法和理解,为我们对外界的感官信息进行组织和解释。在认知科学中,也可看作一组程序,包括获取信息、理解信息、筛选信息、组织信息。与感觉不同,知觉反映的是由对象的各样属性及关系构成的整体。

人工智能技术

在学术研究领域,人工智能通常指能够感知周围环境并采取行动以实现最优的可能结果的智能体(intelligent agent)

剪枝技术

剪枝顾名思义,就是删去一些不重要的节点,来减小计算或搜索的复杂度。剪枝在很多算法中都有很好的应用,如:决策树,神经网络,搜索算法,数据库的设计等。在决策树和神经网络中,剪枝可以有效缓解过拟合问题并减小计算复杂度;在搜索算法中,可以减小搜索范围,提高搜索效率。

深度神经网络技术

深度神经网络(DNN)是深度学习的一种框架,它是一种具备至少一个隐层的神经网络。与浅层神经网络类似,深度神经网络也能够为复杂非线性系统提供建模,但多出的层次为模型提供了更高的抽象层次,因而提高了模型的能力。

结构搜索技术

深度学习提供了这样一种承诺:它可以绕过手动特征工程的流程,通过端对端的方式联合学习中间表征与统计模型。 然而,神经网络架构本身通常由专家以艰苦的、一事一议的方式临时设计出来。 神经网络架构搜索(NAS)被誉为一条减轻痛苦之路,它可以自动识别哪些网络优于手工设计的网络。

推荐文章
暂无评论
暂无评论~