在x86 CPU上开发推理应用¶
简介¶
Paddle Inference在CPU上有:原生CPU、oneDNN和ONNX Runtime后端三种推理方式。还支持量化和低精度推理,加快模型推理速度。
本文档主要介绍使用Paddle Inference原生CPU、oneDNN和ONNX Runtime后端进行推理时,如何调用API进行配置。详细代码请参考:X86 Linux上预测部署示例和X86 Windows上预测部署示例
CPU原生推理¶
原生CPU推理在推理时,使用飞桨核心框架的标准OP实现进行推理计算,不依赖第三方计算库,推理时也无需额外配置。
配置文件开发说明¶
C++示例:
// 创建默认配置对象
paddle_infer::Config config;
// 设置预测模型路径
config.SetModel(FLAGS_model_file, FLAGS_params_file);
// 设置 CPU Blas 库线程数为 10
config.SetCpuMathLibraryNumThreads(10);
// 通过 API 获取 CPU 信息
int num_thread = config.cpu_math_library_num_threads();
python示例:
# 引用 paddle inference 预测库
import paddle.inference as paddle_infer
# 创建 config
config = paddle_infer.Config()
# 设置模型的文件夹路径
config.set_model("model.pdmodel", "model.pdiparam")
# 设置 CPU Blas 库线程数为 10
config.set_cpu_math_library_num_threads(10)
# 通过 API 获取 CPU 信息 - 10
print(config.cpu_math_library_num_threads())
oneDNN推理加速¶
oneDNN(原MKL-DNN)是由英特尔开发的开源深度学习软件包,支持神经网络在CPU上的高性能计算,在Paddle Inference中可通过一行配置打开oneDNN加速。
配置文件开发说明¶
C++示例:
// 创建默认配置对象
paddle_infer::Config config;
// 设置预测模型路径
config.SetModel(FLAGS_model_file, FLAGS_params_file);
// 启用 oneDNN 进行预测
config.EnableoneDNN();
// 通过 API 获取 oneDNN 启用结果 - true
std::cout << "Enable oneDNN is: " << config.oneDNN_enabled() << std::endl;
// 设置 oneDNN 的 cache 数量
// 当动态shape推理时,能缓存n个最新输入shape对应的oneDNN配置,减少shape变换时重新生成配置带来的开销
config.SetoneDNNCacheCapacity(1);
python示例:
# 引用 paddle inference 预测库
import paddle.inference as paddle_infer
# 创建 config
config = paddle_infer.Config()
# 设置模型的文件夹路径
config.set_model("model.pdmodel", "model.pdiparam")
# 启用 oneDNN 进行预测
config.enable_oneDNN()
# 通过 API 获取 oneDNN 启用结果 - true
print(config.oneDNN_enabled())
# 设置 oneDNN 的 cache 数量
# 当动态shape推理时,能缓存n个最新输入shape对应的oneDNN配置,减少shape变换时重新生配置带来的开销
config.set_oneDNN_cache_capacity(1)
SetMkldnnCacheCapacity
缓存机制的详细介绍: 官网文档
ONNX Runtime推理¶
ONNX Runtime是由微软开源的一款推理引擎,Paddle Inference通过Paddle2ONNX集成ONNX Runtime作为推理的后端之一,开发者在使用时,只需一行配置代码即可让模型通过ONNX Runtime进行推理。
配置文件开发说明¶
C++示例:
// 创建 Config 对象
paddle_infer::Config config(FLAGS_model_file, FLAGS_params_file);
// 启用 ONNXRuntime
config.EnableONNXRuntime();
// 通过 API 获取 ONNXRuntime 信息
std::cout << "Use ONNXRuntime is: " << config.use_onnxruntime() << std::endl; // true
// 开启ONNXRuntime优化
config.EnableORTOptimization();
// 设置 ONNXRuntime 算子计算线程数为 10
config.SetCpuMathLibraryNumThreads(10);
// 禁用 ONNXRuntime 进行预测
config.DisableONNXRuntime();
python示例:
# 引用 paddle inference 预测库
import paddle.inference as paddle_infer
# 创建 config
config = paddle_infer.Config("model.pdmodel", "model.pdiparams")
# 启用 ONNXRuntime 进行预测
config.enable_onnxruntime()
# 通过 API 获取 ONNXRuntime 信息
print("Use ONNXRuntime is: {}".format(config.onnxruntime_enabled())) # True
# 开启ONNXRuntime优化
config.enable_ort_optimization();
# 设置 ONNXRuntime 算子计算线程数为 10
config.set_cpu_math_library_num_threads(10)
# 禁用 ONNXRuntime 进行预测
config.DisableONNXRuntime();
# 通过 API 获取 ONNXRuntime 信息
print("Use ONNXRuntime is: {}".format(config.onnxruntime_enabled())) # false