FastDeploy中集成了多种推理后端,分别用于在不同硬件上的部署。例如CPU上支持OpenVINO/Paddle Inference/ONNX Runtime后端。
- 在常见的硬件上,可能会存在一种硬件被多个后端支持,例如CPU被OpenVINO/Paddle Inference/ONNX Runtime后端支持,GPU被Paddle Inference/ONNX Runtime/TensorRT支持;
- 也存在一个后端支持多种硬件,例如Paddle Inference同时支持CPU/GPU, Paddle Lite支持 ARM CPU/昆仑芯/昇腾等;
- 也存在一个后端只支持1种硬件,例如瑞芯微3588则只对应1种后端。
本文档接下来介绍在FastDeploy中接入一个新的后端流程,一种后端的接入代码修改都在
FastDeploy/fastdeploy/runtime/
模块下。
主要用于在FastDeploy中声明新加入的后端,以及后端对应支持的硬件。修改的内容需要包括
- 如新增硬件支持,修改枚举类型
fastdeploy/runtime/enum_variables.h::Device
- 新增后端支持,修改枚举类型
fastdeploy/runtime/enum_variables.h::Backend
- 如若引入的新的模型格式,修改枚举类型
fastdeploy/runtime/enum_variables.h::ModelFormat
- 修改全局变量
fastdeploy/runtime/enum_variables.h::s_default_backends_by_format
,该变量表示各模型格式被哪些后端直接支持加载 - 修改全局变量
fastdeploy/runtime/enum_variables.h::s_default_backends_by_device
,该变量表示各硬件被哪些后端支持
除上述5处,另外也同时修改fastdeploy/runtime/enum_variables.cc
,加入各枚举类型被输出运算符重载的实现,参照其它后端或硬件即可。
此步骤的代码实现则需创建fastdeploy/runtime/backends/new_backend
目录,建议在此目录下实现以下代码文件(不强制要求命名或文件数量,具体根据实现需求来加)
fastdeploy/runtime/backends/new_backend/option.h
此文件请按照这个命名方式,并在代码中添加NewBackendOption
结构体的实现,用于配置后端运行时的参数(注意此结构体所有函数实现均在这个头文件中,只使用C++内置数据结构,不引入后端自定义类型);fastdeploy/runtime/backends/new_backend/new_backend.h
在此代码中添加NewBackend
类定义,并继承fastdeploy/runtime/backends/backend.h::BaseBackend
,实现相应的接口
在第2步后,已经可以通过Backend进行模型的加载、预测,并获取输出结果。接下来则是将Backend集成进Runtime,实现统一的推理接口。
- 修改
fastdeploy/runtime/runtime_option.h
,添加新的接口- 如有新硬件,增加
UseHardware()
接口,可以在此接口中添加对硬件配置的参数,如device_id等,但都给定默认参数 - 增加
UseNewBackend()
,可以在此接口中添加对后端配置的参数,但都给定默认参数 - 增加成员变量
NewBackendOption new_backend_option
, 对于更高级的配置,可以让开发者通过RuntimeOption.new_backend_option
的访问方式来修改
- 如有新硬件,增加
- 修改
fastdeploy/runtime/runtime.h
- 创建私有函数
CreateNewBackend()
函数,并仿照其它CreateXXXBackend()
函数完成实现 - 在
Init()
函数实现根据backend字段调用CreateNewBackend()
的逻辑
- 创建私有函数
在完成1,2,3步骤后,我们已经完成了代码的开发,接下来是开发编译流程。这个步骤中涉及到修改3个文件,FastDeploy/CMakeLists.txt
,FastDeploy/cmake/new_backend.cmake
, FastDeploy/FastDeploy.cmake.in
,分别是编译的主入口,依赖库的配置入口,以及FastDeploy提供经开发者依赖的配置入口。
- 创建
FastDeploy/cmake/new_backend.cmake
,可参照同目录下的rknpu2.cmake
,用于配置第三方库的下载,头文件的引入,以及库的引入 - 修改
FastDeploy/CMakeLists.txt
,注意有以下几处修改- 参照其它后端代码,添加
option(ENABLE_NEW_BACKEND)
用于控制编译FastDeploy时是否集成此后端 - 参照其它后端代码,添加
file(GLOB_RECURSE DEPLOY_BACKEND_SRCS)
用于将新后端集成的代码查找到,并以列表的形式存储到DEPLOY_NEW_BACKEND_SRCS
中,并在CMakeLists.txt中的list(REMOVE_ITEM ALL_DEPLOY_SRCS)
中移除所有的DEPLOY_NEW_BACKEND_SRCS
- 参照其它后端代码,添加
if(ENABLE_NEW_BACKEND)
的代码逻辑,用于将代码加入进来,添加相应库链接
- 参照其它后端代码,添加
- 修改
FastDeploy/FastDeploy.cmake.in
(此文件为生成模版,会根据编译时配置,生成FastDeploy.cmake文件,用于提供给编译好FastDeploy库后,帮助开发者快速依赖编译好的FD库进行C++部署),在开始处获取编译参数,同时添加相应逻辑
-
FastDeploy/FastDeploy.cmake.in
Line 24 in 21b1cb8
-
FastDeploy/FastDeploy.cmake.in
Lines 118 to 127 in 21b1cb8
最后还需要再修改FastDeploy/fastdeploy/core/config.h.in
文件,加入宏定义
FastDeploy/fastdeploy/core/config.h.in
Lines 24 to 26 in 21b1cb8
至此我们已经完成了C++集成FastDeploy的后端,可以进行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 此处的示例,写一个新增后端加载模型并推理测试,验证无问题即可。
在完成C++后端开发后,如有进一步Python接口支持的需求,仅需在FastDeploy快速绑定几个基础的接口即可。
NewBackendOption
的绑定,可参照OrtBackend中Option的绑定方式,在runtime/backends/new_backend
下新增option_pybind.cc
来绑定自己的数据结构- 在
runtime/option_pybind.cc
中参照BindOrtOption
方式,进行声明和调用 - 由于C++开发中,我们修改了
runtime/option.h
新增了UseXXX
接口,因此也需要修改runtime/option_pybind.cc
中RuntimeOption
的绑定,新增use_xxx
函数的绑定,同时修改FastDeploy/python/fastdeploy/runtime.py
,增加use_xxx
python函数调用 - Python编译时,我们无法通过命令行传参,所以FastDeploy通过获取环境变量来修改编译参数。 修改
FastDeploy/python/setup.py
,增加从环境变量中获取ENABLE_NEW_BACKEND
的代码逻辑
至此,就完成了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 此处的示例,写一个新增后端加载模型并推理测试,验证无问题即可。