0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

TVM的编译流程是什么

电子设计 来源:电子设计 作者:电子设计 2022-02-08 14:51 次阅读

作者:安平博,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...。主要代码如下:

pIYBAGAJzXaALCrpAAFWLx2Lb50986.png

模型的输入是一个后缀为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函数。

o4YBAGAJzbSAK8pmAAB-23TNiAc840.png

继续深入和算子转化有关的函数调用为:_convert_operator -> convert_map。Convert_map中对应了可支持tensorflow算子到tvm算子的转换关系。

o4YBAGAJzf2AUd9qAAFas--JyZk610.png

完成了tensorflow到TVM算子转化后,我们就得到了一个IRModule。我们可以利用tvm的可视化来打印出转化后的图:

pIYBAGAJzjyAKM_nAADUALHuUtg377.png

Main是主函数入口,在TVM中以函数形式反应了tensorflow的图结构。函数的调用关系反应了图的依赖关系。

编译

Python中主要代码位于relay/build_module.py文件中,调用关系为build -> BuildModule -> build。在build中通过字典获得了C++中的相应函数。

pIYBAGAJznqAYLYUAABvCn74q78151.png

这里不明白如何通过self.mod[“build”]得到C++中函数的。_BuildModule()是C++中注册到环境中的一个函数。在src/relay/backend/build_module.cc中,

pIYBAGAJzriAKFTzAACbMqgRaW0007.png

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。

o4YBAGAJzvmAY7f2AAE5GDTVjbI659.png

Optimize就是执行一些优化passes,这些passes包括常数折叠,算符融合等。之后会调用graph_codegen->Codegen。Codegen中实现了内存分配和硬件代码生成。

审核编辑:何安

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • TVM
    TVM
    +关注

    关注

    0

    文章

    19

    浏览量

    3622
收藏 人收藏

    评论

    相关推荐

    Android编译优化之混淆配置

    为了使用java8及后续java新版本的特性,Google增加了一步编译过程—脱糖(desugaring),但这一步会导致更长的编译时间,这也是为什么Google会推出D8和R8编译器来优化
    的头像 发表于 12-21 09:21 458次阅读
    Android<b class='flag-5'>编译</b>优化之混淆配置

    TVM编译器的整体架构和基本方法

    。但是这其中也去思考了一下基于FPGA加速器的编译器架构。在FPGA深度学习加速器中,编译器除了需要自动化生成指令外,还要优化指令的结构,来最大化加速器性能。TVM是一个支持GPU、CPU、FPGA指令
    的头像 发表于 11-30 09:36 869次阅读
    <b class='flag-5'>TVM</b><b class='flag-5'>编译</b>器的整体架构和基本方法

    为什么C语言要进行编译

    为什么我们编写的C语言要进行编译?什么是编译编译时发生了什么? 机器无法理解我们编写的C语言,而编译就是将面向人类的高级语言转换成为面向机器的机器语言的过程,图1是GCC
    的头像 发表于 11-24 15:47 455次阅读
    为什么C语言要进行<b class='flag-5'>编译</b>

    C程序的完整编译过程

    本文讨论了C程序的完整编译过程,分别讲述了预处理、编译、汇编、链接各阶段完成的编译任务。然后通过一个编译实例,探讨了各阶段输出的文件。
    的头像 发表于 11-15 17:14 519次阅读
    C程序的完整<b class='flag-5'>编译</b>过程

    Linux内核编译脚本

    获得编译命令及选项 编译linux时,默认不会显示编译的命令,如果你要获得编译命令及其选项,可以在make命令后面加上宏定义: make V= 1 如果希望
    的头像 发表于 09-27 11:52 363次阅读

    瑞芯微RK3568|SDK开发之Kernel编译

    本文介绍了如何使用Kernel手动编译1.1版本,并提供了详细的编译命令和过程。编译过程包括进入Kernel目录、选择默认配置文件和编译镜像等步骤。
    的头像 发表于 09-26 17:21 877次阅读
    瑞芯微RK3568|SDK开发之Kernel<b class='flag-5'>编译</b>

    mlc-llm对大模型推理的流程及优化方案

    比如RWKV和给定的device信息一起编译TVM中的runtime.Module(在linux上编译的产物就是.so文件)提供mlc-llm的c++推理接口调用 。
    发表于 09-26 12:25 448次阅读
    mlc-llm对大模型推理的<b class='flag-5'>流程</b>及优化方案

    Linux 下GCC的编译

    一、Linux 下多文件编译 在上一篇 Linux 下的 C 编程我们知道了 Linux 下的编译器为 GCC ,以及如何使用 GCC 进行编译,在文章我们讲解 GCC 的编译,使用的
    的头像 发表于 09-11 15:18 1085次阅读
    Linux 下GCC的<b class='flag-5'>编译</b>

    ARM GNU工具链编译流程

    这其中自然是利用编译工具链生成的,当然不同的编译工具链这个过程还是有做差别的。
    发表于 09-05 16:37 1296次阅读
    ARM GNU工具链<b class='flag-5'>编译</b><b class='flag-5'>流程</b>

    MLC-LLM的编译部署流程

    MLC-LLM部署在各种硬件平台的需求,然后我就开始了解MLC-LLM的编译部署流程和RWKV World模型相比于MLC-LLM已经支持的Raven系列模型的特殊之处。 MLC-LLM的编译部署
    的头像 发表于 09-04 09:22 1798次阅读
    MLC-LLM的<b class='flag-5'>编译</b>部署<b class='flag-5'>流程</b>

    C语言的编译链接过程

      C语言的编译链接过程要把我们编写的一个C程序源代码转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接。编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程。链接是把目标文件
    的头像 发表于 08-21 10:06 1616次阅读
    C语言的<b class='flag-5'>编译</b>链接过程

    Linux内核的编译主要过程

    Linux内核的编译主要过程: 配置、编译、安装 。
    发表于 08-08 16:02 508次阅读
    Linux内核的<b class='flag-5'>编译</b>主要过程

    编译OpenWRT出错m4如何解决呢?

    编译m4-1.4.17库时出现关于 freadahead.c中编译错误
    的头像 发表于 07-14 10:35 2012次阅读

    VCS编译选项:-y及+libext+

    VCS是一款常见的Verilog编译工具,它提供很多编译选项来控制编译过程及其输出。本文主要介绍以下两个编译选项。
    的头像 发表于 05-29 14:46 7658次阅读

    Vivado增量编译的基本概念、优点、使用方法以及注意事项

    随着FPGA设计的复杂度不断提高,设计人员需要选择更为高效的设计流程来保证开发效率和减少开发成本。其中,Vivado增量编译是一种非常重要的设计流程。本文将介绍Vivado增量编译的基
    的头像 发表于 05-25 18:25 3305次阅读
    Vivado增量<b class='flag-5'>编译</b>的基本概念、优点、使用方法以及注意事项