X86 CPU 上部署量化模型

概述

本文主要介绍在X86 CPU部署PaddleSlim产出的量化模型。

X86 CPU部署量化模型的步骤:

产出量化模型

X86 CPU预测端支持PaddleSlim量化训练方法和静态离线量化方法产出的量化模型。

关于使用PaddleSlim产出量化模型,请参考文档:

在产出部署在X86 CPU预测端的模型时,需要注意:

  • 静态离线量化方法支持的量化OP有conv2d, depthwise_conv2d, mul和matmul,所以 quant_post_static的输入参数 quantizable_op_type可以是这四个op的组合。

  • 量化训练方法支持的量化OP有conv2d, depthwise_conv2d, mul和matmul,所以 quant_aware 输入配置config中的quantize_op_types可以是这四个op的组合。

转换量化模型

在X86 CPU预测端上部署量化模型之前,需要对量化模型进行转换和优化操作。

安装Paddle

参考Paddle官网,安装Paddle最新CPU版本。

准备脚本

下载脚本到本地.

wget https://github.com/PaddlePaddle/Paddle/blob/develop/python/paddle/fluid/contrib/slim/tests/save_quant_model.py

转换量化模型

使用脚本转化量化模型,比如:

python save_quant_model.py \
    --quant_model_path=/PATH/TO/SAVE/FLOAT32/QUANT/MODEL \
    --int8_model_save_path=/PATH/TO/SAVE/INT8/MODEL

save_quant_model.py脚本的参数说明:

  • quant_model_path: 为输入参数,必填。为PaddleSlim产出的量化模型。

  • int8_model_save_path: 量化模型转换后保存的路径。

部署量化模型

检查机器

  • 大家可以通过在命令行输入lscpu查看本机支持指令。

  • 在支持avx512_vnni的CPU服务器上,如:Casecade Lake, Model name: Intel(R) Xeon(R) Gold X2XX,INT8精度和性能最高,INT8性能提升为FP32模型的3~3.7倍。

  • 在支持avx512但是不支持avx512_vnni的CPU服务器上,如:SkyLake, Model name:Intel(R) Xeon(R) Gold X1XX,INT8性能为FP32性能的1.5倍左右。

  • 请确保机器支持完整的avx512指令集。

预测部署

参考X86 Linux上预测部署示例X86 Windows上预测部署示例,准备预测库,对模型进行部署。

请注意:

  • 在X86 CPU预测端部署量化模型,必须开启MKLDNN和IrOptim。

  • 运行部署示例前需要参照下面代码修改配置文件

C++ 修改如下:

paddle_infer::Config config;

if (FLAGS_model_dir == "") {
  config.SetModel(FLAGS_model_file, FLAGS_params_file); // Load combined model
} else {
  config.SetModel(FLAGS_model_dir); // Load no-combined model
}

config.EnableMKLDNN();
config.SwitchIrOptim(true);
config.SetCpuMathLibraryNumThreads(FLAGS_threads);

auto predictor = paddle_infer::CreatePredictor(config);

Python 修改如下:

if args.model_dir == "":
    config = Config(args.model_file, args.params_file)
else:
    config = Config(args.model_dir)
config.enable_mkldnn()
config.switch_ir_optim(True)
config.set_cpu_math_library_num_threads(args.threads)

predictor = create_predictor(config)

性能benchmark

对于常见图像分类模型,在Casecade Lake机器上(例如Intel® Xeon® Gold 6271、6248,X2XX等),图片分类模型INT8模型预测性能可达FP32模型的3-3.7倍, 自然语言处理模型INT8模型预测性能可达到FP32的1.5-3倍;在SkyLake机器上(例如Intel® Xeon® Gold 6148、8180,X1XX等),图片分类INT8模型预测性能可达FP32模型的1.5倍左右。

图像分类INT8模型在 Xeon(R) 6271 上的精度和性能

图像分类INT8模型在 Intel(R) Xeon(R) Gold 6271 上精度

Model FP32 Top1 Accuracy INT8 Top1 Accuracy Top1 Diff FP32 Top5 Accuracy INT8 Top5 Accuracy Top5 Diff
MobileNet-V1 70.78% 70.74% -0.04% 89.69% 89.43% -0.26%
MobileNet-V2 71.90% 72.21% 0.31% 90.56% 90.62% 0.06%
ResNet101 77.50% 77.60% 0.10% 93.58% 93.55% -0.03%
ResNet50 76.63% 76.50% -0.13% 93.10% 92.98% -0.12%
VGG16 72.08% 71.74% -0.34% 90.63% 89.71% -0.92%
VGG19 72.57% 72.12% -0.45% 90.84% 90.15% -0.69%

图像分类INT8模型在 Intel(R) Xeon(R) Gold 6271 单核上性能

Model FP32 (images/s) INT8 (images/s) Ratio (INT8/FP32)
MobileNet-V1 74.05 216.36 2.92
MobileNet-V2 88.60 205.84 2.32
ResNet101 7.20 26.48 3.68
ResNet50 13.23 50.02 3.78
VGG16 3.47 10.67 3.07
VGG19 2.83 9.09 3.21
  • Accuracy: 准确率

  • images/s: 每秒推理的图片数量

自然语言处理INT8模型 Ernie, GRU, LSTM 模型在 Xeon(R) 6271 上的性能和精度

自然语言处理INT8模型 Ernie, GRU, LSTM 模型在 Xeon(R) 6271 上的性能

Ernie Latency FP32 Latency (ms) INT8 Latency (ms) Ratio (FP32/INT8)
Ernie 1 thread 237.21 79.26 2.99X
Ernie 20 threads 22.08 12.57 1.76X
GRU Performance (QPS) Naive FP32 INT8 Int8/Native FP32
GRU bs 1, thread 1 1108 1393 1.26
GRU repeat 1, bs 50, thread 1 2175 3199 1.47
GRU repeat 10, bs 50, thread 1 2165 3334 1.54
LSTM Performance (QPS) FP32 INT8 INT8 /FP32
LSTM 1 thread 4895.65 7190.55 1.47
LSTM 4 threads 6370.86 7942.51 1.25
  • ms: 毫秒

  • QPS: 每秒执行的推理次数

自然语言处理INT8模型 Ernie, GRU, LSTM 模型在 Xeon(R) 6271 上的精度

Ernie FP32 Accuracy INT8 Accuracy Accuracy Diff
accuracy 80.20% 79.44% -0.76%
LAC (GRU) FP32 INT8 Accuracy diff
accuracy 0.89326 0.89323 -0.00007
LSTM FP32 INT8
HX_ACC 0.933 0.925
CTC_ACC 0.999 1.000

Note: