新增一个推理框架¶
介绍¶
inference是nndeploy的多端推理子模块,通过对第三方推理框架的抽象,屏蔽不同推理框架的差异性,并做到统一的接口调用的体验,nndeploy当前已经支持TensorRT、OpenVINO、ONNXRuntime、MNN、TNN、ncnn、coreML、paddle-lite、AscendCL、RKNN等多个推理框架。
nndeploy支持灵活的推理框架选择,用户可以根据实际需求进行选择性编译。如果您有自定义的推理框架,也可以完全不依赖其他第三方推理框架独立运行,具有很好的扩展性和灵活性。
步骤¶
新增一个推理框架主要分为以下五个步骤:
(1)新增推理框架相关枚举类型
(2)继承基类InferenceParam
(3)继承基类Inference
(4)编写Converter
(5)修改cmake
步骤一:新增设备类型枚举¶
1.1 新增ModelType枚举¶
(1)修改文件
<path>\include\nndeploy\base\common.h,在ModelType中添加新模型格式类枚举,格式为kModelTypeXxx(2)修改文件
<path>\source\nndeploy\base\common.cc,在ModelType stringToModelType(const std::string &src)函数中添加字符串转换为新模型格式类枚举实现
1.2 新增InferenceType枚举¶
(1)修改文件
<path>\include\nndeploy\base\common.h,在InferenceType中添加新推理框架格式的枚举,格式为kInferenceTypeXxx(2)修改文件
<path>\source\nndeploy\base\common.cc,在InferenceType stringToInferenceType(const std::string &src)函数中添加字符串转换为新推理框架格式的枚举实现
1.3 新增错误类枚举¶
(1)修改文件
<path>\include\nndeploy\base\status.h,在StatusCode中添加新错误的枚举,格式为kStatusCodeErrorInferenceXxx
步骤二: 继承基类InferenceParam¶
(1)在
<path>\include\nndeploy\inference下新增xxx\xxx_inference_param.h文件,可参考MNN(<path>\include/nndeploy/inference/mnn/mnn_inference_param.h)或TensorRT(<path>\include/nndeploy/inference/tensorrt/tensorrt_inference_param.h)(2)在
<path>\source\nndeploy\inference下新增xxx\xxx_inference_param.cc文件,可参考MNN(<path>\source/nndeploy/inference/mnn/mnn_inference_param.c)或TensorRT(<path>\include/nndeploy/inference/tensorrt/tensorrt_inference_param.cc)
步骤三: 继承基类Inference¶
(1)在
<path>\include\nndeploy\inference下新增xxx\xxx_inference.h文件,可参考MNN(<path>\include/nndeploy/inference/mnn/mnn_inference.h)或TensorRT(<path>\include/nndeploy/inference/tensorrt/tensorrt_inference.h)(2)在
<path>\source\nndeploy\inference下新增xxx\xxx_inference.cc文件,可参考MNN(<path>\source/nndeploy/inference/mnn/mnn_inference.c)或TensorRT(<path>\include/nndeploy/inference/tensorrt/tensorrt_inference.cc)
步骤四: 编写Converter¶
nndeploy提供了统一的Tensor以及推理所需的超参数数据结构,每个推理框架都有自定义Tensor以及超参数数据结构,为了保证统一的接口调用的体验,需编写转化器模块。
(1)在
<path>\include\nndeploy\inference下新增xxx\xxx_converter.h文件,可参考MNN(<path>\include/nndeploy/inference/mnn/mnn_converter.h)或TensorRT(<path>\include/nndeploy/inference/tensorrt/tensorrt_converter.h)(2)在
<path>\source\nndeploy\inference下新增xxx\xxx_inference.cc文件,可参考MNN(<path>\source/nndeploy/inference/mnn/mnn_converter.c)或TensorRT(<path>\include/nndeploy/inference/tensorrt/tensorrt_converter.cc)
步骤五:修改cmake¶
(1)修改主cmakelist
<path>\CMakeLists.txt,新增推理框架编译选项
nndeploy_option(ENABLE_NNDEPLOY_INFERENCE_XXX "ENABLE_NNDEPLOY_INFERENCE_XXX" OFF)由于新设备的增加,增加了源文件和头文件,需将源文件和头文件加入到编译文件中,需在
if(ENABLE_NNDEPLOY_INFERENCE) endif()的代码块中增加如下cmake源码if (ENABLE_NNDEPLOY_INFERENCE_XXX) file(GLOB_RECURSE INFERENCE_XXX_SOURCE "${ROOT_PATH}/include/nndeploy/inference/xxx/*.h" "${ROOT_PATH}/source/nndeploy/inference/xxx/*.cc" ) set(INFERENCE_SOURCE ${INFERENCE_SOURCE} ${INFERENCE_XXX_SOURCE}) endif()
(2)链接推理框架的三方库
需要在
<path>\cmake目录下新增xxx.cmake,类似<path>\cmake\mnn.cmake或<path>\cmake\xxx.cmake修改
<path>\cmake\nndeploy.cmake,新增include("${ROOT_PATH}/cmake/xxx.cmake")
(3)修改
<path>\build\config.cmake,新增设备编译选项set(ENABLE_NNDEPLOY_INFERENCE_XXX ON)