【TVM 教程】使用 Relay Visualizer 可视化 Relay

TVM前端研究--Relay TVM前端之前用的NNVM,现在用的Relay,后面会往Relax和Unity方向转。先简单介绍一下。Relay的解释比较杂乱,按照论文和官方文档的解释它算是一个编译器框架或着IR(Intermediate Representation)。说是编译器框架有些大,说是IR他不单单可以做算子表示,还可以支持函数、类型等编程逻辑。 阅读详情

Apache TVM 是一个端到端的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →

Apache TVM 是一个端到端的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。 | Apache TVM 中文站​tvm.hyper.ai/

作者:Chi-Wei Wang

Relay IR 模块可以包含很多操作。通常单个操作很容易理解,但放在一起可能会使计算图难以阅读。随着优化 pass 发挥作用,情况可能会变得更糟。

该实用程序定义了一组接口(包括解析器、绘图器/渲染器、计算图、节点和边)将 IR 模块可视化为节点和边,且提供了默认解析器。用户可以用自己的渲染器对计算图进行渲染。

这里用渲染器来渲染文本形式的计算图,它是一个轻量级、类似 AST 可视化工具(灵感来自 clang ast-dump)。以下将介绍如何通过接口类来实现自定义的解析器和渲染器。

安装依赖可运行:

pip install graphviz

更多细节参考 tvm.contrib.relay_viz。

from typing import (
    Dict,
    Union,
    Tuple,
    List,
)
import tvm
from tvm import relay
from tvm.contrib import relay_viz
from tvm.contrib.relay_viz.interface import (
    VizEdge,
    VizNode,
    VizParser,
)
from tvm.contrib.relay_viz.terminal import (
    TermGraph,
    TermPlotter,
    TermVizParser,
)

定义具有多个 GlobalVar 的 Relay IR 模块​

构建一个包含多个 GlobalVar 的 Relay IR 模块示例。定义一个 add 函数,并在 main 函数中调用。

data = relay.var("data")
bias = relay.var("bias")
add_op = relay.add(data, bias)
add_func = relay.Function([data, bias], add_op)
add_gvar = relay.GlobalVar("AddFunc")

input0 = relay.var("input0")
input1 = relay.var("input1")
input2 = relay.var("input2")
add_01 = relay.Call(add_gvar, [input0, input1])
add_012 = relay.Call(add_gvar, [input2, add_01])
main_func = relay.Function([input0, input1, input2], add_012)
main_gvar = relay.GlobalVar("main")

mod = tvm.IRModule({main_gvar: main_func, add_gvar: add_func})

在终端上使用 Relay Visualizer 渲染图形​

终端可以用类似于 clang AST-dump 的文本显示 Relay IR 模块,可以看到 AddFunc 函数在 main 函数中调用了两次。

viz = relay_viz.RelayVisualizer(mod)
viz.render()

输出结果:

@main([Var(input0), Var(input1), Var(input2)])
`--Call
 |--GlobalVar AddFunc
 |--Var(Input) name_hint: input2
 `--Call
 |--GlobalVar AddFunc
 |--Var(Input) name_hint: input0
 `--Var(Input) name_hint: input1
@AddFunc([Var(data), Var(bias)])
`--Call
 |--add
 |--Var(Input) name_hint: data
   `--Var(Input) name_hint: bias

为 Relay 类型自定义解析器​

有时想要强调感兴趣的信息,或者针对特定用途对事物进行不同的解析,需要遵守接口来定制解析器,下面演示如何自定义 relay.var 的解析器,需要实现抽象接口 tvm.contrib.relay_viz.interface.VizParser。

class YourAwesomeParser(VizParser):
 def __init__(self):
        self._delegate = TermVizParser()

 def get_node_edges(
        self,
        node: relay.Expr,
        relay_param: Dict[str, tvm.runtime.NDArray],
        node_to_id: Dict[relay.Expr, str],
 ) -> Tuple[Union[VizNode, None], List[VizEdge]]:

 if isinstance(node, relay.Var):
            node = VizNode(node_to_id[node], "AwesomeVar", f"name_hint {node.name_hint}")
 # 没有引入边缘。所以返回一个空列表
 return node, []

 # 将其他类型委托给其他解析器。
 return self._delegate.get_node_edges(node, relay_param, node_to_id)

将解析器和感兴趣的渲染器传递给 visualizer,这里只用终端渲染器。

viz = relay_viz.RelayVisualizer(mod, {}, TermPlotter(), YourAwesomeParser())
viz.render()

输出结果:

@main([Var(input0), Var(input1), Var(input2)])
`--Call
 |--GlobalVar AddFunc
 |--AwesomeVar name_hint input2
 `--Call
 |--GlobalVar AddFunc
 |--AwesomeVar name_hint input0
 `--AwesomeVar name_hint input1
@AddFunc([Var(data), Var(bias)])
`--Call
 |--add
 |--AwesomeVar name_hint data
   `--AwesomeVar name_hint bias

围绕计算图和绘图器进行定制​

除了解析器,还可以通过实现抽象类 tvm.contrib.relay_viz.interface.VizGraph 和 tvm.contrib.relay_viz.interface.Plotter 来自定义计算图和渲染器。下面重写了 terminal.py 中定义的 TermGraph。我们添加了一个 hook 在 AwesomeVar 上方复制,并让 TermPlotter 使用新类。

class AwesomeGraph(TermGraph):
 def node(self, viz_node):
 # 先添加节点
 super().node(viz_node)
 # 如果是 AwesomeVar,复制它。
 if viz_node.type_name == "AwesomeVar":
            duplicated_id = f"duplicated_{viz_node.identity}"
            duplicated_type = "double AwesomeVar"
 super().node(VizNode(duplicated_id, duplicated_type, ""))
 # 将复制的 var 连接到原始的
 super().edge(VizEdge(duplicated_id, viz_node.identity))

# 使用 `AwesomeGraph` 覆盖 TermPlotter 
class AwesomePlotter(TermPlotter):
 def create_graph(self, name):
        self._name_to_graph[name] = AwesomeGraph(name)
 return self._name_to_graph[name]

viz = relay_viz.RelayVisualizer(mod, {}, AwesomePlotter(), YourAwesomeParser())
viz.render()

输出结果:

@main([Var(input0), Var(input1), Var(input2)])
`--Call
 |--GlobalVar AddFunc
 |--AwesomeVar name_hint input2
 | `--double AwesomeVar
 `--Call
 |--GlobalVar AddFunc
 |--AwesomeVar name_hint input0
 | `--double AwesomeVar
 `--AwesomeVar name_hint input1
 `--double AwesomeVar
@AddFunc([Var(data), Var(bias)])
`--Call
 |--add
 |--AwesomeVar name_hint data
 | `--double AwesomeVar
 `--AwesomeVar name_hint bias
 `--double AwesomeVar

总结​

本教程演示了 Relay Visualizer 的使用和自定义。 tvm.contrib.relay_viz.RelayVisualizer 类由 interface.py 中定义的接口组成。

目的是快速查看,然后修复迭代,构造函数参数尽可能简单,而自定义可以通过一组接口类进行。

下载 Python 源代码:using_relay_viz.py

下载 Jupyter Notebook:using_relay_viz.ipynb

【从零开始学深度学习编译器】五,TVM Relay以及Pass简介 TVM Relay以及Pass简介0x0. 介绍0x2. Relay介绍0x2.1 使用Relay建立一个计算图 0x0. 介绍 在前面几节的介绍中我们了解到了TVM是如何将ONNX前端模型转换为IR Module的,并且还剖析了TVM中的Relay算子和TOPI算子的扭转过程,知道了Relay算子的最终计算也是基于TOPI算子集合完成的。然后我们在基于ONNX模型结构了解TVM的前端那篇文章贴出的示例程序中还有一个很重要的细节即TVM的编译流程没有详细介绍,即下面这几行代码: ############## 阅读详情

相关推荐

TVM学习教程

目录Step 1:TVM 视频介绍Step 2:研读 TVM 论文Step 3:了解 TVM 官网中可以学习的资料Step 4:上手 TVM CodeStep 5:TVM 其他相关资料 Step 1:TVM 视频介绍 https://www.bilibili.com/video/av29521815/ Step 2:研读 TVM 论文 https://www.usenix.org/system/files/osdi18-chen.pdf Step 3:了解 TVM 官网中可以学习的资料 https://tv

qq_33287871的博客 3077

tvm.relay学习(一)——relay介绍

relay是一种功能多样的编程语言,用于机器学习系统表达的中间表示。relay支持代数数据类型,闭包,控制流和递归,从而可以直接表示比基于计算图的IR更复杂的模型。relay还包括一种使用类型关系的依赖类型的形式,来处理对参数形状有复杂的要求的操作符的形状分析。relay在设计上是可扩展的,这使得机器学习的研究人员和实践者可以很容易地开发新的大型程序转换和优化。 ...

weixin_42164269的博客 5203

Multisim实战:从零搭建体温检测报警电路(附完整仿真文件+调试技巧)

本文详细介绍了如何使用Multisim从零搭建体温检测报警电路,涵盖LM35温度传感器、LM358运算放大器等核心器件的选型与连接,以及信号调理、阈值比较和数码管显示等关键电路设计。附赠完整仿真文件和实用调试技巧,帮助电子工程初学者快速掌握体温温度检测系统的设计与实现。

weixin_28285943的博客 293

【tvm官网教程01】设计和架构-1

【tvm官网教程01】设计和架构-1目的1. 编译流1.1 关键数据结构1.2 Transformations1.2.1 变换的分类1.2.2 relay/transform1.2.2.1 子函数1.2.2.2 overall问题1.2.3 tir/transform1.3 搜索空间和基于学习的transformation1.4 Target Translation1.5 Runtime Execution1.6 小结2. 逻辑组件2.1 tvm/support2.2 tvm/runtime2.3 tvm

B10030607的博客 1994

【全网最新】使用 1panel面板 部署若依系统( springboot 和 vue)项目

打开前端项目的vue.config.js文件,检查devServer下的proxy代理部分,然后将下面这个端口修改为你要在打包后访问的端口,即使用nginx代理前的接口。这个端口默认是80端口,这里把其修改为不会冲突的8010端口,后台接口的地址配置为9080,不过感觉这里设置的8010和9080可能没有用,因为部署前端静态页面是,也配置了一次网页的外部接口和api的接口,后期有空了再验证。打开右侧的Maven,点击:生存期->package,然后点击运行,等待打包成功,包在如图所示的文件夹中。

老薛的专栏 1756

yolov5直接调用zed相机实现三维测距(python)

zed代码比较简洁,但是一定要把环境配置好,后续自己会把他当做普通双目标定,去对比分析效果,并完善相关功能。

积极向上的mr.d的博客 1万+

关于TVM模型的Relay IR的Node遍历

关于TVM模型的Relay IR的Node遍历

qq_47564006的博客 869

17.6 LangSmith 私有化部署实战指南:企业级AI应用的安全基石

LangSmith 私有化部署, 企业级AI开发平台, 数据隐私合规, 混合云架构, 模型监控与审计。

yonggeit的博客 3777

突破TVM调试瓶颈:Relay Visualizer可视化工具全攻略

当深度学习模型从PyTorch/TensorFlow迁移到TVM部署时,你是否曾面对以下困境: - 复杂的Relay IR模块像黑盒一样难以解析 - 优化Pass后的计算图结构混乱,无法定位性能瓶颈 - 自定义算子集成时难以验证数据流正确性 - 团队协作中无法直观分享模型结构设计 **读完本文你将获得**: - 3分钟上手Relay Visualizer核心功能 - 5种实用可视化方案解决90%

gitblog_00199的博客 501

C#中通过Mapster实现轻量级高效对象映射器:从零到精通

本文介绍了.NET生态中高性能对象映射库Mapster的完整使用指南。从基础安装(通过NuGet包)到快速入门示例,展示了如何实现简单对象映射。进一步讲解了自定义映射规则、命名不一致属性的处理方式,以及如何在ASP.NET Core中集成Mapster服务。针对复杂场景,详细解析了嵌套对象映射的配置技巧,并提供了性能优化方案(如预编译映射器)和调试技巧(启用调试模式、捕获映射异常)。通过完整的代码实践,帮助开发者高效解决从基础到高级的对象映射需求。

墨夶的博客 742

OpenSpec 完全指南 config.yaml文件

不管是项目内还是全局存放,自定义工作流都要遵守以下规则,否则会导致OpenSpec无法识别,新手一定要记牢:一个文件夹 = 一个工作流:工作流文件夹的名称,就是中schema字段要填写的名称;每个工作流文件夹必须包含:这是工作流的核心定义文件,没有它,OpenSpec无法识别这个工作流;模板文件统一放templates/目录:如果需要自定义生成文件的模板(比如统一的提案模板、任务模板),就放在工作流文件夹下的templates/里,OpenSpec会自动识别;

h a 6 6 6 c k 为 你解决复杂难题! 1421

yolort实战项目:构建实时目标检测系统的完整解决方案

想要构建高性能的实时目标检测系统?yolort为你提供了一个完整的解决方案!yolort是一个专为YOLOv5优化的运行时堆栈,支持在TensorRT、LibTorch、ONNX Runtime、TVM和NCNN等专用加速器上高效运行。无论你是深度学习新手还是经验丰富的开发者,yolort都能帮助你快速搭建和部署目标检测应用。 ## 🚀 为什么选择yolort? yolort的核心优势在于它

gitblog_01120的博客 641

外向交货单批次赋值的标准姿势:用 BAPI_OUTB_DELIVERY_CHANGE 把 LIPS-CHARG 改得稳、改得干净

摘要: 外向交货单批次赋值涉及严格的业务约束,包括批次管理状态、单据状态、拆分规则等,直接更新表 LIPS 不可取。推荐使用 BAPI_OUTB_DELIVERY_CHANGE 接口,通过标准业务逻辑实现批次修改。关键点包括:区分单批次分配与批次拆分场景,正确设置 ITEM_CONTROL 控制结构,并确保单位/数量数据完整。附可直接执行的ABAP代码示例,实现安全可靠的批次更新流程。 (字数:149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 397

【从零开始学深度学习编译器】一,深度学习编译器及TVM 介绍

0x0. 介绍 大家好呀,在过去的半年到一年时间里,我分享了一些算法解读,算法优化,模型转换相关的一些文章。这篇文章是自己开启学习深度学习编译器的第一篇文章,后续也会努力更新这个系列。这篇文章是开篇,所以我不会具体讲解TVM的知识,更多的是介绍一下我自己眼中的深度学习编译器是什么?以及为什么我要选择学习TVM,最后我也会给出一个让读者快速体验TVM效果的一个开发环境搭建的简要教程。 0x1. 为什么需要深度学习编译器? 深度学习编译器这个词语,我们可以先拆成两个部分来看。 首先谈谈深度学习领域。从训练框架角

I good vegetable a! 4091

2025年7月5日全国青少年信息素养大赛图形化(Scratch)编程小学低年级组复赛真题+答案

2025年7月5日全国青少年信息素养大赛图形化(Scratch)编程小学低年级组复赛真题+答案

伶俐角少儿编程 898

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

TVM踩坑记录

TVM踩坑记录安装新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 安装 参照官网。 安装完成后安装官网quic...

BokyLiu的博客 5140

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

TVM学习笔记二.relay IR介绍

relay是一种功能多样的编程语言,用于机器学习系统表达的中间表示。relay支持代数数据类型,闭包,控制流和递归,从而可以直接表示比基于计算图的IR更复杂的模型。relay还包括一种使用类型关系的依赖类型的形式,来处理对参数形状有复杂的要求的操作符的形状分析。relay在设计上是可扩展的,这使得机器学习的开发者可以很容易地开发新的大型程序转换和优化。 下面分别介绍Relay中的语法,类型系统,代数数据类型和运算符。 一.Relay表达式 Relay IR是一个纯粹面向表达式的表达语言。下面描述Rel

亦梦云烟的博客 3081

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

java怎么开发app_靠谱做菜app开发怎么操作

靠谱做菜app开发怎么操作”如果使用前期的网站,也只能是,即就是让网站获得更长的时间。开发一个新的网站,需要经过众多系统的测试。这个过程无非就是多层次的测试:首先了解一下用户的习惯和工具对他们的看法,当然,他们对性能的关注,需要这个需求去实现。另外,一般的社交软件运营都会做一些工具化的配置。在视频网站自学加深了对课程的了解,并且对于网络视频的制作学习也有了一定的了解。主要讲解网页图文的制作,wor...

weixin_39564807的博客 316

TVM安装教程(踩坑记录)

TVM安装教程以及一些踩坑记录

m0_49339981的博客 2279

【TVM帮助文档学习】Relay表达式

Relay IR是一种纯粹的、面向表达式的语言。下面的小节描述了Relay中的不同表达式,并详细说明了它们的语义。 数据流和控制片段 为了比较Relay和传统的基于计算图形的IR,可以从数据流和控制片段的角度看Relay表达式。在编写和表示转换时,如果Relay的某个片段仅仅只包含影响数据流的表达式,那么这个片段可以看作是一个传统的计算图。 数据流片段涵盖了不涉及控制流的Relay表达式集。也就是说,程序的任何只包含以下结构的部分,对应于一个纯计算图: 变量 Tuple构造和投影 Let Bind

zx_ros的博客 1432

【TVM 教程】在 Relay 中使用外部库

本文介绍如何将 cuDNN 或 cuBLAS 等外部库与 Relay 一起使用。Relay 内部用 TVM 来生成 target-specific 的代码。例如,TVM 使用 CUDA 后端为用户提供的网络中的所有层生成 CUDA 内核。有时也可将各个供应商开发的外部库合并到 Relay 中,TVM 有一种机制可以透明地调用这些库——对于 Relay 用户,只需要设置一个适当的 target 字符串。使用 Relay 的外部库前,用你要用的库构建 TVM。例如,要用 cuDNN,需启用。

HyperAI超神经 947

【TVM源码学习笔记】2.2 C++侧的relay ir op, function和irmodule

探讨C++侧算子的relay ir的实现

zx_ros的博客 1898

【TVM 教程】使用 TVM 部署框架预量化模型 - 第 3 部分(TFLite)

更多 TVM 中文文档可访问 →此教程介绍如何量化 TFLite 计算图,并通过 TVM 编译和执行。有关使用 TFLite 量化模型的更多详细信息,参阅。TFLite 模型下载。开始前,先安装 TensorFlow 和 TFLite 包。执行命令检查 TFLite 包是否安装成功。

HyperAI超神经 1580

TVM 从入门到精通 | 安装 TVM (Part 1)

手把手教学之从源码安装 TVM

HyperAI超神经 3203

TVM 实践指南:向 Relay 框架添加自定义 Compiler Pass 的完整流程

摘要:本文详细介绍了TVM深度学习编译器中Relay中间表示层自定义CompilerPass的开发方法。文章从RelayCompilerPass的架构解析入手,阐明其函数级和模块级Pass的分层设计及注册机制。通过代码示例展示了自定义Pass的核心开发流程,包括IR遍历、模式匹配、节点转换等关键技术,并以Conv2D-BatchNorm融合为例演示具体实现。最后探讨了Pass的调试、性能评估及集成优化最佳实践,为开发者提供了TVM中间表示优化的完整技术指南。

jingpide9527的博客 835

TVM安装编译指南

使用brew安装的llvm地址: /usr/local/Cellar/llvm@9/9.0.1_4/bin/bin/llvm-config 开启LLVM #--------------------------------------------- # Contrib libraries #--------------------------------------------- # Whether to build with BYODT software emulated posit custom d

性感的小君君 2394
上一篇: 12位院士齐聚CCF HPC China,热议科研新范式:超智融合/算网融合/科学智能计算……
下一篇: 入选ECCV 2024!覆盖5.4w+图像,MIT提出医学图像分割通用模型ScribblePrompt,性能优于SAM
HyperAI超神经
博客等级 码龄7年 8873粉丝 1753原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值