本示例将介绍如何使用离线量化接口paddleslim.quant.quant_post_static
来对训练好的分类模型进行离线量化, 无需对模型进行训练即可得到量化模型,减少模型的存储空间和显存占用。 本demo中模型均从PaddleClas模型库 中下载。
请参考 量化API文档。
PaddlePaddle >= 2.3 或develop版本
在demo
文件夹下创建data
文件夹,将ImageNet
数据集解压在data
文件夹下,解压后data/ILSVRC2012
文件夹下应包含以下文件:
'train'
文件夹,训练图片'train_list.txt'
文件'val'
文件夹,验证图片'val_list.txt'
文件
离线量化接口支持加载通过paddle.static.save_inference_model
接口或者paddle.jit.save
保存的静态图Inference模型。因此如果您的模型是通过其他接口保存的,需要先将模型进行转化。
图像分类的Inference模型均可从PaddleClas模型库的表格中下载得到。
- MobileNetV1模型准备:
wget -P inference_model https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/MobileNetV1_infer.tar
cd inference_model/
tar -xf MobileNetV1_infer.tar
- ResNet50模型准备:
wget -P inference_model https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/inference/ResNet50_infer.tar
cd inference_model/
tar -xf ResNet50_infer.tar
接下来对导出的模型文件进行静态离线量化,静态离线量化的脚本为quant_post.py,脚本中使用接口paddleslim.quant.quant_post_static
对模型进行离线量化。运行命令为:
# MobileNetV1
python quant_post.py --model_path ./inference_model/MobileNetV1_infer/ --save_path ./quant_model/MobileNet
# ResNet50
python quant_post.py --model_path ./inference_model/ResNet50_infer/ --save_path ./quant_model/ResNet50
- 参数列表:
参数名 | 解释 |
---|---|
model_path | 需要量化的模型所在路径 |
save_path | 量化后的模型保存的路径 |
model_filename | 如果需要量化的模型的参数文件保存在一个文件中,则设置为该模型的模型文件名称,如果参数文件保存在多个文件中,则不需要设置。 |
params_filename | 如果需要量化的模型的参数文件保存在一个文件中,则设置为该模型的参数文件名称,如果参数文件保存在多个文件中,则不需要设置。 |
algo | 激活量化使用的算法,默认是hist |
batch_size | 模型校准使用的batch size大小 |
batch_num | 模型校准时的总batch数量 |
round_type | 模型量化时四舍五入的方法,可选择round 和adaround ,默认是round |
onnx_format | 保存量化模型时的格式是否是ONNX通配格式,默认False |
is_full_quantize | 是否对模型进行全量化 |
input_name | 量化时模型输入的name,如果使用PaddleClas模型库中下载好的模型,保持默认为inputs,如果是自己导出模型,应设置:--input_name='x' ,可用VisualDL或Netron查看模型输入正确name |
运行以上命令后,可在${save_path}
下看到量化后的模型文件和参数文件。
使用eval.py脚本对量化前后的模型进行测试,得到模型的分类精度进行对比。
- 首先测试量化前的模型的精度,运行以下命令:
# MobileNetV1
python eval.py --model_path=./inference_model/MobileNetV1_infer --model_name=inference.pdmodel --params_name=inference.pdiparams
# ResNet50
python eval.py --model_path=./inference_model/ResNet50_infer --model_name=inference.pdmodel --params_name=inference.pdiparams
- 测试离线量化后的模型的精度:
# MobileNetV1
python eval.py --model_path ./quant_model/MobileNet/
# ResNet50
python eval.py --model_path ./quant_model/ResNet50/
- MobileNetV1的各类离线量化方法在imagenet 1K数据集上的Top1指标:(Base acc-top1:70.92)
策略 | abs_max | avg | mse | emd | hist | KL |
---|---|---|---|---|---|---|
Base | 69.42 | 70.14 | 70.32 | 70.29 | 70.29 | 70.33 |
bias_correction | 69.66 | 70.47 | 70.58 | 70.62 | 70.55 | 70.51 |
Adaround | 69.67 | 70.51 | 70.61 | 70.63 | 70.57 | 70.45 |
Adaround & bias_correction | 69.66 | 70.46 | 70.65 | 70.61 | 70.55 | 70.51 |
- ResNet50离线量化指标:
模型 | FP32 acc-top1 | INT8 acc-top1 | INT8 acc(adaround) |
---|---|---|---|
ResNet50 | 76.33 | 76.15 | 76.25 |