十八:Paddle Inference推理 (C++)API详解
3. 使用 CPU 进行预测
注意:
-
在
CPU
型号允许的情况下,进行预测库下载或编译试尽量使用带AVX
和MKL
的版本 -
可以尝试使用 Intel 的
MKLDNN
进行CPU
预测加速,默认CPU
不启用MKLDNN
-
在
CPU
可用核心数足够时,可以通过设置SetCpuMathLibraryNumThreads
将线程数调高一些,默认线程数为 1
3.1. CPU 设置
// 设置 CPU 加速库计算线程数
// 参数:cpu_math_library_num_threads - CPU 加速库计算线程数
// 返回:None
void SetCpuMathLibraryNumThreads(int cpu_math_library_num_threads);
// 获取 CPU 加速库计算线程数
// 参数:None
// 返回:int - CPU 加速库计算线程数
int cpu_math_library_num_threads() const;
代码示例:
// 创建默认 Config 对象
paddle_infer::Config config();
// 设置 CPU 加速库线程数为 10
config.SetCpuMathLibraryNumThreads(10);
// 通过 API 获取 CPU 信息
int num_thread = config.cpu_math_library_num_threads();
std::cout << "CPU thread number is: " << num_thread << std::endl; // 10
3.2. MKLDNN 设置
注意:
-
启用 MKLDNN 的前提为已经使用 CPU 进行预测,否则启用 MKLDNN 无法生效
-
启用 MKLDNN BF16 要求 CPU 型号可以支持 AVX512,否则无法启用 MKLDNN BF16
-
SetMkldnnCacheCapacity 请参考 MKLDNN cache设计文档
API定义如下:
// 启用 MKLDNN 进行预测加速
// 参数:None
// 返回:None
void EnableMKLDNN();// 判断是否启用 MKLDNN
// 参数:None
// 返回:bool - 是否启用 MKLDNN
bool mkldnn_enabled() const;// 设置 MKLDNN 针对不同输入 shape 的 cache 容量大小
// 参数:int - cache 容量大小
// 返回:None
void SetMkldnnCacheCapacity(int capacity);// 指定使用 MKLDNN 加速的 OP 列表
// 参数:std::unordered_setstd::string - 使用 MKLDNN 加速的 OP 列表
// 返回:None
void SetMKLDNNOp(std::unordered_setstd::string op_list);// 启用 MKLDNN BFLOAT16
// 参数:None
// 返回:None
void EnableMkldnnBfloat16();// 启用 MKLDNN INT8
// 参数:op_list - 使用 MKLDNN INT8 加速的 OP 列表
// 返回:None
void EnableMkldnnInt8(const std::unordered_setstd::string& op_list);// 判断是否启用 MKLDNN INT8
// 参数:None
// 返回:bool - 是否启用 MKLDNN INT8
bool mkldnn_int8_enabled() const;// 判断是否启用 MKLDNN BFLOAT16
// 参数:None
// 返回:bool - 是否启用 MKLDNN BFLOAT16
bool mkldnn_bfloat16_enabled() const;// 指定使用 MKLDNN BFLOAT16 加速的 OP 列表
// 参数:std::unordered_setstd::string - 使用 MKLDNN BFLOAT16 加速的 OP 列表
// 返回:None
void SetBfloat16Op(std::unordered_setstd::string op_list);
代码示例 (1):使用 MKLDNN 进行预测
// 创建 Config 对象
paddle_infer::Config config(FLAGS_infer_model + "/mobilenet.pdmodel",
FLAGS_infer_model + "/mobilenet.pdiparams");
// 启用 MKLDNN 进行预测
config.EnableMKLDNN();
// 通过 API 获取 MKLDNN 启用结果 - true
std::cout << "Enable MKLDNN is: " << config.mkldnn_enabled() << std::endl;
// 设置 MKLDNN 的 cache 容量大小
config.SetMkldnnCacheCapacity(1);
// 设置启用 MKLDNN 进行加速的 OP 列表
std::unordered_set<std::string> op_list = {"softmax", "elementwise_add", "relu"};
config.SetMKLDNNOp(op_list);
代码示例 (2):使用 MKLDNN BFLOAT16 进行预测
// 创建 Config 对象
paddle_infer::Config config(FLAGS_infer_model + "/mobilenet.pdmodel",
FLAGS_infer_model + "/mobilenet.pdiparams");
// 启用 MKLDNN 进行预测
config.EnableMKLDNN();
// 启用 MKLDNN BFLOAT16 进行预测
config.EnableMkldnnBfloat16();
// 设置启用 MKLDNN BFLOAT16 的 OP 列表
config.SetBfloat16Op({"conv2d"});
// 通过 API 获取 MKLDNN BFLOAT16 启用结果 - true
std::cout << "Enable MKLDNN BF16 is: " << config.mkldnn_bfloat16_enabled() << std::endl;
代码示例 (3):使用 MKLDNN INT8 进行预测
// 创建 Config 对象
paddle_infer::Config config(FLAGS_infer_model + "/mobilenet.pdmodel",
FLAGS_infer_model + "/mobilenet.pdiparams");
// 启用 MKLDNN 进行预测
config.EnableMKLDNN();
// 启用 MKLDNN INT8 进行预测
config.EnableMkldnnInt8();
// 通过 API 获取 MKLDNN INT8 启用结果 - true
std::cout << "Enable MKLDNN INT8 is: " << config.mkldnn_int8_enabled() << std::endl;