README.md 5.0 KB
Newer Older
C
Chang Xu 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
# 图像分类模型自动压缩示例

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


## 1. 简介
本示例将以图像分类模型MobileNetV1为例,介绍如何使用PaddleClas中Inference部署模型进行自动压缩。本示例使用的自动压缩策略为量化训练和蒸馏。

## 2. Benchmark
- MobileNetV1模型

21
| 模型 | 策略 | Top-1 Acc | 耗时(ms) threads=4 |
C
Chang Xu 已提交
22
|:------:|:------:|:------:|:------:|
23
| MobileNetV1 | Base模型 | 70.90 | 39.041 |
C
Chang Xu 已提交
24 25 26 27
| MobileNetV1 | 量化+蒸馏 | 70.49 | 29.238|

- 测试环境:`SDM710 2*A75(2.2GHz) 6*A55(1.7GHz)`

28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
- MobileNetV1模型

| 模型 | 策略 | Top-1 Acc | 耗时(ms) threads=4 | Inference模型 |
|:------:|:------:|:------:|:------:|:------:|
| MobileNetV1 | Base模型 | 71.0 | - | [Model]() |
| MobileNetV1 | 量化+蒸馏 | 70.22 | -| [Model]() |

- 测试环境:

说明:
- MobileNetV1模型源自[tensorflow/models](http://download.tensorflow.org/models/mobilenet_v1_2018_02_22/mobilenet_v1_1.0_224.tgz),通过[X2Paddle](https://github.com/PaddlePaddle/X2Paddle)工具转换MobileNetV1预测模型步骤:

(1) 安装X2Paddle的1.3.6以上版本;(pip install x2paddle)

(2) 转换模型:
x2paddle --framework=tensorflow --model=tf_model.pb --save_dir=pd_model

即可得到MobileNetV1模型的预测模型(`model.pdmodel``model.pdiparams`)。如想快速体验,可直接下载上方表格中MobileNetV1的Base预测模型。

C
Chang Xu 已提交
47 48 49 50 51
## 3. 自动压缩流程

#### 3.1 准备环境

- python >= 3.6
C
ceci3 已提交
52 53
- PaddlePaddle >= 2.3 (可从[Paddle官网](https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/install/pip/linux-pip.html)下载安装)
- PaddleSlim develop版本
C
Chang Xu 已提交
54 55 56 57 58 59 60 61 62 63 64

安装paddlepaddle:
```shell
# CPU
pip install paddlepaddle
# GPU
pip install paddlepaddle-gpu
```

安装paddleslim:
```shell
65 66
https://github.com/PaddlePaddle/PaddleSlim.git
python setup.py install
C
Chang Xu 已提交
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
```

#### 3.2 准备数据集
本案例默认以ImageNet1k数据进行自动压缩实验,如数据集为非ImageNet1k格式数据, 请参考[PaddleClas数据准备文档](https://github.com/PaddlePaddle/PaddleClas/blob/release/2.3/docs/zh_CN/data_preparation/classification_dataset.md)


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

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

可在[PaddleClas预训练模型库](https://github.com/PaddlePaddle/PaddleClas/blob/release/2.3/docs/zh_CN/algorithm_introduction/ImageNet_models.md)中直接获取Inference模型,具体可参考下方获取MobileNetV1模型示例:

```shell
wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/MobileNetV1_infer.tar
82
tar -xf MobileNetV1_infer.tar
C
Chang Xu 已提交
83 84 85 86 87 88 89 90 91
```
也可根据[PaddleClas文档](https://github.com/PaddlePaddle/PaddleClas/blob/release/2.3/docs/zh_CN/inference_deployment/export_model.md)导出Inference模型。

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

蒸馏量化自动压缩示例通过run.py脚本启动,会使用接口```paddleslim.auto_compression.AutoCompression```对模型进行量化训练和蒸馏。配置config文件中模型路径、数据集路径、蒸馏、量化和训练等部分的参数,配置完成后便可开始自动压缩。

```shell
# 单卡启动
C
ceci3 已提交
92
export CUDA_VISIBLE_DEVICES=0
C
Chang Xu 已提交
93 94 95 96
python run.py \
    --model_dir='MobileNetV1_infer' \
    --model_filename='inference.pdmodel' \
    --params_filename='inference.pdiparams' \
97
    --save_dir='./output' \
C
Chang Xu 已提交
98
    --batch_size=128 \
99
    --config_path='./configs/mobilenetv1_qat_dis.yaml'\
C
Chang Xu 已提交
100
    --data_dir='ILSVRC2012'
101

C
Chang Xu 已提交
102 103 104 105 106
# 多卡启动
python -m paddle.distributed.launch run.py \
    --model_dir='MobileNetV1_infer' \
    --model_filename='inference.pdmodel' \
    --params_filename='inference.pdiparams' \
107
    --save_dir='./output' \
C
Chang Xu 已提交
108
    --batch_size=128 \
109 110
    --config_path='./configs/mobilenetv1_qat_dis.yaml'\
    --data_dir='ILSVRC2012'
C
Chang Xu 已提交
111 112 113 114 115 116 117 118 119
```


## 4.预测部署

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

120
## 5.FAQ
C
ceci3 已提交
121
[1.] 如果遇到报错 ```ValueError: var inputs not in this block``` ,则说明模型中的输入变量的名字不是 ```inputs``` ,可以先用netron可视化查看输入变量的名称,然后修改 ```run.py``` 中的第35行中 ``` yield {"inputs": imgs}``````yield {${input_tensor_name}: imgs}```。一般PaddleClas产出部署模型的输入名字如果不是 ```inputs```,则是 ```x```