README.md 12.1 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) |
Z
zhouzj 已提交
33 34
| BiSeNetV2 | Baseline |  73.17 | -|35.61| -| [model](https://bj.bcebos.com/v1/paddle-slim-models/act/PaddleSeg/BiSeNetV2.tar)|
| BiSeNetV2 | 量化训练 |  73.20 | - |15.94|[config](./configs/BiSeNetV2/BiSeNetV2_qat.yaml) | [model](https://bj.bcebos.com/v1/paddle-slim-models/act/PaddleSeg/qat/BiSeNetV2_qat.tar) |
35

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

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

  - 硬件:NVIDIA Tesla T4 单卡
  - 软件:CUDA 11.0, cuDNN 8.0, TensorRT 8.0
G
Guanghua Yu 已提交
42
  - 测试配置:batch_size: 40
43 44

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

46
## 3. 自动压缩流程
47

48
#### 3.1 准备环境
49

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

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

安装paddleslim:
63
```shell
64
pip install paddleslim
65 66
```

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

Z
zhouzj 已提交
72
安装paddleseg 2.5.0
73 74

```shell
75
pip install paddleseg==2.5.0
76 77
```

Z
zhouzj 已提交
78
注:安装[PaddleSeg](https://github.com/PaddlePaddle/PaddleSeg)的目的只是为了直接使用PaddleSeg中的Dataloader组件,不涉及模型组网等。本示例需安装**PaddleSeg 2.5.0**, 不同版本的PaddleSeg的Dataloader返回数据的格式略有不同.
79 80 81

#### 3.2 准备数据集

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

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

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

L
leiqing 已提交
93
**提示:**
C
ceci3 已提交
94 95 96 97 98 99 100 101 102 103
- 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)

104 105 106 107 108 109 110 111 112
#### 3.3 准备预测模型

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


160
## 4.预测部署
161

162
#### 4.1 Paddle Inference 验证性能
163

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

166
以下字段用于配置预测参数:
167

168 169 170 171 172 173 174 175 176 177 178 179 180
| 参数名 | 含义 |
|:------:|:------:|
| 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`。 |
181 182


183
- TensorRT预测:
184

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

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

189 190 191 192 193 194 195
```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
196 197
```

198
- MKLDNN预测:
199

200 201 202 203 204 205 206 207 208
```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
209 210
```

211
#### 4.2 Paddle Inference 测试单张图片
212

213
利用人像分割测试单张图片:
214

215 216 217 218 219 220 221
```shell
python paddle_inference_eval.py \
      --model_path=pp_humanseg_qat \
      --dataset='human' \
       --image_file=./data/human_demo.jpg \
      --use_trt=True \
      --precision=int8
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 254 255
<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>


256
### 4.3 更多部署教程
257 258 259 260 261

- [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)

262
## 5.FAQ