Paddle Inference部署推理(十八)

十八:Paddle Inference推理 (C++)API详解

3. 使用 CPU 进行预测

注意:

  • CPU 型号允许的情况下,进行预测库下载或编译试尽量使用带 AVXMKL 的版本

  • 可以尝试使用 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;
相关推荐
The Open Group1 小时前
英特尔公司Darren Pulsipher 博士:以架构之力推动政府数字化转型
大数据·人工智能·架构
胡萝卜3.01 小时前
数据结构初阶:排序算法(一)插入排序、选择排序
数据结构·笔记·学习·算法·排序算法·学习方法
地平线开发者1 小时前
LLM 中 token 简介与 bert 实操解读
算法·自动驾驶
Ronin-Lotus1 小时前
深度学习篇---卷积核的权重
人工智能·深度学习
.银河系.1 小时前
8.18 机器学习-决策树(1)
人工智能·决策树·机器学习
敬往事一杯酒哈1 小时前
第7节 神经网络
人工智能·深度学习·神经网络
三掌柜6661 小时前
NVIDIA 技术沙龙探秘:聚焦 Physical AI 专场前沿技术
大数据·人工智能
scx201310042 小时前
20250814 最小生成树和重构树总结
c++·算法·最小生成树·重构树
2502_927161282 小时前
DAY 42 Grad-CAM与Hook函数
人工智能
阿巴~阿巴~2 小时前
冒泡排序算法
c语言·开发语言·算法·排序算法