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;
相关推荐
飞哥数智坊7 小时前
从CodeBuddy翻车到MasterGo救场,我的小程序UI终于焕然一新
人工智能
AKAMAI9 小时前
跳过复杂环节:Akamai应用平台让Kubernetes生产就绪——现已正式发布
人工智能·云原生·云计算
新智元11 小时前
阿里王牌 Agent 横扫 SOTA,全栈开源力压 OpenAI!博士级难题一键搞定
人工智能·openai
新智元11 小时前
刚刚,OpenAI/Gemini 共斩 ICPC 2025 金牌!OpenAI 满分碾压横扫全场
人工智能·openai
机器之心11 小时前
OneSearch,揭开快手电商搜索「一步到位」的秘技
人工智能·openai
阿里云大数据AI技术11 小时前
2025云栖大会·大数据AI参会攻略请查收!
大数据·人工智能
YourKing12 小时前
yolov11n.onnx格式模型转换与图像推理
人工智能
sans_12 小时前
NCCL的用户缓冲区注册
人工智能
集成显卡12 小时前
windows 下使用 bat 批处理运行 Chrome 无头模式刷一波访问量
windows·程序员
sans_12 小时前
三种视角下的Symmetric Memory,下一代HPC内存模型
人工智能