目录:
本示例将以图像分类模型MobileNetV1为例,介绍如何使用PaddleClas中Inference部署模型进行自动压缩。本示例使用的自动压缩策略为量化训练和蒸馏。
模型 | 策略 | Top-1 Acc | GPU 耗时(ms) | ARM CPU 耗时(ms) | 配置文件 | Inference模型 |
---|---|---|---|---|---|---|
MobileNetV1 | Baseline | 70.90 | - | 33.15 | - | Model |
MobileNetV1 | 量化+蒸馏 | 70.57 | - | 13.64 | Config | Model |
ResNet50_vd | Baseline | 79.12 | 3.19 | - | - | Model |
ResNet50_vd | 量化+蒸馏 | 78.74 | 0.92 | - | Config | Model |
ShuffleNetV2_x1_0 | Baseline | 68.65 | - | 10.43 | - | Model |
ShuffleNetV2_x1_0 | 量化+蒸馏 | 68.32 | - | 5.51 | Config | Model |
SqueezeNet1_0 | Baseline | 59.60 | - | 35.98 | - | Model |
SqueezeNet1_0 | 量化+蒸馏 | 59.45 | - | 16.96 | Config | Model |
PPLCNetV2_base | Baseline | 76.86 | - | 36.50 | - | Model |
PPLCNetV2_base | 量化+蒸馏 | 76.39 | - | 15.79 | Config | Model |
PPHGNet_tiny | Baseline | 79.59 | 2.82 | - | - | Model |
PPHGNet_tiny | 量化+蒸馏 | 78.86 | 0.98 | - | Config | Model |
InceptionV3 | Baseline | 79.14 | 4.79 | - | - | Model |
InceptionV3 | 量化+蒸馏 | 78.32 | 1.47 | - | Config | Model |
EfficientNetB0 | Baseline | 77.02 | 1.95 | - | - | Model |
EfficientNetB0 | 量化+蒸馏 | 75.27 | 1.44 | - | Config | Model |
GhostNet_x1_0 | Baseline | 74.02 | 2.93 | - | - | Model |
GhostNet_x1_0 | 量化+蒸馏 | 72.62 | 1.03 | - | Config | Model |
MobileNetV3_large_x1_0 | Baseline | 75.32 | - | 16.62 | - | Model |
MobileNetV3_large_x1_0 | 量化+蒸馏 | 74.04 | - | 9.85 | Config | Model |
MobileNetV3_large_x1_0_ssld | Baseline | 78.96 | - | 16.62 | - | Model |
MobileNetV3_large_x1_0_ssld | 量化+蒸馏 | 77.17 | - | 9.85 | Config | Model |
ViT_base_patch16_224 | Baseline | 81.89 | 367.17(batch_size=40) | - | - | Model |
ViT_base_patch16_224 | 量化+蒸馏 | 82.05 | 51.70(batch_size=40) | - | Config | Model |
- ARM CPU 测试环境:
SDM865(4xA77+4xA55)
- Nvidia GPU 测试环境:
- 硬件:NVIDIA Tesla T4 单卡
- 软件:CUDA 11.2, cuDNN 8.0, TensorRT 8.4
- 测试配置:batch_size: 1, image size: 224
- python >= 3.6
- PaddlePaddle >= 2.4 (可从Paddle官网下载安装)
- PaddleSlim >= 2.4
安装paddlepaddle:
# CPU
pip install paddlepaddle==2.4.1
# GPU 以Ubuntu、CUDA 11.2为例
python -m pip install paddlepaddle-gpu==2.4.1.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
安装paddleslim:
pip install paddleslim
若使用run_ppclas.py
脚本,需安装paddleclas:
git clone https://github.com/PaddlePaddle/PaddleClas.git -b release/2.5
cd PaddleClas
pip install --upgrade -r requirements.txt
本案例默认以ImageNet1k数据进行自动压缩实验,如数据集为非ImageNet1k格式数据, 请参考PaddleClas数据准备文档。将下载好的数据集放在当前目录下./ILSVRC2012
。
预测模型的格式为:model.pdmodel
和 model.pdiparams
两个,带pdmodel
的是模型文件,带pdiparams
后缀的是权重文件。
注:其他像__model__
和__params__
分别对应model.pdmodel
和 model.pdiparams
文件。
可在PaddleClas预训练模型库中直接获取Inference模型,具体可参考下方获取MobileNetV1模型示例:
wget https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/MobileNetV1_infer.tar
tar -xf MobileNetV1_infer.tar
也可根据PaddleClas文档导出Inference模型。
蒸馏量化自动压缩示例通过run.py脚本启动,会使用接口 paddleslim.auto_compression.AutoCompression
对模型进行量化训练和蒸馏。配置config文件中模型路径、数据集路径、蒸馏、量化和训练等部分的参数,配置完成后便可开始自动压缩。
单卡启动
export CUDA_VISIBLE_DEVICES=0
python run.py --save_dir='./save_quant_mobilev1/' --config_path='./configs/MobileNetV1/qat_dis.yaml'
多卡启动
图像分类训练任务中往往包含大量训练数据,以ImageNet为例,ImageNet22k数据集中包含1400W张图像,如果使用单卡训练,会非常耗时,使用分布式训练可以达到几乎线性的加速比。
export CUDA_VISIBLE_DEVICES=0,1,2,3
python -m paddle.distributed.launch run.py --save_dir='./save_quant_mobilev1/' --config_path='./configs/MobileNetV1/qat_dis.yaml'
多卡训练指的是将训练任务按照一定方法拆分到多个训练节点完成数据读取、前向计算、反向梯度计算等过程,并将计算出的梯度上传至服务节点。服务节点在收到所有训练节点传来的梯度后,会将梯度聚合并更新参数。最后将参数发送给训练节点,开始新一轮的训练。多卡训练一轮训练能训练batch size * num gpus
的数据,比如单卡的batch size
为32,单轮训练的数据量即32,而四卡训练的batch size
为32,单轮训练的数据量为128。
注意:
-
参数设置:
learning rate
与batch size
呈线性关系,这里单卡batch size
为32,对应的learning rate
为0.015,那么如果batch size
减小4倍改为8,learning rate
也需除以4;多卡时batch size
为32,learning rate
需乘上卡数。所以改变batch size
或改变训练卡数都需要对应修改learning rate
。 -
如需要使用
PaddleClas
中的数据预处理和DataLoader
,可以使用run_ppclas.py
脚本启动,启动方式跟以上示例相同,但配置需要对其PaddleClas
,可参考ViT配置文件。
量化模型在GPU上可以使用TensorRT进行加速,在CPU上可以使用MKLDNN进行加速。
以下字段用于配置预测参数:
参数名 | 含义 |
---|---|
model_path | inference 模型文件所在目录,该目录下需要有文件 .pdmodel 和 .pdiparams 两个文件 |
model_filename | inference_model_dir文件夹下的模型文件名称 |
params_filename | inference_model_dir文件夹下的参数文件名称 |
data_path | 数据集路径 |
batch_size | 预测一个batch的大小 |
image_size | 输入图像的大小 |
use_gpu | 是否使用 GPU 预测 |
use_trt | 是否使用 TesorRT 预测引擎 |
use_mkldnn | 是否启用MKL-DNN 加速库,注意use_mkldnn 与use_gpu 同时为True 时,将忽略use_mkldnn ,而使用GPU 预测 |
cpu_num_threads | CPU预测时,使用CPU线程数量,默认10 |
use_fp16 | 使用TensorRT时,是否启用FP16 |
use_int8 | 是否启用INT8 |
注意:
-
请注意模型的输入数据尺寸,如InceptionV3输入尺寸为299,部分模型需要修改参数:
image_size
-
TensorRT预测:
环境配置:如果使用 TesorRT 预测引擎,需安装的是带有TensorRT的PaddlePaddle,使用以下指令查看本地cuda版本,并且在下载链接中下载对应cuda版本和对应python版本的PaddlePaddle安装包。
```shell
cat /usr/local/cuda/version.txt ### CUDA Version 10.2.89
### 10.2.89 为cuda版本号,可以根据这个版本号选择需要安装的带有TensorRT的PaddlePaddle安装包。
```
python paddle_inference_eval.py \
--model_path=models/ResNet50_vd_QAT \
--use_trt=True \
--use_int8=True \
--use_gpu=True \
--data_path=./dataset/ILSVRC2012/
- MKLDNN预测:
python paddle_inference_eval.py \
--model_path=models/ResNet50_vd_QAT \
--data_path=./dataset/ILSVRC2012/ \
--cpu_num_threads=10 \
--use_mkldnn=True \
--use_int8=True
PaddleLite端侧部署可参考: