model_prune_quantization.md 6.3 KB
Newer Older
C
cuicheng01 已提交
1

C
cuicheng01 已提交
2 3
# 模型量化、裁剪使用介绍

C
cuicheng01 已提交
4 5 6 7 8 9 10 11 12 13 14 15
复杂的模型有利于提高模型的性能,但也导致模型中存在一定冗余。此部分提供精简模型的功能,包括两部分:模型量化(量化训练、离线量化)、模型剪枝。

其中模型量化将全精度缩减到定点数减少这种冗余,达到减少模型计算复杂度,提高模型推理性能的目的。
模型量化可以在基本不损失模型的精度的情况下,将FP32精度的模型参数转换为Int8精度,减小模型参数大小并加速计算,使用量化后的模型在移动端等部署时更具备速度优势。

模型剪枝将CNN中不重要的卷积核裁剪掉,减少模型参数量,从而降低模型计算复杂度。

本教程将介绍如何使用飞桨模型压缩库PaddleSlim做PaddleClas模型的压缩,即裁剪、量化功能。
[PaddleSlim](https://github.com/PaddlePaddle/PaddleSlim) 集成了模型剪枝、量化(包括量化训练和离线量化)、蒸馏和神经网络搜索等多种业界常用且领先的模型压缩功能,如果您感兴趣,可以关注并了解。

在开始本教程之前,建议先了解[PaddleClas模型的训练方法](../models_training/classification.md)以及[PaddleSlim](https://paddleslim.readthedocs.io/zh_CN/latest/index.html),相关裁剪、量化方法可以参考[模型裁剪量化算法介绍文档](../algorithm_introduction/model_prune_quantization.md)

C
cuicheng01 已提交
16 17 18 19 20 21 22 23 24 25 26 27 28 29
## 目录

- [准备环境](#1)
    - [1.1 安装PaddleSlim](#1.1)
    - [1.2 准备训练好的模型](#1.2)
- [快速开始](#2)
    - [2.1 模型量化](#2.1)
        - [2.1.1 在线量化训练](2.1.1)
        - [2.1.2 离线量化](2.1.2)
    - [2.2 模型剪枝](#2.2)
- [导出模型](#3) 
- [模型部署](#4) 
- [训练超参数建议](#5) 

C
cuicheng01 已提交
30

C
cuicheng01 已提交
31 32
<a name="1"></a>
## 一、准备环境
C
cuicheng01 已提交
33 34 35 36 37 38 39 40 41
当训练出一个模型后,如果希望进一步的压缩模型大小并加速预测,可使用量化或者剪枝的方法压缩模型。

模型压缩主要包括五个步骤:
1. 安装 PaddleSlim
2. 准备训练好的模型
3. 模型压缩
4. 导出量化推理模型
5. 量化模型预测部署

C
cuicheng01 已提交
42 43
<a name="1.1"></a>
### 1.1 安装PaddleSlim
C
cuicheng01 已提交
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58

* 可以通过pip install的方式进行安装。

```bash
pip install paddleslim -i https://pypi.tuna.tsinghua.edu.cn/simple
```

* 如果获取PaddleSlim的最新特性,可以从源码安装。

```bash
git clone https://github.com/PaddlePaddle/PaddleSlim.git
cd Paddleslim
python3.7 setup.py install
```

C
cuicheng01 已提交
59 60
<a name="1.2"></a>
### 1.2 准备训练好的模型
C
cuicheng01 已提交
61 62 63

PaddleClas提供了一系列训练好的[模型](../models/models_intro.md),如果待量化的模型不在列表中,需要按照[常规训练](../models_training/classification.md)方法得到训练好的模型。

C
cuicheng01 已提交
64 65
<a name="2"></a>
## 二、 快速开始
C
cuicheng01 已提交
66 67 68 69 70 71 72 73 74

进入PaddleClas根目录

```bash
cd PaddleClas
```

`slim`训练相关代码已经集成到`ppcls/engine/`下,离线量化代码位于`deploy/slim/quant_post_static.py`

C
cuicheng01 已提交
75 76
<a name="2.1"></a>
### 2.1 模型量化
C
cuicheng01 已提交
77 78 79

量化训练包括离线量化训练和在线量化训练,在线量化训练效果更好,需加载预训练模型,在定义好量化策略后即可对模型进行量化。

C
cuicheng01 已提交
80 81
<a name="2.1.1"></a>
#### 2.1.1 在线量化训练
C
cuicheng01 已提交
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105

训练指令如下:

* CPU/单卡GPU

以CPU为例,若使用GPU,则将命令中改成`cpu`改成`gpu`

```bash
python3.7 tools/train.py -c ppcls/configs/slim/ResNet50_vd_quantization.yaml -o Global.device=cpu
```

其中`yaml`文件解析详见[参考文档](../models_training/config_description.md)。为了保证精度,`yaml`文件中已经使用`pretrained model`.


* 单机多卡/多机多卡启动

```bash
export CUDA_VISIBLE_DEVICES=0,1,2,3
python3.7 -m paddle.distributed.launch \
    --gpus="0,1,2,3" \
      tools/train.py \
      -c ppcls/configs/slim/ResNet50_vd_quantization.yaml
```

C
cuicheng01 已提交
106 107
<a name="2.1.2"></a>
#### 2.1.2 离线量化
C
cuicheng01 已提交
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

**注意**:目前离线量化,必须使用已经训练好的模型,导出的`inference model`进行量化。一般模型导出`inference model`可参考[教程](../inference_deployment/export_model.md).

一般来说,离线量化损失模型精度较多。

生成`inference model`后,离线量化运行方式如下

```bash
python3.7 deploy/slim/quant_post_static.py -c ppcls/configs/ImageNet/ResNet/ResNet50_vd.yaml -o Global.save_inference_dir=./deploy/models/class_ResNet50_vd_ImageNet_infer
```

`Global.save_inference_dir``inference model`存放的目录。

执行成功后,在`Global.save_inference_dir`的目录下,生成`quant_post_static_model`文件夹,其中存储生成的离线量化模型,其可以直接进行预测部署,无需再重新导出模型。

C
cuicheng01 已提交
123 124
<a name="2.2"></a>
### 2.2 模型剪枝
C
cuicheng01 已提交
125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145

训练指令如下:

- CPU/单卡GPU

以CPU为例,若使用GPU,则将命令中改成`cpu`改成`gpu`

```bash
python3.7 tools/train.py -c ppcls/configs/slim/ResNet50_vd_prune.yaml -o Global.device=cpu
```

- 单机单卡/单机多卡/多机多卡启动

```bash
export CUDA_VISIBLE_DEVICES=0,1,2,3
python3.7 -m paddle.distributed.launch \
    --gpus="0,1,2,3" \
      tools/train.py \
      -c ppcls/configs/slim/ResNet50_vd_prune.yaml
```

C
cuicheng01 已提交
146 147
<a name="3"></a>
## 三、导出模型
C
cuicheng01 已提交
148 149 150 151 152 153 154 155 156 157

在得到在线量化训练、模型剪枝保存的模型后,可以将其导出为inference model,用于预测部署,以模型剪枝为例:

```bash
python3.7 tools/export.py \
    -c ppcls/configs/slim/ResNet50_vd_prune.yaml \
    -o Global.pretrained_model=./output/ResNet50_vd/best_model \
    -o Global.save_inference_dir=./inference
```

C
cuicheng01 已提交
158 159
<a name="4"></a>
## 四、模型部署
C
cuicheng01 已提交
160

C
cuicheng01 已提交
161
上述步骤导出的模型可以直接使用inferecne进行部署,参考[inference部署](../inference_deployment/)
C
cuicheng01 已提交
162 163

也通过PaddleLite的opt模型转换工具,完成inference模型到移动端模型转换,用于移动端的模型部署。
C
cuicheng01 已提交
164
移动端模型部署的可参考 [移动端模型部署](../inference_deployment/paddle_lite_deploy.md)
C
cuicheng01 已提交
165

C
cuicheng01 已提交
166 167
<a name="5"></a>
## 五、训练超参数建议
C
cuicheng01 已提交
168 169 170 171

* 量化、裁剪训练时,建议加载常规训练得到的预训练模型,加速量化训练收敛。
* 量化训练时,建议初始学习率修改为常规训练的`1/20~1/10`,同时将训练epoch数修改为常规训练的`1/5~1/2`,学习率策略方面,加上Warmup,其他配置信息不建议修改。
* 裁剪训练时,建议超参数配置与普通训练一致。