C++ 预测 API介绍

    下面是详细介绍。

    使用AnalysisPredictor进行高性能预测

    Paddle Fluid采用 AnalysisPredictor 进行预测。AnalysisPredictor 是一个高性能预测引擎,该引擎通过对计算图的分析,完成对计算图的一系列的优化(如OP的融合、内存/显存的优化、 MKLDNN,TensorRT 等底层加速库的支持等),能够大大提升预测性能。

    为了展示完整的预测流程,下面是一个使用 AnalysisPredictor 进行预测的完整示例,其中涉及到的具体概念和配置会在后续部分展开详细介绍。

    AnalysisConfig管理AnalysisPredictor的预测配置,提供了模型路径设置、预测引擎运行设备选择以及多种优化预测流程的选项。配置方法如下:

    通用优化配置

    1. config->EnableMemoryOptim(); // 开启内存/显存复用

    Note: 使用ZeroCopyTensor必须设置:

    1. config->SwitchUseFeedFetchOps(false); // 关闭feed和fetch OP使用,使用ZeroCopy接口必须设置此项
    • 非combined形式:模型文件夹model_dir下存在一个模型文件和多个参数文件时,传入模型文件夹路径,模型文件名默认为__model__
    1. config->SetModel("./model_dir");
    • combined形式:模型文件夹model_dir下只有一个模型文件model和一个参数文件params时,传入模型文件和参数文件路径。

    配置CPU预测

    1. config->DisableGpu(); // 禁用GPU
    2. config->EnableMKLDNN(); // 开启MKLDNN,可加速CPU预测
    1. config->EnableUseGpu(100, 0); // 初始化100M显存,使用GPU ID为0
    2. config->GpuDeviceId(); // 返回正在使用的GPU ID
    3. // 开启TensorRT预测,可提升GPU预测性能,需要使用带TensorRT的预测库
    4. config->EnableTensorRtEngine(1 << 20 /*workspace_size*/,
    5. batch_size /*max_batch_size*/,
    6. 3 /*min_subgraph_size*/,
    7. AnalysisConfig::Precision::kFloat32 /*precision*/,
    8. false /*use_static*/,
    9. false /*use_calib_mode*/);

    使用ZeroCopyTensor管理输入/输出

    ZeroCopyTensor是AnalysisPredictor的输入/输出数据结构。ZeroCopyTensor的使用可以避免预测时候准备输入以及获取输出时多余的数据copy,提高预测性能。

    Note: 使用ZeroCopyTensor,务必在创建config时设置config->SwitchUseFeedFetchOps(false);

    1. // 通过创建的AnalysisPredictor获取输入和输出的tensor
    2. auto input_t = predictor->GetInputTensor(input_names[0]);
    3. auto output_names = predictor->GetOutputNames();
    4. auto output_t = predictor->GetOutputTensor(output_names[0]);
    5. // 对tensor进行reshape
    6. input_t->Reshape({batch_size, channels, height, width});
    7. // 通过copy_from_cpu接口,将cpu数据输入;通过copy_to_cpu接口,将输出数据copy到cpu
    8. input_t->copy_from_cpu<float>(input_data /*数据指针*/);
    9. output_t->copy_to_cpu(out_data /*数据指针*/);
    10. // 设置LOD
    11. std::vector<std::vector<size_t>> lod_data = {{0}, {0}};
    12. input_t->SetLoD(lod_data);
    13. // 获取Tensor数据指针
    14. int output_size;
    15. float *output_d = output_t->data<float>(PaddlePlace::kGPU, &output_size);
    1. 下载或编译paddle预测库,参考。

    2. 下载预测样例并解压,进入sample/inference目录下。

      inference 文件夹目录结构如下:

      • mobilenet_test.cc 为单线程预测的C++源文件
      • 为多线程预测的C++源文件
      • mobilenetv1 为模型文件夹
      • run.sh 为预测运行脚本文件
    3. 编译运行预测样例之前,需要根据运行环境配置编译与运行脚本run.shrun.sh的选项与路径配置的部分如下:

      1. # 设置是否开启MKL、GPU、TensorRT,如果要使用TensorRT,必须打开GPU
      2. WITH_MKL=ON
      3. WITH_GPU=OFF
      4. USE_TENSORRT=OFF
      5. # 按照运行环境设置预测库路径、CUDA库路径、CUDNN库路径、TensorRT路径、模型路径
      6. LIB_DIR=YOUR_LIB_DIR
      7. CUDA_LIB_DIR=YOUR_CUDA_LIB_DIR
      8. CUDNN_LIB_DIR=YOUR_CUDNN_LIB_DIR
      9. TENSORRT_ROOT_DIR=YOUR_TENSORRT_ROOT_DIR
      10. MODEL_DIR=YOUR_MODEL_DIR

      按照实际运行环境配置run.sh中的选项开关和所需lib路径。

    4. 编译与运行样例

      1. sh run.sh

    性能调优

    CPU下预测

    1. 在CPU型号允许的情况下,尽量使用带AVX和MKL的版本。
    2. 可以尝试使用Intel的 MKLDNN 加速。
    3. 在CPU可用核心数足够时,可以将设置config->SetCpuMathLibraryNumThreads(num);中的num值调高一些。
    1. 可以尝试打开 TensorRT 子图加速引擎, 通过计算图分析,Paddle可以自动将计算图中部分子图融合,并调用NVIDIA的 TensorRT 来进行加速,详细内容可以参考 。

    多线程预测

    Paddle Fluid支持通过在不同线程运行多个AnalysisPredictor的方式来优化预测性能,支持CPU和GPU环境。

    使用多线程预测的样例详见中下载的预测样例中的 thread_mobilenet_test.cc文件。可以将run.shmobilenet_test替换成thread_mobilenet_test再执行