image.png
近几年,深度神经网络近年在计算机视觉以及自然语言处理等任务上不断刷新已有最好性能,已经展现出了极高的价值。深度网络模型虽然性能显著,但由于参数量巨大、存储成本与计算成本过高。在云侧,参数量与运算量过大的云侧模型会导致运算的资金、时间、存储、电力成本的上升,更小的QPS(每秒查询率)也会影响客户端的使用体验。在端侧,运算量参数量过大的神经网络模型会导致无法满足实时性需求, 更重要的是无法部署在端侧的模型运行在云侧势必导致隐私安全问题。


为了解决网络模型过大的问题,人们提出了模型压缩来解决该问题。其中神经网络剪枝是深度神经网络压缩中一种广泛使用的方法. 网络剪枝可以删除网络中冗余参数, 降低网络复杂度, 从而提高网络泛化能力, 并防止过拟合.EasyPruner 是一个无论是新手还是经验者都可以很方便用来优化模型的剪枝工具包,只需要在原来的训练代码上按照教程增加几行代码并运行即可获得压缩后的模型。

EasyPruner架构图

image.png

image.png
如图所示,Easypruner底层通过三个基础函数模块完成复杂剪枝任务,即重要性评估,正则化约束,轻量结构生成三个模块。EasyPruner剪枝工具包将剪枝分为三个流程,即正则化流程,剪枝流程,finetune流程。
其中finetune流程由用户使用rebuild函数api实现。
剪枝流程可被拆分成两个基本逻辑,即轻量结构生成(剪多少通道)与重要性评估(剪哪些通道),可由想应的函数模块完成。
正则化流程由正则化约束函数模块实现。
几乎所有的剪枝算法都可通过三种流程模块的排列组合完成。
EagleEye = 剪枝 +finetune
Netslim = 稀疏 + 剪枝 + finetune
迭代剪枝 = 剪枝 + finetune + 剪枝 + finetune …

用户一般仅需要接触到一套统一的剪枝功能函数接口,通过设置config类对象的相关成员变量来控制剪枝细节与调试参数,通过运行config::init,config::prune_algorithm来运行剪枝算法。
对于新手用户可以直接运行fastpruner.fastpruner函数直接进行剪枝,该函数已经完成参数设置。
熟练掌握剪枝理论的用户可以通过继承相关类,(如修改正则化模块),实现更加复杂的剪枝实验。
未来我们将不断更新,使用工具包实现SOTA剪枝算法。

EasyPruner特点

层次性:新手用户不需懂模型压缩知识即可流畅使用,熟练掌握剪枝理论的用户可以使用更加复杂的算法。
开放性:用户可在已有的框架下,自定义自己的剪枝算法。
灵活性:无需更换训练框架,也不用为剪枝接口重构训练或评测代码,仅在原训练框架中进行几行代码增
加,即插即用。
通用性:支持所有工程场景中常用的网络结构,例如ResNet、VGGNet、Inception、MobileNet等;支持多种训练框架代码,open-mmlab系列开源框架、u版YOLO系列等。
精确性:吸取神经网络剪枝的最新研究成果,提供在公开评测集上处于SOTA水平的剪枝方法,可对网络冗余连接进行精确识别,在一些常规任务上可以实现无损压缩。
实用性:剪枝后的模型可直接导出onnx,实现在NPU、ARM、GPU、CPU等多种平台的通用部署。

创新

与其他开源模型剪枝工具项目相比,本项目做了如下创新,以使剪枝工具更加强大:

  • 提出基于ONNX的图分析的网络拓扑排序方法,可以实现前后依赖算子的自动化识别,以兼容多样化的训练框架。
  • 提出包含自研GradDecay稀疏剪枝方法的进阶剪枝模式,该方法针对YOLOv5目标检测算法设计,可以在不增加训练成本的情况下,最大限度保留网络原始表达能力,在一般情况下实现无损剪枝,在大剪枝率情况下依旧保持低精度损失。
  • 提出包含自研MaskL1稀疏剪枝方法的进阶剪枝模式,该方法比目前流行的Network Slimming 方法有优的剪枝精度。

    功能介绍

    本工具包提供快捷模式、进阶模式两种剪枝模式,分别具有不同的代码修改方式,以及剪枝效果,用户可自行选择:
    快捷模式:遵循 “模型加载—>裁剪—>常规微调”三段式,易用性更强,代码修改便捷
    进阶模式-GradDecay:遵循 “模型加载—>稀疏微调—>裁剪”三段式,适合YOLOv5大剪枝率剪枝,需找到训练代码中的权重更新部分,进行修改。
    进阶模式-MaskL1:遵循“模型加载—>稀疏微调—>裁剪—>微调”四段式,通用性强,效果比快捷模式好。

    基础剪枝算法简介

  • Uniform,每层使用同一通道剪枝率进行剪枝,基于给定的flops得到该剪枝率进行剪枝。

  • Ratio,将网络中所用通道按照重要性准则进行排序,并按给定的剪枝率去掉不重用的那部分通道。
  • OT,自适应的获取每一层的剪枝阈值,并进行剪枝。
  • netslim,剪枝前进行L1正则化训练得到具有通道稀疏性的模型,再进行剪枝操作。
  • maskL1,对netslim进行优化,对限定区域的通道进行正则化约束,再进行剪枝操作。
  • EagleEye,随机搜索模型结构并按照给定的重要性准则进行剪枝,剪枝后的模型测试准确率,从多个搜索的结果中选取一个最好的。

实验结果展示