pybind封装CreatePaddlePredictor()报错
Created by: GeminiHu
-
版本、环境信息: 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)
- 报错复现步骤
- 下载fluid_inference库到example.cpp与CMakeLists.txt的路径
- git clone pybind11到example.cpp的路径
- 修改CMakeLists.txt最后一行的最后一个参数为libpaddle_fluid.so的绝对路径
- 编译完成后执行python -c "import example; example.create_ernie_instance()"
- 问题描述: 项目背景是部署ERNIE的inference model在服务器,之前用python的load_inference_model api发现显存占用和training差不多, 都是十几个G,而用C++基于CreatePaddlePredictor API做inference的时候显存只占用3个G。所以尝试用pybind11封装CreatePaddlePredictor函数,以便在python中调用,然后就出现了以上报错信息。请问这个问题是什么原因造成的?另外如果已经有python的api是基于CreatePaddlePredictor实现的也烦请告知。谢谢!