pybind封装CreatePaddlePredictor()报错

fnvucqvd  于 2022-10-20  发布在  其他
关注(0)|答案(2)|浏览(165)
  • 版本、环境信息:

   1)PaddlePaddle版本:1.3
   2)CPU:预测若用CPU,请提供CPU型号,MKL/OpenBlas/MKLDNN/等数学库使用情况
   3)GPU:V100
   4)系统环境:Ubuntu 5.4.0-6ubuntu1~16.04.5, Python 3.7.1
-预测信息
   1)C++预测:预测库安装包的version.txt文件

GIT COMMIT ID: 4b3f9e5c61d687ea90e6599bf9494df92ed088fb
      WITH_MKL: ON
      WITH_MKLDNN: ON
      WITH_GPU: ON
      CUDA version: 9.0
      CUDNN version: v7

 2)CMakeLists.txt

MAKE_MINIMUM_REQUIRED(VERSION 3.2)
PROJECT(inference_demo)

add_subdirectory(pybind11)
pybind11_add_module(example example.cpp)

SET(CMAKE_C_COMPILER gcc)
SET(CMAKE_CXX_COMPILER g++)
ADD_COMPILE_OPTIONS(-std=c++11 -D_GLIBCXX_USE_CXX11_ABI=0)

SET(FLUID_INFER_LIB ${CMAKE_SOURCE_DIR}/fluid_inference)
SET(FLUID_INC_PATH ${FLUID_INFER_LIB}/paddle/include)
SET(FLUID_LIB_PATH ${FLUID_INFER_LIB}/paddle/lib)

INCLUDE_DIRECTORIES(${FLUID_INC_PATH})

LINK_DIRECTORIES(${FLUID_LIB_PATH})

TARGET_LINK_LIBRARIES(example PRIVATE absolute/path/to/libpaddle_fluid.so)

 3)API信息 CreatePaddlePredictor
   4)预测库来源:官网下载
5) 代码


# include <paddle_inference_api.h>

# include <unistd.h>

# include <iostream>

# include <string>

# include <vector>

# include <pybind11/pybind11.h>

namespace py = pybind11;

void CreateErnieInstance() {
  std::string model_dir = "/path/to/model/dir";
  bool use_gpu = true;
  const char *file_path = model_dir.c_str();
  if (access(file_path, F_OK) == 0){
       std::cout << "model dir exists!" << std::endl;
  }

  paddle::NativeConfig config;
  config.model_dir = model_dir;
  if (use_gpu) {
      config.use_gpu = true;
      config.fraction_of_gpu_memory = 0.15;
      config.device = 0;
  }

  std::cout << "before creating predictor" << std::endl;
  auto predictor = CreatePaddlePredictor(config);
  std::cout << "after creating predictor" << std::endl;
}

PYBIND11_MODULE(example, m) {
   m.doc() = "ernie inference core";
   m.def("create_ernie_instance", &CreateErnieInstance, "A function which creates ernie inference instance");
}
  • 报错信息:

执行到"auto predictor = CreatePaddlePredictor(config);"时候会报错: Segmentation fault (core dumped)

  1. 报错复现步骤

  2. 下载fluid_inference库到example.cpp与CMakeLists.txt的路径

  3. git clone pybind11到example.cpp的路径

  4. 修改CMakeLists.txt最后一行的最后一个参数为libpaddle_fluid.so的绝对路径

  5. 编译完成后执行python -c "import example; example.create_ernie_instance()"

  6. 问题描述:
    项目背景是部署ERNIE的inference model在服务器,之前用python的load_inference_model api发现显存占用和training差不多, 都是十几个G,而用C++基于CreatePaddlePredictor API做inference的时候显存只占用3个G。所以尝试用pybind11封装CreatePaddlePredictor函数,以便在python中调用,然后就出现了以上报错信息。请问这个问题是什么原因造成的?另外如果已经有python的api是基于CreatePaddlePredictor实现的也烦请告知。谢谢!

vyswwuz2

vyswwuz21#

建议裸用 c++ SDK,pybind封装的问题人力有限没法支持。

Predictor 的 python 接口会在1.5版本发布,目前没有文档,也无法支持相关使用问题。

目前正在开发的相关封装 https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/pybind/inference_api.cc

可以参考,但中间问题人力有限只能等接口发布后再做支持

gpnt7bae

gpnt7bae2#

十分感谢,请问你们大概打算是什么时间发布1.5?

相关问题