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;
相关推荐
巴依老爷coder几秒前
YOLOX的正负样本分配问题
人工智能·yolo·计算机视觉·目标跟踪
没有不重的名么2 分钟前
DETR:End-to-End Object Detection with Transformers
人工智能·目标检测·计算机视觉
goomind3 分钟前
YOLOv8实战无人机视角目标检测
人工智能·yolo·目标检测·计算机视觉·无人机·pyqt5·无人机目标检测
机器学习之心3 分钟前
异常检测 | 高斯分布拟合算法异常数据检测(Matlab)
算法·数学建模·matlab·异常数据检测
算家云5 分钟前
一键生成唯美动漫图:ComfyUI-tPonynai详细搭建教程
人工智能·aigc·模型搭建·算家云·算力租赁·tponynai·动漫图生成
chenchihwen9 分钟前
大型语言模型LLM - Finetuning vs Prompting
人工智能·语言模型·自然语言处理
cdut_suye9 分钟前
C++11新特性探索:Lambda表达式与函数包装器的实用指南
开发语言·数据库·c++·人工智能·python·机器学习·华为
weixin_5436628611 分钟前
BERT的中文问答系统36-1
人工智能·python·bert
L_cl11 分钟前
NLP 1、人工智能与NLP简介
人工智能·自然语言处理
weixin_4314708613 分钟前
人名分类器(nlp)
人工智能·pytorch·python·深度学习·自然语言处理