TVM的编译流程是什么

作者:安平博,xilinx高级工程师;来源:ai加速微信公众号
import:将tensorflow,onnx,pytorch等构建的深度学习模型导入,转化成tvm的中间层表示ir。
lower:将高层ir表示转化成低阶tir表示。
codegen:内存分配和硬件可执行程序生成。
图导入
通过一个tensorflow的reception网络来熟悉编译过程,其它深度学习框架也具有类似过程。从tvm官网可以下载tensorflow的编译程序
https://tvm.apache.org/docs/tutorials/frontend/from_tensorflow.html#sphx...。主要代码如下:
模型的输入是一个后缀为pb的文件,它是神经网络模型图的protobuf格式存储文件。pb是二进制形式,pbtxt是文本形式。import_graph_def函数是导入pb,graph是tensorflow的图结构。
from_tensorflow是将tensorflow的图结构转化成tvm的ir。这个函数在文件relay/frontend/tensorflow.py中。函数的调用关系为:
from_tensorflow -> graphproto.from_tensorflow -> self._get_relay_func。
在get_relay_func中会遍历每个tensorflow的节点,转换成tvm的ir表示。重点关注_backtrack_construct函数。
继续深入和算子转化有关的函数调用为:_convert_operator -> convert_map。convert_map中对应了可支持tensorflow算子到tvm算子的转换关系。
完成了tensorflow到tvm算子转化后,我们就得到了一个irmodule。我们可以利用tvm的可视化来打印出转化后的图:
main是主函数入口,在tvm中以函数形式反应了tensorflow的图结构。函数的调用关系反应了图的依赖关系。
编译
python中主要代码位于relay/build_module.py文件中,调用关系为build -> buildmodule -> build。在build中通过字典获得了c++中的相应函数。
这里不明白如何通过self.mod[“build”]得到c++中函数的。_buildmodule()是c++中注册到环境中的一个函数。在src/relay/backend/build_module.cc中,
tvm_register_global是将c++函数注册到一个全局map中。当python加载编译好的动态库时,会自动查询map中静态注册的函数,并添加到python模块当中。
真正build操作位于relaybuildmodule类中,在其中有一个getfunction函数,会通过名字查询要使用的函数,打包成packedfunc返回,这个函数可能和self.mod[“build”]有关。packedfunc是tvm中提供的python的一个接口,任何函数都可以封装成packedfunc,并给python调用。更详细介绍可看:https://hjchen2.github.io/2020/01/10/tvm-packedfunc%e5%ae%9e%e7%8e%b0%e6...
继续深入代码,build -> buildrelay。这是编译的主要代码。其过程包括optimize,codgen。
optimize就是执行一些优化passes,这些passes包括常数折叠,算符融合等。之后会调用graph_codegen->codegen。codegen中实现了内存分配和硬件代码生成。


区块链的商业应用有哪一些
从纵向到横向控制,重型商用车防碰撞系统的量产之路
河南移动G-SRv6头压缩方案现网试点成功,采用中兴通讯系列产品
CANOPEN总线编码器的应用场合有哪些?
大数据应用在哪些方面?
TVM的编译流程是什么
安世|如何选择符合应用散热要求的半导体封装
面向5G射频功放推出的高密度异构集成SiP解决方案即将在国内大规模量产
浅析AXI DMA收发数据传输过程
对磷酸铁锂电池的需求则按预期逐步增加,年内首次提价
基于SiC的优化2x250kW双逆变器
2017中国西部微波射频技术研讨会暨第二十三届国际电子测试测量研讨会
直线电机生产厂家解读“中国成数一数二的机器人市场”
英特尔重塑体验,成就游戏英雄!
因北美严寒与暴风雪 Linux 5.12合并窗口被迫暂停
如何设计一款原汁机行星齿轮箱减速电机?
韩国研发出柔性锂离子电池!柔性屏幕手机不远矣
74ls164程序
区块链将成为金融公司的灵丹妙药
教你们如何鸿蒙系统如何回退安卓系统