Skip to content

Latest commit

 

History

History
101 lines (75 loc) · 7.16 KB

how_to_add_backend.md

File metadata and controls

101 lines (75 loc) · 7.16 KB

FastDeploy中集成了多种推理后端,分别用于在不同硬件上的部署。例如CPU上支持OpenVINO/Paddle Inference/ONNX Runtime后端。

  1. 在常见的硬件上,可能会存在一种硬件被多个后端支持,例如CPU被OpenVINO/Paddle Inference/ONNX Runtime后端支持,GPU被Paddle Inference/ONNX Runtime/TensorRT支持;
  2. 也存在一个后端支持多种硬件,例如Paddle Inference同时支持CPU/GPU, Paddle Lite支持 ARM CPU/昆仑芯/昇腾等;
  3. 也存在一个后端只支持1种硬件,例如瑞芯微3588则只对应1种后端。

本文档接下来介绍在FastDeploy中接入一个新的后端流程,一种后端的接入代码修改都在

FastDeploy/fastdeploy/runtime/

模块下。

后端接入流程

1. 各类枚举变量的创建

主要用于在FastDeploy中声明新加入的后端,以及后端对应支持的硬件。修改的内容需要包括

  1. 如新增硬件支持,修改枚举类型fastdeploy/runtime/enum_variables.h::Device
  2. 新增后端支持,修改枚举类型fastdeploy/runtime/enum_variables.h::Backend
  3. 如若引入的新的模型格式,修改枚举类型fastdeploy/runtime/enum_variables.h::ModelFormat
  4. 修改全局变量fastdeploy/runtime/enum_variables.h::s_default_backends_by_format,该变量表示各模型格式被哪些后端直接支持加载
  5. 修改全局变量fastdeploy/runtime/enum_variables.h::s_default_backends_by_device,该变量表示各硬件被哪些后端支持

除上述5处,另外也同时修改fastdeploy/runtime/enum_variables.cc,加入各枚举类型被输出运算符重载的实现,参照其它后端或硬件即可。

2. 实现backend接口

此步骤的代码实现则需创建fastdeploy/runtime/backends/new_backend目录,建议在此目录下实现以下代码文件(不强制要求命名或文件数量,具体根据实现需求来加)

  1. fastdeploy/runtime/backends/new_backend/option.h 此文件请按照这个命名方式,并在代码中添加NewBackendOption结构体的实现,用于配置后端运行时的参数(注意此结构体所有函数实现均在这个头文件中,只使用C++内置数据结构,不引入后端自定义类型);
  2. fastdeploy/runtime/backends/new_backend/new_backend.h在此代码中添加NewBackend类定义,并继承fastdeploy/runtime/backends/backend.h::BaseBackend,实现相应的接口

3. Backend集成进FastDeploy Runtime

在第2步后,已经可以通过Backend进行模型的加载、预测,并获取输出结果。接下来则是将Backend集成进Runtime,实现统一的推理接口。

  1. 修改fastdeploy/runtime/runtime_option.h,添加新的接口
    1. 如有新硬件,增加UseHardware()接口,可以在此接口中添加对硬件配置的参数,如device_id等,但都给定默认参数
    2. 增加UseNewBackend(),可以在此接口中添加对后端配置的参数,但都给定默认参数
    3. 增加成员变量NewBackendOption new_backend_option, 对于更高级的配置,可以让开发者通过RuntimeOption.new_backend_option的访问方式来修改
  2. 修改fastdeploy/runtime/runtime.h
    1. 创建私有函数CreateNewBackend()函数,并仿照其它CreateXXXBackend()函数完成实现
    2. Init()函数实现根据backend字段调用CreateNewBackend()的逻辑

4. 编译CMake配置

在完成1,2,3步骤后,我们已经完成了代码的开发,接下来是开发编译流程。这个步骤中涉及到修改3个文件,FastDeploy/CMakeLists.txtFastDeploy/cmake/new_backend.cmakeFastDeploy/FastDeploy.cmake.in,分别是编译的主入口,依赖库的配置入口,以及FastDeploy提供经开发者依赖的配置入口。

  1. 创建FastDeploy/cmake/new_backend.cmake,可参照同目录下的rknpu2.cmake,用于配置第三方库的下载,头文件的引入,以及库的引入
  2. 修改FastDeploy/CMakeLists.txt,注意有以下几处修改
    1. 参照其它后端代码,添加option(ENABLE_NEW_BACKEND)用于控制编译FastDeploy时是否集成此后端
    2. 参照其它后端代码,添加file(GLOB_RECURSE DEPLOY_BACKEND_SRCS)用于将新后端集成的代码查找到,并以列表的形式存储到DEPLOY_NEW_BACKEND_SRCS中,并在CMakeLists.txt中的list(REMOVE_ITEM ALL_DEPLOY_SRCS)中移除所有的DEPLOY_NEW_BACKEND_SRCS
    3. 参照其它后端代码,添加if(ENABLE_NEW_BACKEND)的代码逻辑,用于将代码加入进来,添加相应库链接
  3. 修改FastDeploy/FastDeploy.cmake.in(此文件为生成模版,会根据编译时配置,生成FastDeploy.cmake文件,用于提供给编译好FastDeploy库后,帮助开发者快速依赖编译好的FD库进行C++部署),在开始处获取编译参数,同时添加相应逻辑
    • if(ENABLE_ORT_BACKEND)
      if (ORT_DIRECTORY)
      set(ORT_LIB_PATH ${ORT_DIRECTORY}/lib)
      else()
      set(ORT_LIB_PATH ${CMAKE_CURRENT_LIST_DIR}/third_libs/install/onnxruntime/lib)
      endif()
      message(STATUS "The path of ONNXRuntime is ${ORT_LIB_PATH}.")
      find_library(ORT_LIB onnxruntime ${ORT_LIB_PATH} NO_DEFAULT_PATH)
      list(APPEND FASTDEPLOY_LIBS ${ORT_LIB})
      endif()

最后还需要再修改FastDeploy/fastdeploy/core/config.h.in文件,加入宏定义

#ifndef ENABLE_ORT_BACKEND
#cmakedefine ENABLE_ORT_BACKEND
#endif

至此我们已经完成了C++集成FastDeploy的后端,可以进行C++的后端测试工作

5. C++后端测试

在完成上述部署后,即可编译FastDeploy库

cd FastDeploy
mkdir build && cd build
cmake .. -DENABLE_NEW_BACKEND=ON -DCMAKE_INSTALL_PREFIX=${PWD}/installed_fd
make -j
make install

即在当前目录生成FastDeploy C++部署库installed_fd

我们可参照 https://github.com/PaddlePaddle/FastDeploy/tree/develop/examples/runtime/cpp 此处的示例,写一个新增后端加载模型并推理测试,验证无问题即可。

6. Python接口绑定

在完成C++后端开发后,如有进一步Python接口支持的需求,仅需在FastDeploy快速绑定几个基础的接口即可。

  1. NewBackendOption的绑定,可参照OrtBackend中Option的绑定方式,在runtime/backends/new_backend下新增option_pybind.cc来绑定自己的数据结构
  2. runtime/option_pybind.cc中参照BindOrtOption方式,进行声明和调用
  3. 由于C++开发中,我们修改了runtime/option.h新增了UseXXX接口,因此也需要修改runtime/option_pybind.ccRuntimeOption的绑定,新增use_xxx函数的绑定,同时修改FastDeploy/python/fastdeploy/runtime.py,增加use_xxxpython函数调用
  4. Python编译时,我们无法通过命令行传参,所以FastDeploy通过获取环境变量来修改编译参数。 修改FastDeploy/python/setup.py,增加从环境变量中获取ENABLE_NEW_BACKEND的代码逻辑

至此,就完成了Python接口的绑定。

7. Python 后端测试

在完成上述部署后,即可编译安装FastDeploy python包

cd FastDeploy/python
export ENABLE_NEW_BACKEND=ON
python setup.py build
python setup.py bdist_wheel

即在python/dist生成FastDeploy python wheel包

pip install dist/fastdeploy-xxxxx.whl

接下来,我们可参照 https://github.com/PaddlePaddle/FastDeploy/tree/develop/examples/runtime/python 此处的示例,写一个新增后端加载模型并推理测试,验证无问题即可。