NNI模型剪枝压缩使用的较详细记录

使用微软nni工具,基于pytorch进行模型压缩记录总结,最后的结论一很久以前实验的,可能会有点误差,或者NNI工具更新了。但是nni模型剪枝压缩的整体流程是这样的,在此简单记录一下。

一、模型的剪枝与训练

NNI可实现多种剪枝算法的自动剪枝,训练。比如:SlimPruner,L1FilterPruner,L2FilterPruner,FPGMPruner,LevelPruner,AGP_Pruner等多种剪枝算法。

1.在自己的数据集上正常训练网络结构模型。

2.在训练结束后,调用NNI的模型剪枝API,选择需要实现的剪枝算法,以及配置config_list,包含sparsity,op_types,op_names参数,配置正确的参数即可。

 

   3.基于前面训练的模型,配置的参数,进行剪枝模型的finetune训练。

  4.剪枝模型finetune训练完成之后,得到两个文件。

与原模型大小一样的pruner文件和Mask文件。

实验及结论分析

在nni官方 提供的VGG19,VGG16,基于cifar10数据集训练,使用SlimPruner,L1FilterPruner剪枝。训练以及剪枝Finetune都只进行10个epoch,可以达到相同效果,验证集acc80%。

使用resnet网络,基于cifar10数据集训练,使用上述剪枝后同样能达到剪枝前的效果。

使用CRNN网络结构,L1FilterPruner剪枝算法,在合成的数字数据集上,剪枝前后,训练中的acc都可达到98%。

二、模型的压缩与前向加速

真正实现模型文件大小的压缩与前向推理的加速,需要调用NNI的 model speedup的API完成,目前NNI这部分内容处于测试版本,支持的模型,OP以及剪枝算法数量有限,目前只支持粗粒度剪枝。得到小模型以及前向加速Pytorch版本需要>=1.3.1。

1.model权重与Mask相乘。

2.使用nni的api进行moudle的替换,得到更小的模型更快的推理速度。

      对于 PyTorch,当前仅提供了替换moudle,如果是在 forward 中的函数,当前不支持。 一种解决方案是将函数变为 PyTorch 模块

在进行模型压缩和加速的时候,Nni的本身会解决一些Mask conflict,但有些冲突无法解决,比如BN的一些冲突。

 

3Save带网络结构的小模型

    使用resnet18网络,在Cifar10数据集,利用L1FilterPruner剪枝。模型大小从42.7M变为7.68M,Input为(1, 3, 128,128)Flops从596.151M 到 129.464M,Params从11.182M到 2.002M。

推理速度方面,使用128*128 size的输入,实测resnet18 ,32次迭代加速不明显,少量迭代时,迭代2次时,加速效果明显0.009,加速后0.004(算法训练平台测试,有时快有时慢)。官方的(64, 3, 32, 32)输入实测如下,32次迭代加速也不是很明显。

NNI模型剪枝压缩使用的较详细记录_第1张图片

使用CRNN网络结构,虽然可以进行剪枝模型的训练,但在模型压缩的的时候,一些OP暂时无法无法支持,比如维度变换等。

你可能感兴趣的:(模型框架学习,人工智能,nni)