README.md 11.8 KB
Newer Older
1
# 语义分割模型自动压缩示例
2 3 4 5

目录:
- [1.简介](#1简介)
- [2.Benchmark](#2Benchmark)
6 7
- [3.开始自动压缩](#自动压缩流程)
  - [3.1 环境准备](#31-准备环境)
8 9 10
  - [3.2 准备数据集](#32-准备数据集)
  - [3.3 准备预测模型](#33-准备预测模型)
  - [3.4 自动压缩并产出模型](#34-自动压缩并产出模型)
11
- [4.预测部署](#4预测部署)
12 13 14 15
- [5.FAQ](5FAQ)

## 1.简介

L
leiqing 已提交
16
本示例将以语义分割模型[PP-HumanSeg-Lite](https://github.com/PaddlePaddle/PaddleSeg/tree/develop/contrib/PP-HumanSeg#portrait-segmentation)为例,介绍如何使用PaddleSeg中Inference部署模型进行自动压缩。本示例使用的自动压缩策略为非结构化稀疏、蒸馏和量化、蒸馏。
17 18 19

## 2.Benchmark

20 21 22 23
| 模型 | 策略  | Total IoU | ARM CPU耗时(ms)<br>thread=1 |Nvidia GPU耗时(ms)| 配置文件 | Inference模型  |
|:-----:|:-----:|:----------:|:---------:| :------:|:------:|:------:|
| PP-HumanSeg-Lite | Baseline |  92.87 | 56.363 |-| - | [model](https://paddleseg.bj.bcebos.com/dygraph/ppseg/ppseg_lite_portrait_398x224_with_softmax.tar.gz) |
| PP-HumanSeg-Lite | 非结构化稀疏+蒸馏 |  92.35 | 37.712 |-| [config](./configs/pp_human/pp_human_sparse.yaml)| - |
24
| PP-HumanSeg-Lite | 量化+蒸馏 |  92.84 | 49.656 |-| [config](./configs/pp_human/pp_human_qat.yaml) | [model](https://bj.bcebos.com/v1/paddle-slim-models/act/PaddleSeg/qat/pp_humanseg_qat.zip) (非最佳) |
25
| PP-Liteseg | Baseline |  77.04| - | 1.425| - |[model](https://paddleseg.bj.bcebos.com/tipc/easyedge/RES-paddle2-PPLIteSegSTDC1.zip)|
26
| PP-Liteseg | 量化训练 |  76.93 | - | 1.158|[config](./configs/pp_liteseg/pp_liteseg_qat.yaml) | [model](https://bj.bcebos.com/v1/paddle-slim-models/act/PaddleSeg/qat/pp_liteseg_qat.tar) |
27
| HRNet | Baseline |  78.97 | - |8.188|-| [model](https://paddleseg.bj.bcebos.com/tipc/easyedge/RES-paddle2-HRNetW18-Seg.zip)|
28
| HRNet | 量化训练 |  78.90 | - |5.812| [config](./configs/hrnet/hrnet_qat.yaml) | [model](https://bj.bcebos.com/v1/paddle-slim-models/act/PaddleSeg/qat/hrnet_qat.tar) |
29
| UNet | Baseline | 65.00  | - |15.291|-| [model](https://paddleseg.bj.bcebos.com/tipc/easyedge/RES-paddle2-UNet.zip) |
30
| UNet | 量化训练 |  64.93 | - |10.228| [config](./configs/unet/unet_qat.yaml) | [model](https://bj.bcebos.com/v1/paddle-slim-models/act/PaddleSeg/qat/unet_qat.tar) |
31
| Deeplabv3-ResNet50 | Baseline |  79.90 | -|12.766| -| [model](https://paddleseg.bj.bcebos.com/tipc/easyedge/RES-paddle2-Deeplabv3-ResNet50.zip)|
32
| Deeplabv3-ResNet50 | 量化训练 |  79.26 | - |8.839|[config](./configs/deeplabv3/deeplabv3_qat.yaml) | [model](https://bj.bcebos.com/v1/paddle-slim-models/act/PaddleSeg/qat/deeplabv3_qat.tar) |
33

L
leiqing 已提交
34
- ARM CPU测试环境:`高通骁龙710处理器(SDM710 2*A75(2.2GHz) 6*A55(1.7GHz))`
35

36 37 38 39 40 41 42
- Nvidia GPU测试环境:

  - 硬件:NVIDIA Tesla T4 单卡
  - 软件:CUDA 11.0, cuDNN 8.0, TensorRT 8.0
  - 测试配置:batch_size: 40, max_seq_len: 128

下面将以开源数据集为例介绍如何对PP-HumanSeg-Lite进行自动压缩。
43

44
## 3. 自动压缩流程
45

46
#### 3.1 准备环境
47

C
ceci3 已提交
48
- PaddlePaddle >= 2.3 (可从[Paddle官网](https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/install/pip/linux-pip.html)下载安装)
49
- PaddleSlim >= 2.3
50 51
- PaddleSeg >= 2.5

52 53 54 55 56 57 58 59 60
安装paddlepaddle:
```shell
# CPU
pip install paddlepaddle
# GPU
pip install paddlepaddle-gpu
```

安装paddleslim:
61
```shell
62
pip install paddleslim
63 64
```

L
leiqing 已提交
65 66 67 68 69
准备paddleslim示例代码:
```shell
git clone https://github.com/PaddlePaddle/PaddleSlim.git
```

70 71 72
安装paddleseg

```shell
73
pip install paddleseg==2.5.0
74 75
```

76
注:安装[PaddleSeg](https://github.com/PaddlePaddle/PaddleSeg)的目的只是为了直接使用PaddleSeg中的Dataloader组件,不涉及模型组网等。推荐安装PaddleSeg 2.5.0, 不同版本的PaddleSeg的Dataloader返回数据的格式略有不同.
77 78 79

#### 3.2 准备数据集

Z
zhouzj 已提交
80
开发者可下载开源数据集 (如[AISegment](https://github.com/aisegmentcn/matting_human_datasets)) 或自定义语义分割数据集。请参考[PaddleSeg数据准备文档](https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.5/docs/data/marker/marker_cn.md)来检查、对齐数据格式即可。
81

L
leiqing 已提交
82
本示例使用示例开源数据集 AISegment 数据集为例介绍如何对PP-HumanSeg-Lite进行自动压缩。示例数据集仅用于快速跑通自动压缩流程,并不能复现出 benckmark 表中的压缩效果。
83

C
ceci3 已提交
84
可以通过以下命令下载人像分割示例数据:
85
```shell
L
leiqing 已提交
86
cd PaddleSlim/example/auto_compression/semantic_segmentation
C
ceci3 已提交
87 88
python ./data/download_data.py mini_humanseg
### 下载后的数据位置为 ./data/humanseg/
89 90
```

L
leiqing 已提交
91
**提示:**
C
ceci3 已提交
92 93 94 95 96 97 98 99 100 101
- PP-HumanSeg-Lite压缩过程使用的数据集

  - 数据集:AISegment + PP-HumanSeg14K + 内部自建数据集。其中 AISegment 是开源数据集,可从[链接](https://github.com/aisegmentcn/matting_human_datasets)处获取;PP-HumanSeg14K 是 PaddleSeg 自建数据集,可从[官方渠道](https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.5/contrib/PP-HumanSeg/paper.md#pp-humanseg14k-a-large-scale-teleconferencing-video-dataset)获取;内部数据集不对外公开。
  - 示例数据集: 用于快速跑通人像分割的压缩和推理流程, 不能用该数据集复现 benckmark 表中的压缩效果。 [下载链接](https://paddleseg.bj.bcebos.com/humanseg/data/mini_supervisely.zip)

- PP-Liteseg,HRNet,UNet,Deeplabv3-ResNet50数据集

  - cityscapes: 请从[cityscapes官网](https://www.cityscapes-dataset.com/login/)下载完整数据
  - 示例数据集: cityscapes数据集的一个子集,用于快速跑通压缩和推理流程,不能用该数据集复现 benchmark 表中的压缩效果。[下载链接](https://bj.bcebos.com/v1/paddle-slim-models/data/mini_cityscapes/mini_cityscapes.tar)

102 103 104 105 106 107 108 109 110
#### 3.3 准备预测模型

预测模型的格式为:`model.pdmodel``model.pdiparams`两个,带`pdmodel`的是模型文件,带`pdiparams`后缀的是权重文件。

注:其他像`__model__``__params__`分别对应`model.pdmodel``model.pdiparams`文件。

- 如果想快速体验,可直接下载PP-HumanSeg-Lite 的预测模型:

```shell
Z
zhouzj 已提交
111
wget https://bj.bcebos.com/v1/paddlemodels/PaddleSlim/analysis/ppseg_lite_portrait_398x224_with_softmax.tar.gz
112 113 114 115 116 117 118
tar -xzf ppseg_lite_portrait_398x224_with_softmax.tar.gz
```

也可进入[PaddleSeg](https://github.com/PaddlePaddle/PaddleSeg) 中导出所需预测模型。

#### 3.4 自动压缩并产出模型

C
ceci3 已提交
119
自动压缩示例通过run.py脚本启动,会使用接口 ```paddleslim.auto_compression.AutoCompression``` 对模型进行自动压缩。首先要配置config文件中模型路径、数据集路径、蒸馏、量化、稀疏化和训练等部分的参数,配置完成后便可对模型进行非结构化稀疏、蒸馏和量化、蒸馏。
120

C
ceci3 已提交
121
当只设置训练参数,并在config文件中 ```Global``` 配置中传入 ```deploy_hardware``` 字段时,将自动搜索压缩策略进行压缩。以骁龙710(SD710)为部署硬件,进行自动压缩的运行命令如下:
Z
zhouzj 已提交
122 123

```shell
Z
zhouzj 已提交
124
# 单卡启动
C
ceci3 已提交
125
export CUDA_VISIBLE_DEVICES=0
C
ceci3 已提交
126
python run.py --config_path='./configs/pp_humanseg/pp_humanseg_auto.yaml' --save_dir='./save_compressed_model'
Z
zhouzj 已提交
127 128 129

# 多卡启动
export CUDA_VISIBLE_DEVICES=0,1
C
ceci3 已提交
130
python -m paddle.distributed.launch run.py --config_path='./configs/pp_humanseg/pp_humanseg_auto.yaml' --save_dir='./save_compressed_model'
Z
zhouzj 已提交
131
```
C
ceci3 已提交
132

Z
zhouzj 已提交
133 134
- 自行配置稀疏参数进行非结构化稀疏和蒸馏训练,配置参数含义详见[自动压缩超参文档](https://github.com/PaddlePaddle/PaddleSlim/blob/27dafe1c722476f1b16879f7045e9215b6f37559/demo/auto_compression/hyperparameter_tutorial.md)。具体命令如下所示:
```shell
Z
zhouzj 已提交
135
# 单卡启动
C
ceci3 已提交
136
export CUDA_VISIBLE_DEVICES=0
C
ceci3 已提交
137
python run.py --config_path='./configs/pp_humanseg/pp_humanseg_sparse.yaml' --save_dir='./save_sparse_model'
Z
zhouzj 已提交
138 139 140

# 多卡启动
export CUDA_VISIBLE_DEVICES=0,1
C
ceci3 已提交
141
python -m paddle.distributed.launch run.py --config_path='./configs/pp_humanseg/pp_humanseg_sparse.yaml' --save_dir='./save_sparse_model'
Z
zhouzj 已提交
142 143 144
```

- 自行配置量化参数进行量化和蒸馏训练,配置参数含义详见[自动压缩超参文档](https://github.com/PaddlePaddle/PaddleSlim/blob/27dafe1c722476f1b16879f7045e9215b6f37559/demo/auto_compression/hyperparameter_tutorial.md)。具体命令如下所示:
145
```shell
Z
zhouzj 已提交
146
# 单卡启动
C
ceci3 已提交
147
export CUDA_VISIBLE_DEVICES=0
C
ceci3 已提交
148
python run.py --config_path='./configs/pp_humanseg/pp_humanseg_qat.yaml' --save_dir='./save_quant_model'
Z
zhouzj 已提交
149 150 151

# 多卡启动
export CUDA_VISIBLE_DEVICES=0,1
C
ceci3 已提交
152
python -m paddle.distributed.launch run.py --config_path='./configs/pp_humanseg/pp_humanseg_qat.yaml' --save_dir='./save_quant_model'
153 154 155 156 157
```

压缩完成后会在`save_dir`中产出压缩好的预测模型,可直接预测部署。


158
## 4.预测部署
159

160
#### 4.1 Paddle Inference 验证性能
161

162
量化模型在GPU上可以使用TensorRT进行加速,在CPU上可以使用MKLDNN进行加速。
163

164
以下字段用于配置预测参数:
165

166 167 168 169 170 171 172 173 174 175 176 177 178
| 参数名 | 含义 |
|:------:|:------:|
| model_path | inference 模型文件所在目录,该目录下需要有文件 .pdmodel 和 .pdiparams 两个文件 |
| model_filename | inference_model_dir文件夹下的模型文件名称 |
| params_filename | inference_model_dir文件夹下的参数文件名称 |
| dataset | 选择数据集的类型,可选:`human`, `cityscape`。  |
| dataset_config | 数据集配置的config  |
| image_file | 待测试单张图片的路径,如果设置image_file,则dataset_config将无效。   |
| device | 预测时的设备,可选:`CPU`, `GPU`。  |
| use_trt | 是否使用 TesorRT 预测引擎,在device为```GPU```时生效。   |
| use_mkldnn | 是否启用```MKL-DNN```加速库,注意```use_mkldnn```,在device为```CPU```时生效。  |
| cpu_threads | CPU预测时,使用CPU线程数量,默认10  |
| precision | 预测时精度,可选:`fp32`, `fp16`, `int8`。 |
179 180


181
- TensorRT预测:
182

183
环境配置:如果使用 TesorRT 预测引擎,需安装 ```WITH_TRT=ON``` 的Paddle,下载地址:[Python预测库](https://paddleinference.paddlepaddle.org.cn/master/user_guides/download_lib.html#python)
184

185
准备好预测模型,并且修改dataset_config中数据集路径为正确的路径后,启动测试:
186

187 188 189 190 191 192 193
```shell
python paddle_inference_eval.py \
      --model_path=pp_liteseg_qat \
      --dataset='cityscape' \
      --dataset_config=configs/dataset/cityscapes_1024x512_scale1.0.yml \
      --use_trt=True \
      --precision=int8
194 195
```

196
- MKLDNN预测:
197

198 199 200 201 202 203 204 205 206
```shell
python paddle_inference_eval.py \
      --model_path=pp_liteseg_qat \
      --dataset='cityscape' \
      --dataset_config=configs/dataset/cityscapes_1024x512_scale1.0.yml \
      --device=CPU \
      --use_mkldnn=True \
      --precision=int8 \
      --cpu_threads=10
207 208
```

209
#### 4.2 Paddle Inference 测试单张图片
210

211
利用人像分割测试单张图片:
212

213 214 215 216 217 218 219
```shell
python paddle_inference_eval.py \
      --model_path=pp_humanseg_qat \
      --dataset='human' \
       --image_file=./data/human_demo.jpg \
      --use_trt=True \
      --precision=int8
220 221
```

222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253
<table><tbody>

<tr>
<td>
原始图片
</td>
<td>
<img src="https://bj.bcebos.com/v1/paddle-slim-models/act/PaddleSeg/images/humanseg_demo.jpeg" width="340" height="200">
</td>
</tr>

<tr>
<td>
FP32推理结果
</td>
<td>
<img src="https://bj.bcebos.com/v1/paddle-slim-models/act/PaddleSeg/images/humanseg_result_fp32_demo.png" width="340" height="200">
</td>
</tr>

<tr>
<td>
Int8推理结果
</td>
<td>
<img src="https://bj.bcebos.com/v1/paddle-slim-models/act/PaddleSeg/images/humanseg_result_qat_demo.png" width="340" height="200">
</td>
</tr>

</tbody></table>


254
### 4.3 更多部署教程
255 256 257 258 259

- [Paddle Inference Python部署](https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.5/docs/deployment/inference/python_inference.md)
- [Paddle Inference C++部署](https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.5/docs/deployment/inference/cpp_inference.md)
- [Paddle Lite部署](https://github.com/PaddlePaddle/PaddleSeg/blob/release/2.5/docs/deployment/lite/lite.md)

260
## 5.FAQ