TVM概述

article/2025/10/3 20:25:50

TVM

TVM是陈天奇领导的一个DL加速框架项目。它处于DL框架(如tensorflow、pytorch)和硬件后端(如CUDA、OpenCL)之间,兼顾了前者的易用性和后者的执行效率。

官网:

https://tvm.apache.org/

代码:

https://github.com/apache/tvm

在这里插入图片描述

论文:

《TVM: End-to-End Optimization Stack for Deep Learning》

和同类项目的差异:

  • TFLite和ONNXRuntime只能接收特定格式的模型。而TVM这些都能接收。

  • NCNN、MACE之类的项目,一般只考虑了ARM CPU的优化,对于异构计算做的比较少。

  • TVM强化了图优化的部分,使之更类似于编译器的架构。

架构

官网:

https://tvm.apache.org/docs/arch/index.html

在这里插入图片描述

在这里插入图片描述

安装

TVM暂时不支持pip安装,pip install tvm安装的是另一个同名软件。。。

TVM Runtime

在这里插入图片描述

TVM采用C/S模式进行部署,其中在target机器上的部分,被称为TVM Runtime。

TVM Runtime的代码通常比较薄,只需要把host发过来的优化结果执行即可。

官方文档:

http://tvm.apache.org/docs/dev/runtime.html

TVM Runtime也是BYOC的重要组成部分。

BYOC:Bring Your Own Codegen

https://tvm.apache.org/2020/07/15/how-to-bring-your-own-codegen-to-tvm

How to Bring Your Own Codegen to TVM

这是中文翻译版:

https://zhuanlan.zhihu.com/p/337033822

如何在TVM上集成Codegen(上)

https://zhuanlan.zhihu.com/p/337037547

如何在TVM上集成Codegen(下)

示例:

https://github.com/antkillerfarm/antkillerfarm_crazy/blob/master/python/ml/tvm/pytorch2tvm.py

该示例包含以下内容:

1.如何导入pytorch和tflite的模型。

2.local执行和remote执行。

3.使用print(mod.astext(show_meta_data=False))可以打印相关IR的内容。meta data有的时候包含了权重,打印出来意义不大,反而导致其他有意义的部分,淹没在大量的log中,没法看了。

参考:

https://zhuanlan.zhihu.com/p/369981405

部署TVM Runtime

https://zhuanlan.zhihu.com/p/352988283

TVM学习记录——pytorch

NNVM

NNVM是一个类似于ONNX、NNEF的中间表示。

官网:

https://github.com/dmlc/nnvm

参考:

https://mp.weixin.qq.com/s/qkvX0rmEe0yQ-BhCmWAXSQ

李沐:AWS开源端到端AI框架编译器NNVM

Relay

Relay是TVM中用来替代NNVM的模块,其本身被认为是NNVM第二代。

官网:

https://tvm.apache.org/docs/arch/relay_intro.html

NNVM本质上只能描述传统的计算图,这属于Data Flow的范畴。但是现在的DL框架越来越灵活,不仅能对数据进行计算,还能对数据进行一定的控制处理,也就是所谓的Control Flow(if-else/ADT matching/递归调用)。

论文:

《The Deep Learning Compiler: A Comprehensive Survey》

参考:

https://zhuanlan.zhihu.com/p/91283238

TVM图编译器Relay简单探究

https://zhuanlan.zhihu.com/p/390087648

Relay IR与Relay Pass

https://mp.weixin.qq.com/s/Kt4xDLo-NRui8Whl0DqcSA

Data Flow和Control Flow

Pass

https://tvm.apache.org/docs/how_to/extend_tvm/use_pass_infra.html

和LLVM类似,TVM的Pass也可分为两类:

ModulePass:将整个程序视作一个单元处理的pass。

FunctionPass:以单个函数为作用域的pass, 每个函数间是相互独立的。

FunctionPass包括了Relay层的tvm.relay.transform.FunctionPass和TIR层的tvm.tir.transform.PrimFuncPass

部分pass:

  • FoldConstant: src/relay/transforms/fold_constant.cc

  • AlterOpLayout: src/relay/transforms/alter_op_layout.cc

  • Legalize: src/relay/transforms/legalize.cc

  • MergeComposite: src/relay/transforms/merge_composite.cc

参考:

https://zhuanlan.zhihu.com/p/378739411

万字长文入门TVM Pass

https://www.cnblogs.com/wujianming-110117/p/14580172.html

TVM Pass IR如何使用

https://zhuanlan.zhihu.com/p/112813859

Relay Pass in TVM

https://zhuanlan.zhihu.com/p/358437531

pass总结

Schedule Primitives

https://tvm.apache.org/docs/how_to/work_with_schedules/schedule_primitives.html

Layout

TVM默认的input layout: NCHW,kernel layout: OIHW。

Backend

python层面:

python/tvm/relay/op/contrib/ethosn.py

@register_pattern_table("ethos-n")
def pattern_table():
@tvm.ir.register_op_attr("nn.max_pool2d", "target.ethos-n")
def max_pool2d(attrs, args):

relay层面:

src/relay/backend/contrib/ethosn

TVM_REGISTER_GLOBAL("relay.ext.ethos-n").set_body_typed(CompileEthosn);

runtime层面:

src/runtime/contrib/ethosn

test:

tests/python/contrib/test_ethosn

代码分析

TVM建立了一套类型系统:

class BaseExprNode : public Object;
class BaseExpr : public ObjectRef;

根据基类,查看实际类型:

XX->checked_type()

Quantize

在这里插入图片描述

microTVM

microTVM可用于那些没有OS的单片机。

官网:

https://tvm.apache.org/docs/arch/microtvm_design.html

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

从上面的图来看,microTVM只要在单片机的main函数中启动即可,同时参数也可以放到FLASH上。

PS:这种能直接寻址的FLASH,多半是NOR FLASH。

参考:

https://zhuanlan.zhihu.com/p/337085225

TinyML-TVM是如何驯服Tiny的(上)

https://zhuanlan.zhihu.com/p/337087273

TinyML-TVM是如何驯服Tiny的(下)

参考

https://zhuanlan.zhihu.com/p/139552817

一篇关于深度学习编译器架构的综述论文

https://www.zhihu.com/question/396105855

针对神经网络的编译器和传统编译器的区别和联系是什么?

https://mp.weixin.qq.com/s/8bXwxYyNjdThlGQQ70cgWQ

TVM:端到端自动深度学习编译器,244页ppt

https://zhuanlan.zhihu.com/p/333706468

TVM学习系列blog

https://zhuanlan.zhihu.com/p/163717035

AI编译优化

https://www.zhihu.com/question/267167829

如何看待Tensor Comprehensions?与TVM有何异同?(这个问题下的答案不多,但基本都是陈天奇、贾扬清之类的大佬)

https://mp.weixin.qq.com/s/irvBbPKENiZX9G_6wh5c-Q

陈天奇等人提出TVM:深度学习自动优化代码生成器

https://mp.weixin.qq.com/s/28n8g_epHsYB0I9GVc_lww

陈天奇团队TVM重磅更新:直接在浏览器使用GPU

https://mp.weixin.qq.com/s/7JGLm-hkCZBNDLA98qvWNA

自动生成硬件优化内核:陈天奇等人发布深度学习编译器TVM

https://mp.weixin.qq.com/s/YVIvdMznb3oatIXqD5a5_A

陈天奇等人提出AutoTVM:让AI来编译优化AI系统底层算子

https://mp.weixin.qq.com/s/HquT_mKm7x_rbDGz4Voqpw

阿里巴巴最新实践:TVM+TensorFlow提高神经机器翻译性能

https://zhuanlan.zhihu.com/p/50529704

手把手带你遨游TVM

https://mp.weixin.qq.com/s/z5rsU_uAAaRxgD9YAxDkZA

陈天奇:深度学习编译技术的现状和未来

https://zhuanlan.zhihu.com/p/75203171

如何利用TVM快速实现超越Numpy(MKL)的GEMM

https://zhuanlan.zhihu.com/p/58918363

TVM: Deep Learning模型的优化编译器

https://zhuanlan.zhihu.com/p/87664838

也谈TVM和深度学习编译器

https://mp.weixin.qq.com/s/VE3CySjjS2rTpUDPnKcLTg

陈天奇最新研究:递归模型编译器CORTEX

https://zhuanlan.zhihu.com/p/358585143

深度学习编译器及TVM介绍

https://zhuanlan.zhihu.com/p/360385060

TVM中的scheduler

https://zhuanlan.zhihu.com/p/388452164

tvm or mlir?


http://chatgpt.dhexx.cn/article/8k2lUfFn.shtml

相关文章

TVM[2] —— TVM简介和发展

TVM[2] —— TVM简介和发展 文章目录 TVM[2] —— TVM简介和发展1. TVM 简介1.1 是什么1.2 做什么1.3 基本步骤 2. TVM 的发展2.1 现状——四类抽象2.2 问题——两向boundary2.3 未来——从箭头到圈2.4 New Capabilities with Unity 下期预告:3. TVM 技术栈全解析&a…

TVM 学习指南(个人版)

文章目录 0x0. 前言0x1. 前端0x1.1 Tensor IR(TIR)0x1.2 了解tvm.ir基础设施0x1.3 Relay IR0x1.4 RelaxD0:数据流块作为第一优先级的构造D1:形状推导作为第一优先级的计算D1a: match_shapeD1b. 从符号整数元组构造ShapeShape传播的方法Implications for …

一步一步解读神经网络编译器TVM(一)——一个简单的例子

TOC 前言 这是一个TVM教程系列,计划从TVM的使用说明,再到TVM的内部源码?为大家大致解析一下TVM的基本工作原理。因为TVM的中文资料比较少,也希望贡献一下自己的力量,如有描述方面的错误,请及时指出。 那啥是TVM&am…

P29 JTextArea文本域

P29 JTextArea文本域 1.概述2.代码实例3.效果演示 系统:Win10 Java:1.8.0_333 IDEA:2020.3.4 Gitee:https://gitee.com/lijinjiang01/JavaSwing 1.概述 JTextArea:文本区域。JTextArea 用来编辑多行的文本。JTextArea…

java 刷新jtextarea_Java JTextArea不能实时刷新的问题

相信JTextArea用法都了解吧, JTextArea textArea new JTextArea();生成一块空白的区域, 我的需求就是点击发送邮件按钮后,后台的执行日志能输出到textArea中。 但是我点击发送按钮的时候,由于邮件的附件要好久,界面一…

java 获得jtextarea_java JTextArea中获得光标所在行数

[java]代码库import java.awt.BorderLayout; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTextAre…

java jtextarea 事件_JTextArea事件处理

[java]代码库import java.awt.*; import java.awt.event.*; import javax.swing.*; /*由于会使用到复原和事件驱动功能,因此需要将javax.swing.undo和javax.swing.event两个package包含进来 */ import javax.swing.undo.*; import javax.swing.event.*; /*JTextArea…

JTextArea用法

JTextArea用法 import java.awt.Color; import java.awt.Font; import java.awt.Point; import java.awt.Dimension; import javax.swing.BorderFactory; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JFrame; import javax.swing.Imag…

7、Java Swing JTextArea:文本域组件。 JScrollPane:滚动窗口

文本域与文本框的最大区别就是文本域允许用户输入多行文本信息。在 Swing 中使用 JTextArea 类实现一个文本域, JTextArea常用构造方法如下: JTextArea()----创建一个默认的文本域。JTextArea(int rows,int columns)----创建一个具有指定行数和列数的文…

Swing014——JTextArea:文本域组件

一、API简介 二、实例 package component;import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; impor…

AUC和ROC

AUC(Area Under Curve)被定义为ROC曲线下的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于yx这条直线的上方,所以AUC的取值范围在0.5和1之间。使用AUC值作为评价标准是因为很多时候ROC曲线并不能清晰的说明哪个分类器…

如何理解西瓜书中AUC和Lrank

首先AUC的定义就是ROC曲线的面积。这是西瓜书上给的定义式子 很容易看出是微积分的思想。 为什么说AUC越大ROC越理想呢?首先思考一下ROC的定义是什么,从定义入手一切都很简单。只不过是概念多了可能会把你给绕糊涂了。ROC曲线是这样画出来的&#xff1a…

模型评估指标AUC

模型评估指标AUC 、 AUC(Area Under Curve)被定义为ROC曲线下与坐标轴围成的面积,显然这个面积的数值不会大于1。又由于ROC曲线一般都处于yx这条直线的上方,所以AUC的取值范围在0.5和1之间。AUC越接近1.0,检测方法真实…

AUC与ROC

ROC曲线 含义 ROC曲线用来衡量阈值对模型的影响,在模型输入不变的情况下改变判断标准而获得不同的结果。是一条描述随着判断阈值变化而得到不同真阳率和假阳率结果的曲线。 例子 为了直观理解,我们做出以下三个假设: 假设1 感冒有三种…

ROC与AUC理解

ROC与AUC 简介ROC曲线ROC的动机ROC曲线特殊点 ROC曲线的绘制为什么使用ROCROC曲线使用多个实例概率/得分相同 AUC(Area Under ROC Curve)AUC判断分类器优劣的标准:AUC的物理意义损失公式AUC值的计算对于auc物理意义的理解: sklearn使用参考 简介 ROC:&a…

AUC的两种计算方式

1.什么是AUC? 推荐 搜索场景下的auc理解_凝眸伏笔的博客-CSDN博客_搜索auc 随机抽出一对样本(一个正样本,一个负样本),然后用训练得到的分类器来对这两个样本进行预测,预测得到正样本的概率大于负样本概率…

AUC到底是什么?

前言 上一篇单值AUC计算优化里,提到了AUC,AUC的全名是Area Under Curve,就是ROC曲线下的面积,上一篇文中提到了AUC是评估模型整体排序能力的,但是具体是什么没有进行展开介绍,考虑到可能很多人对这么个玩意…

matlab计算auc,ROC和AUC介绍以及如何计算AUC

ROC(Receiver Operating Characteristic)曲线和AUC常被用来评价一个二值分类器(binary classifier)的优劣,对两者的简单介绍见这里。这篇博文简单介绍ROC和AUC的特点,以及更为深入地,讨论如何作出ROC曲线图以及计算AUC。 ROC曲线 需要提前说明的是,我们这里只讨论二值分类器…

加了权重样本的AUC如何计算

加了权重样本的AUC如何计算?对理解roc_auc_score函数里sample_weight参数以及xgb模型赋予样本权重再评估都有帮助哦~ 一、 roc_auc_score函数中有个参数是sample_weight,可以给样本设置权重。一直不太理解加上weight怎么来计算AUC&#xff…

机器学习之AUC

深入理解AUC AUC是什么 auc是roc曲线的面积,常用来评价二分类系统的好坏。 AUC如何计算 对于二分类问题,预测模型会对每一个预测样本一个得分p,然后选取一个阈值t,当 p > t p>t p>t时,样本预测为正&#…