tvm概述(代码片段)

antkillerfarm antkillerfarm     2023-02-19     301

关键词:

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?

tvm概述(代码片段)

TVMTVM是陈天奇领导的一个DL加速框架项目。它处于DL框架(如tensorflow、pytorch)和硬件后端(如CUDA、OpenCL)之间,兼顾了前者的易用性和后者的执行效率。官网:https://tvm.apache.org/代码:https://github.com/apa... 查看详情

tvm概述(代码片段)

TVMTVM是陈天奇领导的一个DL加速框架项目。它处于DL框架(如tensorflow、pytorch)和硬件后端(如CUDA、OpenCL)之间,兼顾了前者的易用性和后者的执行效率。官网:https://tvm.apache.org/代码:https://github.com/apa... 查看详情

tvm实战(代码片段)

TVM实战问题的由来最近客户反馈我们的backend导入Pytorch模型会出错,而TFLite模型是OK的。打印模型的IR后,我们发现:这是Pytorch模型的IR片段:%0=qnn.quantize(%input,0.0186579f,114,out_dtype="uint8",axis=1);%1 查看详情

markdown在tvm.relay中使用外部库(代码片段)

查看详情

markdown在tvm编译onnx模型并执行(代码片段)

查看详情

tvm在linux环境下的安装与编译及vscode如何配置tvm的远程连接调试环境(代码片段)

文章目录前言1.安装TVM1.1下载源码1.2创建虚拟环境及安装依赖库1.3编译TVM源码1.4验证安装是否成功2.配置vscode3.安装FFINavigator结束语前言  本篇文章介绍一下tvm在linux环境下的安装与编译,以及如何使用vscode来配置tvm的远程... 查看详情

tvm巡礼howtooptimizecpu(x86)gemm串讲(代码片段)

...容主要集中在对各个Schedule的单独详解以及引入了TIR的伪代码描述帮助读者更好的理解TVMSch 查看详情

markdown使用tvm编写可调模板和使用自动调优器(代码片段)

查看详情

tvm在linux环境下的安装与编译及vscode如何配置tvm的远程连接调试环境(代码片段)

文章目录前言1.安装TVM1.1下载源码1.2创建虚拟环境及安装依赖库1.3编译TVM源码1.4验证安装是否成功2.配置vscode3.安装FFINavigator结束语前言  本篇文章介绍一下tvm在linux环境下的安装与编译,以及如何使用vscode来配置tvm的远程... 查看详情

在x86的docker中构建tvm的arm环境(代码片段)

文章目录前言1.加载arm-ubuntu镜像2.安装acl库3.编译arm运行时4.编译在x86运行在arm4.1在x86的环境中构建arm的编译环境4.2测试x86-ubuntu与arm-ubuntu能否ping通4.3调用RPC4.4ACL的使用5.arm版的tvm编译和运行时环境5.1构建arm版的tvm编译和运行时环... 查看详情

tvm架构设计

...sp;         示例编译流程概述了TVM将模型的高级概念转换为可部署模块的步骤。       &n 查看详情

int8量化和tvm实现(代码片段)

量化主要有两种方案直接训练量化模型如Deepcompression,Binary-Net,Tenary-Net,Dorefa-Net对训练好的float模型(以float32为例)直接进行量化(以int8为例),这边博客主要讲这个参考NIVIDIA量化官方文档int8量化原理将已有的float3... 查看详情

tvm实战(代码片段)

TVM实战问题的由来最近客户反馈我们的backend导入Pytorch模型会出错,而TFLite模型是OK的。打印模型的IR后,我们发现:这是Pytorch模型的IR片段:%0=qnn.quantize(%input,0.0186579f,114,out_dtype="uint8",axis=1);%1=nn.... 查看详情

tvm实战(代码片段)

TVM实战问题的由来最近客户反馈我们的backend导入Pytorch模型会出错,而TFLite模型是OK的。打印模型的IR后,我们发现:这是Pytorch模型的IR片段:%0=qnn.quantize(%input,0.0186579f,114,out_dtype="uint8",axis=1);%1=nn.... 查看详情

tvm学习指南(个人版)(代码片段)

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

tvm|一种用于深度学习的端到端自动优化编译器(代码片段)

 欢迎关注我的公众号[极智视界],获取我的更多笔记分享 大家好,我是极智视界,本文解读一下一种用于深度学习的端到端自动优化编译器TVM。 现在越来越需要将机器学习部署到各种硬件设备,当前的框架... 查看详情

tvm巡礼howtooptimizecpu(x86)gemm串讲(代码片段)

...容主要集中在对各个Schedule的单独详解以及引入了TIR的伪代码描述帮助读者更好的理解TVMSchedule。还有深入解读了Blocking技术以及AutoSchedule搜出的高性能程序,简要分析了microKernel的汇编。另外我制作了一个控制Schedule变量进行... 查看详情

社区实践为tvm新增oneflow前端(代码片段)

...魁同学的贡献。在这个初版的基础上,我做了一系列代码重构,BUG修复,文档编写,支持更多算子和模型转换之后使其达到了一个相对稳定的状态。所以这篇文章来分享一下做这个小项目的经历和技术细节,... 查看详情