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

    浏览量

    3661
收藏 人收藏

    评论

    相关推荐

    soc开发流程常见问题及解决方案

    SOC(System on a Chip,系统级芯片)开发流程中常见问题及解决方案主要包括以下几个方面: 一、环境问题 常见问题 : 开发环境配置复杂,新手难以快速上手。 依赖项缺失或版本不兼容
    的头像 发表于 11-10 09:26 448次阅读

    瑞芯微RK3568开发板Linux编译报错404怎么办?触觉智能教你轻松解决

    本文介绍瑞芯微RK3568主板/开发板SDK编译流程编译报错404的解决方法,使用触觉智能EVB3568鸿蒙开发板演示,具有丰富的视频输入输出接口(HDMI/eDP/MIPI/LVDS) 与多种高速接口(千兆网口/PCIe/S
    的头像 发表于 11-05 11:02 347次阅读
    瑞芯微RK3568开发板Linux<b class='flag-5'>编译</b>报错404怎么办?触觉智能教你轻松解决

    java反编译能拿到源码吗

    Java反编译是一种将编译后的Java字节码(.class文件)转换回Java源代码的过程。虽然反编译可以帮助理解代码的逻辑和结构,但它并不总是能完美地还原原始源代码。反编译工具通常会
    的头像 发表于 09-02 11:03 962次阅读

    java反编译的代码可以修改么

    Java反编译是一种将编译后的Java字节码(.class文件)转换回源代码的过程。反编译后的代码可以进行修改,但是需要注意,反编译代码的质量和可读性可能会受到原始
    的头像 发表于 09-02 11:00 653次阅读

    linux开发板如何编译curl

    在Linux开发板上编译 curl 库通常涉及到几个步骤,包括准备开发环境、下载源代码、配置编译选项以及执行编译和安装过程。以下是一个基本的指南,帮助你在Linux开发板上编译 cur
    的头像 发表于 08-30 15:33 602次阅读

    SemiDrive X9 AI 开发环境搭建

    SemiDrivex9AI开发环境搭建分开发机端,开发板端。主要的工具是SDNN,它是一个基于开源编译器框架TVM的端到端的AI编译器框架,Semidrive对TVM
    的头像 发表于 08-03 08:27 387次阅读
    SemiDrive X9 AI 开发环境搭建

    AI编译器技术剖析

    随着人工智能技术的飞速发展,AI编译器作为一种新兴的编译技术逐渐进入人们的视野。AI编译器不仅具备传统编译器的功能,如将高级语言编写的源代码转换为机器可执行的代码,还融入了人工智能技术
    的头像 发表于 07-17 18:28 1621次阅读

    人工智能编译器与传统编译器的区别

    人工智能编译器(AI编译器)与传统编译器在多个方面存在显著的差异。这些差异主要体现在设计目标、功能特性、优化策略、适用范围以及技术复杂性等方面。以下是对两者区别的详细探讨,旨在全面解析其内在差异。
    的头像 发表于 07-17 18:19 1838次阅读

    RISC-V编译环境搭建

    以上按位数分可以编译为32位和64位两种,另外就是都可以编译为elf版本和linux版本。
    的头像 发表于 07-17 11:31 1345次阅读
    RISC-V<b class='flag-5'>编译</b>环境搭建

    使用TVM量化部署模型报错NameError: name \'GenerateESPConstants\' is not defined如何解决?

    各位好,我在使用TVM部署模型时,遇到一下错误,请问如何解决?我进esp.py文件看,有如下两个函数是找不到定义的: GenerateESPConstants(), ExtractConstantsFromPartitionedFunction(),
    发表于 06-28 10:50

    多文件工程的编译

    多文件工程的编译
    的头像 发表于 06-26 13:35 282次阅读
    多文件工程的<b class='flag-5'>编译</b>

    鸿蒙ArkUI-X框架开发:【编译

    使用build.sh编译脚本进行编译编译脚本常用选项
    的头像 发表于 05-25 16:42 1844次阅读
    鸿蒙ArkUI-X框架开发:【<b class='flag-5'>编译</b>】

    OpenHarmony开发学习:【源码下载和编译

    本文介绍了如何下载鸿蒙系统源码,如何一次性配置可以编译三个目标平台(`Hi3516`,`Hi3518`和`Hi3861`)的编译环境,以及如何将源码编译为三个目标平台的二进制文件。
    的头像 发表于 04-14 09:36 932次阅读
    OpenHarmony开发学习:【源码下载和<b class='flag-5'>编译</b>】

    HighTec Tricore编译速度优化策略探讨

    HighTec在编译时默认是根据工程源文件文件架构首先生成makefile文件,然后执行“make makefile”指令来编译工程。
    的头像 发表于 04-10 12:44 2078次阅读
    HighTec Tricore<b class='flag-5'>编译</b>速度优化策略探讨

    OpenHarmony 移植:build lite 编译构建过程

    配置完毕产品解决方案、芯片开发板解决方案,就可以执行 hb build 进行编译。但是产品解决方案代码是如何被调用编译的? 芯片开发板解决方案代码是如何被调用编译的?内核代码如何被调用编译
    的头像 发表于 02-19 16:19 942次阅读