同步操作将从 PaddlePaddle/PaddleSlim 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
本文主要介绍在CPU上转化PaddleSlim产出的量化模型并部署和预测的流程。对于常见图像分类模型,在Casecade Lake机器上(例如Intel® Xeon® Gold 6271、6248,X2XX等),INT8模型进行推理的速度通常是FP32模型的3-3.7倍;在SkyLake机器(例如Intel® Xeon® Gold 6148、8180,X1XX等)上,使用INT8模型进行推理的速度通常是FP32模型的1.5倍。
流程步骤如下:
参考资料:
Paddle和PaddleSlim版本必须配套安装。
Paddle 安装请参考官方安装文档。
PaddleSlim 安装请参考官方安装文档。
在用户自己的测试样例中,按以下方式导入Paddle和PaddleSlim:
import paddle
import paddle.fluid as fluid
import paddleslim as slim
import numpy as np
用户可以使用PaddleSlim产出量化训练模型或者离线量化模型。如果用户只想要验证部署和预测流程,可以跳过 2.1 和 2.2, 直接下载mobilenetv2 post-training quant model以及其对应的原始的FP32模型mobilenetv2 fp32。如果用户要转化部署自己的模型,请根据下面2.1, 2.2的步骤产出量化模型。
量化训练流程可以参考 分类模型的量化训练流程
量化训练过程中config参数:
depthwise_conv2d
, conv2d
, mul
, matmul
, transpose2
, reshape2
, pool2d
, scale
, concat
。但是在量化训练阶段插入fake_quantize/fake_dequantize算子时,只需在前四种op前后插入fake_quantize/fake_dequantize 算子,因为后面四种算子 transpose2
, reshape2
, pool2d
, scale
, concat
的scales将从其他op的out_threshold
属性获取。所以,在使用PaddleSlim量化训练时,只可以对 depthwise_conv2d
, conv2d
, mul
, matmul
进行量化,不支持其他op。离线量化模型产出可以参考分类模型的静态离线量化流程
在使用PaddleSlim离线量化时,只可以对 depthwise_conv2d
, conv2d
, mul
, matmul
进行量化,不支持其他op。
为了部署在CPU上,我们将保存的quant模型,通过一个转化脚本,移除fake_quantize/fake_dequantize op,进行算子融合和优化并且转化为INT8模型。
脚本在官网的位置为save_quant_model.py。
复制脚本到本样例所在目录(/PATH_TO_PaddleSlim/demo/mkldnn_quant/
),并执行如下命令:
python save_quant_model.py --quant_model_path=/PATH/TO/SAVE/FLOAT32/QUANT/MODEL --int8_model_save_path=/PATH/TO/SAVE/INT8/MODEL
参数说明:
--debug
选项运行脚本,并打开生成的文件int8_<number>_cpu_quantize_placement_pass.dot
,找出不需量化的op, ID号在Op名称后面的括号中。* .dot
文件,请使用系统上可用的任何Graphviz工具(例如Linux上的xdot
工具或Windows上的dot
工具有关文档,请参见Graphviz。conv2d
, depthwise_conv2d
, fc
, matmul
, pool2d
, reshape2
, transpose2
,scale
, concat
。--op_ids_to_skip
,只需要传入所有量化op中想要保持FP32类型的op ID号即可。ops_to_quantize
组合,也可以通过--op_ids_to_skip
排除部分可量化op ID,多运行几次获得最佳设置。在精度和性能预测中,需要先对数据进行二进制转化。运行脚本如下可转化完整ILSVRC2012 val数据集。使用--local
可以转化用户自己的数据。在Paddle所在目录运行下面的脚本。脚本在官网位置为full_ILSVRC2012_val_preprocess.py
python Paddle/paddle/fluid/inference/tests/api/full_ILSVRC2012_val_preprocess.py --local --data_dir=/PATH/TO/USER/DATASET/ --output_file=/PATH/TO/SAVE/BINARY/FILE
可选参数:
val_list.txt
用户自己的数据集目录结构应该如下
imagenet_user
├── val
│ ├── ILSVRC2012_val_00000001.jpg
│ ├── ILSVRC2012_val_00000002.jpg
| |── ...
└── val_list.txt
其中,val_list.txt 内容应该如下:
val/ILSVRC2012_val_00000001.jpg 0
val/ILSVRC2012_val_00000002.jpg 0
注意:
sample_tester.py
作为参考,与C++测试sample_tester.cc
相比,用户可以看到Python测试更大的性能开销。lscpu
查看本机支持指令。avx512_vnni
的CPU服务器上,INT8精度和性能最高,如:Casecade Lake, Model name: Intel(R) Xeon(R) Gold X2XX,INT8性能提升为FP32模型的3~3.7倍avx512
但是不支持avx512_vnni
的CPU服务器上,如:SkyLake, Model name:Intel(R) Xeon(R) Gold X1XX,INT8性能为FP32性能的1.5倍左右。用户可以从源码编译Paddle推理库,也可以直接下载推理库。
用户可以从Paddle源码编译Paddle推理库,参考从源码编译,使用release/2.0以上版本。
用户也可以从Paddle官网下载发布的预测库。请选择ubuntu14.04_cpu_avx_mkl
最新发布版或者develop版。
样例sample_tester.cc
所在目录为PaddleSlim下demo/mkldnn_quant/
。 编译时,设置PADDLE_LIB
为Paddle源码编译生成的预测库或者直接下载的预测库
cd /PATH/TO/PaddleSlim
cd demo/mkldnn_quant/
mkdir build && cd build
cmake -DPADDLE_LIB=path/to/paddle_inference_install_dir ..
make -j
# Bind threads to cores
export KMP_AFFINITY=granularity=fine,compact,1,0
export KMP_BLOCKTIME=1
# Turbo Boost could be set to OFF using the command
echo 1 | sudo tee /sys/devices/system/cpu/intel_pstate/no_turbo
# For 1 thread performance, by default the bash use 1 threads
# Set `MODEL_DIR` to `/PATH/TO/FLOAT32/MODEL` or `/PATH/TO/SAVE/INT8/MODEL`
# Set `DATA_FILE` to `/PATH/TO/SAVE/BINARY/FILE`
./run.sh path/to/MODEL_DIR path/to/DATA_FILE
# For 20 thread performance, set third parameter 20
./run.sh path/to/MODEL_DIR path/to/DATA_FILE 20
run.sh
中所有可选配置参数注释:
PATH/TO/SAVE/INT8/MODEL
, PATH/TO/SAVE/FLOAT32/MODEL
。无默认值。full_ILSVRC2012_val_preprocess
转化后的binary文件。paddle::AnalysisConfig
对模型优化、融合(fuse),加速。默认为false如果用户编写自己的测试:
paddle::NativeConfig
即可测试。在demo中,设置use_analysis
为false
。paddle::AnalysisConfig
对原始FP32模型先优化(fuses等)再测试。在样例中,直接设置use_analysis
为true
。AnalysisConfig设置如下:static void SetConfig(paddle::AnalysisConfig *cfg) {
cfg->SetModel(FLAGS_infer_model); // 必须。表示需要测试的模型
cfg->DisableGpu(); // 必须。部署在CPU上预测,必须Disablegpu
cfg->EnableMKLDNN(); //必须。表示使用MKLDNN算子,将比 native 快
cfg->SwitchIrOptim(); // 如果传入FP32原始,这个配置设置为true将优化加速模型
cfg->SetCpuMathLibraryNumThreads(FLAGS_num_threads); //非必须。默认设置为1。表示多线程运行
}
use_analysis
为true并且infer_model
传入原始FP32模型,AnalysisConfig的上述设置将被执行,传入的FP32模型将被DNNL优化加速(包括fuses等)。use_analysis
将不起任何作用,因为INT8模型已经被优化量化。use_analysis
即使设置为true不起作用,因为quant模型包含fake_quantize/fake_dequantize ops,无法fuse,无法优化。INT8模型精度和性能结果参考CPU部署预测INT8模型的精度和性能
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。