环境要求

  1. python3
  2. PyTorch >= 1.2.0

    总体使用流程

  3. 通过本工具得到训练好的float onnx模型,以及MNN模型压缩参数文件

  4. 通过MNN转换工具,输入这两个文件,得到最终的MNN稀疏模型

    支持的op,使用建议

  5. 目前支持普通卷积nn.Conv2d(group=1,非1*1)的过参数化

  6. 该算法应在模型从零开始训练时使用,因为其中的参数会重新进行初始化
  7. 该算法的特点是:设计小模型 —> 训练线性过参数化大模型 —> 保存时合并为原始小模型结构。因此你可以设计一个小模型,然后用此算法训练提高小模型精度,最后推理部署仍使用小模型结构
  8. 得到的小模型后续仍可叠加剪枝和量化等压缩算法
  9. 参考论文: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()

  1. **注意:**modelexpand_modelmerged_model均为深拷贝,有不同的内存空间,它们之间不互相影响
  2. <a name="WuD8a"></a>
  3. # 相关API
  4. <a name="bkSBO"></a>
  5. ## LOP
  6. ```python
  7. LOP(model) # model为原始模型nn.Module实例

方法linear_expand_layers

  1. 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不共享内存

  1. ```
  2. 方法`linear_merge_layers`
  3. ```python
  4. linear_merge_layers()

将过参数化之后的模型合并为原始模型结构

参数: 无参数

返回值: 合并之后的模型,深拷贝,和过参数化模型不共享内存