空域 · 2020年05月15日

Tengine Plugin 简介

这几天学习了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推理框架专栏 及作者知乎(@空域)
推荐阅读
关注数
3393
内容数
68
Tengine是一款轻量级模块化高性能的神经网络推理引擎 ;欢迎体验Tengine,[链接] 《Tengine开发者入门资料包》[链接]
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息