# PaddleSlim

PaddleSlim是PaddlePaddle框架的一个子模块，主要用于压缩图像领域模型。在PaddleSlim中，不仅实现了目前主流的网络剪枝、量化、蒸馏三种压缩策略，还实现了超参数搜索和小模型网络结构搜索功能。在后续版本中，会添加更多的压缩策略，以及完善对NLP领域模型的支持。

## 架构

(TODO) PaddleSlim架构介绍...

## 功能

- 模型剪裁

  - 通道均匀模型剪裁
  - 基于敏感度的模型剪裁
  - 基于进化算法的自动模型剪裁

- 量化训练

  - 在线量化训练
  - 离线量化
  - 对权重全局量化和Channel-Wise量化

- 知识蒸馏

- 轻量神经网络结构自动搜索（Light-NAS）

  - 基于进化算法的轻量神经网络结构自动搜索
  - 支持FLOPS / 硬件延时约束
  - 支持多平台模型延时评估

## 安装

安装PaddleSlim前，请确认已正确安装Paddle1.6版本或更新版本。Paddle安装请参考：Paddle安装教程。

- 安装develop版本

    1
    2
    3
    git clone https://github.com/PaddlePaddle/PaddleSlim.git
    cd PaddleSlim
    python setup.py install

- 安装官方发布的最新版本

    1
    pip install paddleslim -i https://pypi.org/simple

- 安装历史版本

请点击pypi.org查看可安装历史版本。

## 性能

PaddleSlim的离线量化、在线量化、均匀剪裁、敏感度剪裁、知识蒸馏等策略在多个主流CNN模型上都进行了验证，部分实验结果如下，全部的实验结果请参见模型库

#### 量化

我们在多个模型上分别验证了离线量化和在线量化的效果：离线量化过程简单，无需再次训练，但精度损失相对较多；在线量化需要额外的训练过程，但好处是精度损失可以被有效降低：

模型 | 压缩方法 | Top-1/Top-5 Acc | 模型大小（MB）
--- | --- | --- | ---
MobileNetV2 | - | 72.15%/90.65% | xx
MobileNetV2 | quant_post | xx%/xx% | xx
MobileNetV2 | quant_aware | xx%/xx% | xx
ResNet50 | - | 76.50%/93.00% | xx
ResNet50 | quant_post | xx%/xx% | xx
ResNet50 | quant_aware | xx%/xx% | xx

#### 剪裁

模型剪裁在不带来过多精度损失的前提下有效降低模型计算的FLOPs（floating point operations per second），PaddleSlim在多个模型上验证了均匀剪裁、敏感度剪裁、自动剪裁三种方式，并取得了一定收益：

模型 | 压缩方法 | Top-1/Top-5 Acc | 模型大小（MB） | FLOPs（M）
--- | --- | --- | --- | ---
MobileNetV2 | - | 72.15%/90.65% | xx | xx
MobileNetV2 | uniform -xx% | xx%/xx% | xx | xx
MobileNetV2 | sensitive -xx% | xx%/xx% | xx | xx
ResNet34 | - | 74.57%/92.14% | xx | xx
ResNet34 | uniform -xx% | xx%/xx% | xx | xx
ResNet34 | auto -xx% | xx%/xx% | xx | xx

#### 蒸馏

我们在多个图象分类和目标检测模型上应用了PaddleSlim的知识蒸馏功能，这些实验在不增加目标模型计算复杂度的前提下都一定程度提升了其精度表现：

模型 | 压缩方法 | Top-1/Top-5 Acc
--- | --- | ---
MobileNetV2 | - | 72.15%/90.65%
MobileNetV2 | ResNet50_vd distill | 74.28%/91.53%
ResNet50 | - | 76.50%/93.00%
ResNet50 | ResNet101 distill | 77.29%/93.65%

## 最佳实践

- Paddle检测库：介绍如何在PaddleDetection检测库中使用PaddleSlim。
- Paddle分割库：介绍如何在PaddleSeg分割库中使用PaddleSlim。
- PaddleLite：介绍如何使用预测库PaddleLite部署PaddleSlim产出的模型。

GitHub Next »