最近在学习Tengine的Convert Tool工具的原理,其实是在向前辈学(bai)习(piao)。在学习的过程中,对自己在推理框架的构建上起到了很大的帮助。前段时间适配了ncnn模型,对于自己构建Tengine的框架图有了初步的认识,现在的Convert Tool学习则是让自己在推理框架的构建上有了更加进一步的了解。Tengine作为IR,目前为止可以适配多种模型框下,如下图:
从上图中可以很明显的发现通过 Tengine 的 Convert Tool,可以进行绝大部分模型框架的统一化,现在又有个现成的 bai piao 工具,感谢 大缺弦 可以带大家飞一把:
一键转换 Caffe, ONNX, TensorFlow 到 NCNN, MNN, Tengineconvertmodel.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推理框架专栏 及作者知乎(@空域)