PaddleSlim 简介
PaddleSlim 是百度飞桨 (PaddlePaddle) 联合视觉技术部发布的模型压缩工具库,除了支持传统的网络剪枝、参数量化和知识蒸馏等方法外,还支持最新的神经网络结构搜索和自动模型压缩技术。
PaddleSlim 工具库的特点
接口简单
- 以配置文件方式集中管理可配参数,方便实验管理
- 在普通模型训练脚本上,添加极少代码即可完成模型压缩
效果好
- 对于冗余信息较少的 MobileNetV1 和 MobileNetV2 模型,卷积核剪切工具和自动网络结构搜索工具依然可缩减模型大小,并保持尽量少的精度损失。
- 蒸馏压缩策略可明显提升原始模型的精度。
- 量化训练与蒸馏的组合使用,可同时做到缩减模型大小和提升模型精度。
- 网络结构搜索工具相比于传统 RL 方法提速几十倍。
功能更强更灵活
- 剪切压缩过程自动化
- 剪切压缩策略支持更多网络结构
- 蒸馏支持多种方式,用户可自定义组合 loss
- 支持快速配置多种压缩策略组合使用
PaddleSlim 工具库的功能列表
模型剪裁
- 支持通道均匀模型剪裁(uniform pruning)、基于敏感度的模型剪裁、基于进化算法的自动模型剪裁三种方式
- 支持 VGG、ResNet、MobileNet 等各种类型的网络
- 支持用户自定义剪裁范围
量化训练
- 支持动态和静态两种量化训练方式
- 动态策略: 在推理过程中,动态统计激活的量化参数。
- 静态策略: 在推理过程中,对不同的输入,采用相同的从训练数据中统计得到的量化参数。
- 支持对权重全局量化和 Channel-Wise 量化
- 支持以兼容 Paddle Mobile 的格式保存模型
蒸馏
- 支持在 teacher 网络和 student 网络任意层添加组合 loss
- 支持 FSP loss
- 支持 L2 loss
- 支持 softmax with cross-entropy loss
轻量级神经网络结构自动搜索
- 支持百度自研的基于模拟退火的轻量模型结构自动搜索 Light-NAS
自动模型压缩
- 支持基于模拟退火自动网络剪枝
其它功能
- 支持配置文件管理压缩任务超参数
- 支持多种压缩策略组合使用
PaddleSlim 应用效果
经典压缩 Benchmark
Light-NAS Benchmark
Light-NAS 百度业务应用效果
轻量级模型搜索详解
1、自动网络结构搜索
网络结构的好坏对最终模型的效果有非常重要的影响,高效的网络结构可以可以用较少的计算量获得较高的精度收益,比如 MobileNet,ShuffleNet 等,但手工设计网络需要非常丰富的经验和众多尝试,并且众多的超参数和网络结构参数会产生爆炸性的组合,常规的 random search 几乎不可行,因此最近几年神经网络架构搜索技术(Neural Architecture Search)成为研究热点。
区别于传统 NAS,我们专注在搜索精度高并且速度快的模型结构,我们将该功能统称为 Light-NAS。网络结构搜索关键的几个要素一般包括搜索策略、搜索目标评估方法、搜索空间定义和搜索速度优化。
- 搜索策略
搜索策略定义了使用怎样的算法可以快速、准确找到最优的网络结构参数配置。常见的搜索方法包括:强化学习、贝叶斯优化、进化算法、基于梯度的算法等。
早期的 NAS 方法中,强化学习使用的比较多。强化学习(Reinforcement learning,简称 RL)是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利益。强化学习是一种非常有意思的范式,几乎只要可以提炼出强化学习四要素,原问题就可以用强化学习来求解。
论文「NEURAL ARCHITECTURE SEARCH WITH REINFORCEMENT LEARNING」将架构的生成看成是一个 agent 在选择 action,reward 是通过在训练集上训练一定的 epochs 后的精度。在具体的实现过程中,用 RNN 作为控制器来表示策略函数,每次通过 RNN 生成一串编码,通过一个映射函数将编码映射成网络结构,并使用 policy gradient 来优化 RNN 控制器的参数,如图 1 所示。
图 1
强化学习策略计算复杂度高、耗时长,因此 PaddleSlim 选用了经典的组合优化策略模拟退火。模拟退火算法来源于固体退火原理,将固体加温至充分高,再让其徐徐冷却,加温时,固体内部粒子随温升变为无序状,内能增大,而徐徐冷却时粒子渐趋有序,在每个温度都达到平衡态,最后在常温时达到基态,内能减为最小。鉴于物理中固体物质的退火过程与一般组合优化问题之间的相似性,我们将其用于网络结构的搜索。
在 PaddleSlim 的 NAS 任务中,采用了百度自研的基于模拟退火的搜索策略,区别于 RL 每次重新生成一个完整的网络,我们将网络结构映射成一段编码,第一次随机初始化,然后每次随机修改编码中的一部分(对应于网络结构的一部分)生成一个新的编码,然后将这个编码再映射回网络结构,通过在训练集上训练一定的 epochs 后的精度以及网络延时融合获得 reward,来指导退火算法的收敛,如图 2 所示。
图 2
- 搜索目标评估方法
相比一般的网络搜索技术,在模型小型化方向,不仅要考虑模型的精度,同时要考虑模型的运行效率,论文「MnasNet」同时将模型的精度以及在手机上运行的时间加权计算作为最终的 reward。
由于每次在手机上运行网络获得延时操作非常繁琐并且耗时,论文「ChamNet」提出将网络结构拆解成若干可穷举的 OP,在手机上运行每个 OP 获得延时并建立一个查找表 LUT,这样每次只需要通过查表并累加各个 OP 的时间就可以快速获得模型整体的运行耗时。PaddleSlim 也正在进行相关功能研发,即将开源,敬请期待。
- 搜索空间定义
搜索空间定义了优化问题的变量,变量规模决定了搜索算法的难度和搜索时间。因此为了加快搜索速度,定义一个合理的搜索空间至关重要,早期的 NAS 因为没有限制搜索空间,甚至需要使用 800 块 GPU 训练一个月才能收敛。
为了加快收敛速度,论文「Learning Transferable Architectures for Scalable Image Recognition」将网络拆分为多个 Normall Cell 和 Reduction Cell,只搜索这两个子模块中的拓扑结构,然后人工堆叠成最终的网络结构,如图 3 所示。
图 3
在模型小型化方向,为了使搜索到的结构尽量高效,PaddleSlim 参考了 MobileNetV2 中的 Linear Bottlenecks 和 Inverted residuals 结构,搜索每一个 Inverted residuals 中的具体参数,包括 kernelsize、channel 扩张倍数、重复次数、channels number,如图 4 所示。
图 4
- 搜索速度优化
最后在搜索速度优化方面,为了减少采样的网络训练时间,一般采用提前终止的策略,只训练少量 epochs 数获得其在验证集上的精度作为 reward。
最新的一些文章考虑使用参数共享的方案,如论文「Efficient Neural Architecture Search via Parameter Sharing」共享 OP 的参数,而进行拓扑结构的搜索,另外论文「Darts: Differentiable architecture search」基于可微分搜索空间的方案也能加快搜索速度,如图 5,不过其无法搜索 channel 数量,这对于高效的网络结构设计有比较大的限制。PaddleSlim 也正在做这个方向的探索。
图 5
2、自动模型压缩
自动模型压缩相比 NAS 而言,不是一个从无到有的过程,而是在一个已有的模型(训练好的)基础上进行压缩裁剪,在保证精度的同时,快速获得一个更快、更小的模型。目前传统的剪枝、量化、蒸馏这些人工压缩方法,一方面需要使用者了解算法原理和实现细节,另一方面在使用时有大量繁琐的调参工作,特别是对于模型剪枝,不同任务的最优参数差异很大,因此,如何用机器代替人工,自动搜索出最合适的参数变得非常重要。
在众多的压缩加速方法中,通道剪枝已经被证明非常有效,并在实际业务中广泛应用。通道剪枝压缩后模型不仅在大小上有收益,并且不需要依赖特殊的预测库就能加速,但由于神经网络中不同层的允余程度不同,并且不同层之间存在相互依赖关系,如何确定每一层的压缩率变得十分困难,论文「AMC: AutoML for Model Compression and Acceleration on Mobile Devices」提出使用强化学习搜索每一层最优的剪枝比例。
搜索策略采用 actor-critic 架构的 DDPG 算法,从网络的第一层开始,Actor 网络输入每层的相关参数(input_size、kernel_size、filter_num、stride、flops 等),输出一个(0~0.8)连续值,表示这层的剪枝率,直到模型的最后一层,然后根据输出的压缩率对网络进行裁剪,并将裁剪后的模型在 validation set 上测试得到裁剪后的网络精度作为 reward 来指导 ddpg 收敛,整体的流程如图 6。
图 6
PaddleSlim 基于模拟退火算法实现了类似的功能,搜素速度有明显的提升。具体的实现方法中,我们将网络的压缩率编码成一个向量,向量中每一维表示某一层的压缩率(取值范围为 0~0.8),初始状态下,随机生成一个向量,然后用向量中的压缩率裁剪整个网络,和用强化学习一样,我们将裁剪后的网络在 validation set 上测试得到裁剪后的网络精度,并使用的延时评估器获取裁剪后网路的速度,将延时和精度融合后得到最终的 reward。
每次结束后,我们会随机改变向量中某一维(也可以是多维),得到网络一个新的裁剪率,根据这个新的向量裁剪网络并获取 reward,根据当前 reward 和前一个状态的 reward 的关系来指导退火算法收敛。
和剪枝类似,在参数量化方向,论文「HAQ: Hardware-Aware Automated Quantization」搜索出每层最优量化位宽已达到最佳的整体量化收益。整体框架和搜索剪枝的类似,如图 7 所示。