这几天学习了Tengine的整个框架功能,发现了里面一个功能 -- 插件功能。首先看下下部分的图,Tengine整体框架的介绍.
Tengine 框架图
上图大致介绍了Tengine的框架说明:
Serializer API: 加载各个框架模型的适配接口,例如mxnet,tensorflow等主流框架
Graph Inference C API:为Tengine框架在代码中实现接口
HAL:各种硬件层接口,不同硬件层信息通过此接口上报给Tengine
Plugin API:Operator的定义接口
Tengine的插件功能是整合了上述的四个接口,可以让用户通过上述的接口来适配自己所需要的端侧设备,模型功能,算子功能等。
举个最简单的例子,最近Tengine开源社区增加了ncnn的模型适配,就是通过Serializer API这个接口来增加模型解析。添加ncnn文件后,参考:
https://github.com/OAID/Tengine/tree/master/tools/plugin/serializer/ncnn
在文件Tengine/tools/plugin/serializer/CMakeLists.txt中加上如下代码区域所示代码即可:
if(CONFIG_NCNN_SERIALIZER)
add_definitions(-DCONFIG_NCNN_SERIALIZER=1)
add_subdirectory(ncnn)
endif()
对于算子的添加部分,只要在对应的文件内部plugin注册列表中添加算子,便可以增加自定义算子,此处只是大致的介绍下在几个plugin文件中添加示例,具体的可以参考Tengine github中的算子代码,我相信各位大佬的实力,哈哈哈哈哈。
在Operator Plugin中添加如下:
RegisterOp<XXX>("XXX");
此处为算子名字注册。
在Executor Plugin中添加如下:
extern void RegisterXXX_NodeExec(void);
...
RegisterXXX_NodeExec();
此处为算子实现添加。
对于设备的添加,则是调用Tengine内部的plugin接口就可以,安全又方便。在现有基础上,可以通过Tengine-plugin针对rknnplugin,nnieplugin添加。
例如RKNN:
可以通过Tengine C API中的load\_tengine\_plugin函数直接加载rknn的计算库:
if (load_tengine_plugin("rknnplugin","librknnplugin.so","rknn_plugin_init") != 0 )
{
std::cout << "load rknn plugin faield.\n";
}
然后创建rk3399 pro 图形:
context_t rknn_context = nullptr;
graph_t graph = create_graph(rknn_context, "rk3399pro", model_file);
后面即可设置输入数据并运行图形:
set_tensor_buffer(input_tensor, img.data, len);
prerun_graph(graph);
run_graph(graph,1);
对于NNIE的步骤则与RKNN类似,所以对于不同设备与框架来说Tengine在我使用起来是很方便的一个工具,大大减少了我做其余适配的工作量。
Tengine github:
https://github.com/OAID/Tengine
推荐阅读
更多Tengine框架相关请关注Tengine-边缘AI推理框架专栏 及作者知乎(@空域)