环境要求
- python3
-
总体使用流程
通过本工具得到训练好的float onnx模型,以及MNN模型压缩参数文件
通过MNN转换工具,输入这两个文件,得到最终的MNN稀疏模型
支持的op,使用建议
目前支持普通卷积nn.Conv2d(group=1,非1*1)的过参数化
- 该算法应在模型从零开始训练时使用,因为其中的参数会重新进行初始化
- 该算法的特点是:设计小模型 —> 训练线性过参数化大模型 —> 保存时合并为原始小模型结构。因此你可以设计一个小模型,然后用此算法训练提高小模型精度,最后推理部署仍使用小模型结构
- 得到的小模型后续仍可叠加剪枝和量化等压缩算法
- 参考论文:ExpandNets: Linear Over-parameterization to Train Compact Convolutional Networks
使用方法
```python from mnncompress.pytorch import LOP
定义你的模型结构,并初始化
model = Net()
对模型进行线性过参数化
lop = LOP(model)
扩大8倍,指定模型压缩参数文件,更多参数查看api文档
expand_model = lop.linear_expand_layers(8, “compress_params.bin”)
使用线性过参数化之后的模型进行训练
train_and_evaluate(expand_model, data)
保存模型之前,将过参数化的模型合并,然后保存合并之后的模型 merged_model
merged_model = lop.linear_merge_layers()
**注意:**model,expand_model,merged_model均为深拷贝,有不同的内存空间,它们之间不互相影响
<a name="WuD8a"></a>
# 相关API
<a name="bkSBO"></a>
## LOP
```python
LOP(model) # model为原始模型nn.Module实例
方法linear_expand_layers
:
linear_expand_layers(expand_rate, compress_params_file, add_batchnorm=True, add_bypass=True, append=False)
将原始模型进行线性过参数化
参数: expand_rate: int,线性过参数化的倍数,一般取2,4,8,16等 compress_params_file: str,模型压缩参数文件名 add_batchnorm: bool,是否在线性过参数化时使用BN add_bypass: bool,是否在线性过参数化时添加bypass(残差连接) append: bool,是否将线性过参数化算法的参数追加到compress_params_file中去,为False,则将覆盖compress_params_file
返回值: 线性过参数化之后的模型,深拷贝,和原始model不共享内存
```
方法`linear_merge_layers`
```python
linear_merge_layers()
将过参数化之后的模型合并为原始模型结构
参数: 无参数
返回值:
合并之后的模型,深拷贝,和过参数化模型不共享内存