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

    浏览量

    3964
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    瑞芯微(EASY EAI)RV1126B 开发(编译)方式说明

    1.交叉编译(推荐)1.1优缺点优点:采用x86架构的CPU进行编译编译速度快。源码编辑方便,开发环境支持各种如vsCode、qtCreator等IDE。缺点:编译环境需要进行安装部
    的头像 发表于 03-28 16:08 5209次阅读
    瑞芯微(EASY EAI)RV1126B 开发(<b class='flag-5'>编译</b>)方式说明

    简单高效的鸿蒙编译提速技巧

    在鸿蒙应用开发中编译构建是开发者最频繁的操作,每一次编译提速都能显著提升项目整体开发效率。本次分享几个简单却高效的鸿蒙编译提速技巧,从编译配置、构建方式等维度进行优化,让你的开发
    的头像 发表于 03-04 16:09 258次阅读
    简单高效的鸿蒙<b class='flag-5'>编译</b>提速技巧

    踩坑实录:RK3588单独编译boot.img无法启动?这个GPU配置才是关键!

    做 RK3588 嵌入式开发的同学,大概率都遇到过 “编译成功却启动失败” 的糟心场景 —— 明明按官方流程单独编译了 boot.img,烧录后设备却卡在开机 logo,或者直接进入不了系统,查日志、换
    的头像 发表于 02-10 16:54 2586次阅读
    踩坑实录:RK3588单独<b class='flag-5'>编译</b>boot.img无法启动?这个GPU配置才是关键!

    初次编译rk3568(rk3576)Linux 6.1内核踩坑记录:从报错终止到成功解决的完整流程

    很多刚接触瑞芯微 rk 系列芯片开发的小伙伴,在初次编译基于 Linux 6.1 内核的系统时,很容易因为环境依赖问题卡壳。最近我在编译 rk3576(rk3568 流程类似)Linux 6.1 内核时就遇到了典型报错,从定位问
    的头像 发表于 02-06 16:47 3216次阅读
    初次<b class='flag-5'>编译</b>rk3568(rk3576)Linux 6.1内核踩坑记录:从报错终止到成功解决的完整<b class='flag-5'>流程</b>

    揭秘!三步让Debian系统编译速度起飞,告别重复下载资源的烦恼

    在 Debian 系统编译的过程中,重复构建系统和动态下载相关资源往往会消耗大量时间,拖慢开发和部署进度。今天,我们就通过分析一组代码修改,来探索如何优化 Debian 系统编译,实现高效编译,减少不必要的时间浪费。
    的头像 发表于 02-01 16:43 1591次阅读

    技术分享 | RK3506如何交叉编译frp wireguard

    RK3506拥有着不错的性价比以及与之相匹配的性能优势,非常适合用来做边缘计算网关、小型数据收集端点等。今天给大家带来两款内网穿透工具的交叉编译移植,方便在RK3506上搭建相关应用。在编译两个工具
    的头像 发表于 12-25 17:29 797次阅读
    技术分享 | RK3506如何交叉<b class='flag-5'>编译</b>frp wireguard

    RK3588 平台 MPP 编译 + VPU 格式测试

                大家在做瑞芯微  RK3588  开发时,是不是经常困惑「怎么验证  VPU  到底支持哪些编解码格式?」「 MPP  媒体库该怎么编译?」今天手把手带你走一遍流程
    的头像 发表于 12-25 11:33 2358次阅读
    RK3588 平台 MPP <b class='flag-5'>编译</b> + VPU 格式测试

    泰凌微:布局端侧AI,产品支持谷歌LiteRT、TVM开源模型

    。   公司发布的基于TL721X系列芯片的TL-EdgeAI平台,支持谷歌LiteRT、TVM等开源模型,是目前世界上功耗最低的智能物联网连接协议平台。其芯片已在谷歌(Google)的Pixel Bud Pro 2智能耳机方案中被采用。公司将继续深化与谷歌的合作关系。   围绕三
    的头像 发表于 12-15 08:21 1w次阅读

    一文详解SystemC仿真库的编译

    AMD Vivado 设计套件以文件和库的形式提供仿真模型。仿真库包含器件和 IP 的行为和时序模型。编译后的库可供多个设计项目使用。用户必须在设计仿真之前通过名为 compile_simlib 的实用程序编译这些文件,以便为目标仿真器
    的头像 发表于 12-12 15:08 5056次阅读
    一文详解SystemC仿真库的<b class='flag-5'>编译</b>

    高频OTA时代,如何用SIL测试兼顾软件可靠性和迭代速度?

    仿真技术,支持实现多个测试节点并行测试,从而支撑软件敏捷开发流程TVM具备虚拟控制器(vECU)生成、虚拟控制器(vECU)集成、对象模型集成、虚拟总线仿真、虚拟测量
    的头像 发表于 12-10 17:27 2001次阅读
    高频OTA时代,如何用SIL测试兼顾软件可靠性和迭代速度?

    开源鸿蒙技术大会2025丨编译器与编程语言分论坛:语言驱动系统创新,编译赋能生态繁荣

    在万物智联的时代背景下,操作系统底层能力的构建离不开编程语言与编译器的关键支撑。作为开源鸿蒙生态的核心技术,语言设计与编译器、虚拟机实现的进步直接关系到开发效率、运行性能与系统安全。本次分论坛聚焦
    的头像 发表于 11-20 17:24 1169次阅读
    开源鸿蒙技术大会2025丨<b class='flag-5'>编译</b>器与编程语言分论坛:语言驱动系统创新,<b class='flag-5'>编译</b>赋能生态繁荣

    CANoe与Simulink联合仿真编译失败

    问题描述:在使用VS作为编译器的情况下,Matlab编译后失败,如下图:解决方案:原因:安装VS时,Windows的SDK版本未安装或者安装选项没有选择正确。1.打开VS,可以看到VS中的错误提示:2.打开此项目的属性设置:3.选择正确的SDK版本4.选择修改5.重新安装
    的头像 发表于 11-14 12:13 2003次阅读
    CANoe与Simulink联合仿真<b class='flag-5'>编译</b>失败

    Altera发布 Quartus® Prime 专业版和 FPGA AI 套件 25.3 版:编译更快,智能更强

    和 更快速的编译 。 相较于 25.1 版,25.3 版可进一步提供 行业领先的编译时间 、 显著提升的设计效率 和 更少的时序收敛迭代 ,并 加速产品上市 。 编译速度提升多达 6%,自 Agilex 7
    的头像 发表于 11-13 09:24 7.6w次阅读
    Altera发布 Quartus® Prime 专业版和 FPGA AI 套件 25.3 版:<b class='flag-5'>编译</b>更快,智能更强

    创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—Qt工程编译、GPU核心使用说明

    本文围绕创龙科技研发的评估板,详细说明 Qt 工程编译与 GPU 核心使用方法。涵盖基于命令行和 Qt Creator 工具的 Qt 工程编译流程,包括交叉编译工具链、Qt Versi
    的头像 发表于 09-29 14:16 964次阅读
    创龙 瑞芯微 RK3588 国产2.4GHz八核 工业开发板—Qt工程<b class='flag-5'>编译</b>、GPU核心使用说明

    不借助Linux系统,在Windows下如何搭建ZMC900E交叉编译环境

    不需要依赖笨重的虚拟机,也不需要安装双系统。抛开繁琐的环境准备,在Windows上轻松搭建交叉编译环境。本文将介绍如何在Windows上搭建交叉编译环境,不借助Linux系统,直接进行交叉编译。前言
    的头像 发表于 05-21 11:34 1081次阅读
    不借助Linux系统,在Windows下如何搭建ZMC900E交叉<b class='flag-5'>编译</b>环境