空域 · 2020年06月18日

Tengine Convert Tool 以及图优化简介

最近在学习Tengine的Convert Tool工具的原理,其实是在向前辈学(bai)习(piao)。在学习的过程中,对自己在推理框架的构建上起到了很大的帮助。前段时间适配了ncnn模型,对于自己构建Tengine的框架图有了初步的认识,现在的Convert Tool学习则是让自己在推理框架的构建上有了更加进一步的了解。Tengine作为IR,目前为止可以适配多种模型框下,如下图:

v2-d5d98334ba6543b8b733fb6abe00ddf6_1440w.jpg

从上图中可以很明显的发现通过 Tengine 的 Convert Tool,可以进行绝大部分模型框架的统一化,现在又有个现成的 bai piao 工具,感谢 大缺弦 可以带大家飞一把:

一键转换 Caffe, ONNX, TensorFlow 到 NCNN, MNN, Tengine​convertmodel.com

在进行 Convert Tool 的学习中,可以看到 Tengine 对多种算子进行了融合处理。在进行推理的计算过程中,如果单纯的使用原推理框架进行计算,则在有些算子组合中会浪费大量的时间。如果这时对推理框架进行算子的融合,减少数据的读与取,则可大大提高推理速度;

上图是一个很直观的算子融合的例子,左边的 Conv2D + BiasAdd + Relu 在 Tengine 中被融合冲了一个 Convolution 算子,在计算过程中只需进行 Convolution 的计算即可。对于算子的融合还有多种搭配,例如:Conv + Relu; Conv + Scale; Conv + BatchNorm等。融合的原理便是一个算子在一个计算图中可以视作一个Node,在一个Node下有多个Tensor。对于其中的 Input data,Weight,Bias 都可以看作一个 Tensor 中的数据。所以在做算子融合的时候本质上便是把多个 Tensor 整合到一个 Node 下。虽然在图上 只是简单的算子融合,但是在计算过程中可以提高速度,具体的融合计算原理则可以通过下面传送门,里面用 Caffe 中的例子很好的介绍了 Convolution + Batchnorm + Scale 的算子融合:

Convolution+BatchNorm+Scale模块参数设置 & 融合BatchNorm+Scale层到Convolution层

上图未融合的操作便是数据从内存中读出灌入 Conv2D,经过卷积操作,再把结果灌入内存中,然后以此类推,每个算子进行一次结果的读与取,反观融合后的算子,只需要进行数据的读取,在进行统一的计算,最后把右图中Relu计算后的结果一次性的存入内存中即可。

具体的代码可到Tengine的开源社区取浏览。

Tengine github:
https://github.com/OAID/Tengine


推荐阅读

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