随笔分类 -  TVM系列

摘要:定义 算子融合 就是将多个计算单元合并到一个计算单元里完成计算,减少中间数据读写内存的操作,从而节省计算时间。 TVM中将算子融合分为四种: kElemWise:两个tensor之间按照元素逐个操作的算子,实际上所有的四则运算都是这种类型 kBroadcast:带有广播操作的算子 kInjectiv 阅读全文
posted @ 2024-04-27 21:46 牛犁heart 阅读(1590) 评论(0) 推荐(0) 编辑
摘要:定义 TVM从Halide继承了计算与调度分离的思想,并在其内部重用了部分Halide的调度原语,也引入了一些新的调度原语,用于优化GPU和专用加速器性能。 先举个例子吧: import tvm from tvm import te n = 1024 dtype = "float32" A = te 阅读全文
posted @ 2024-04-14 22:39 牛犁heart 阅读(222) 评论(0) 推荐(0) 编辑
摘要:定义 移除无用函数,Remove Unused Function,顾名思义,就是删除Module中定义但未用到的函数 当然,它也是一个模块级的优化, 举例子: def get_mod(): mod = tvm.IRModule({}) fn1 = relay.Function([], relay.c 阅读全文
posted @ 2024-04-14 16:13 牛犁heart 阅读(61) 评论(0) 推荐(0) 编辑
摘要:定义(What) InferType,类型推断,顾名思义,给表达式进行类型的推断 直接上代码 import tvm from tvm import relay import numpy as np def get_demo_mod(): a = relay.var("a", shape=(2, 3, 阅读全文
posted @ 2024-04-07 20:31 牛犁heart 阅读(130) 评论(0) 推荐(0) 编辑
摘要:TVM 提供了详细日志记录功能,允许提交跟踪级别的调试消息,而不会影响生产中 TVM 的二进制大小或运行时。你可以在你的代码中使用 VLOG 如下: void Foo(const std::string& bar) { VLOG(2) << "Running Foo(" << bar << ")"; 阅读全文
posted @ 2024-04-06 14:54 牛犁heart 阅读(114) 评论(0) 推荐(0) 编辑
摘要:定义(What) 公共子表达式消除 就是如果表达式E的值已经计算的到了,并且自计算的到值后E的值就不再改变了,就说,表达式E在后续计算中是一个公共表达式。 简单说,该表达式上面已经执行过了,下面没必要再执行了 举个例子: import tvm from tvm import relay from t 阅读全文
posted @ 2024-04-06 14:46 牛犁heart 阅读(212) 评论(0) 推荐(0) 编辑
摘要:TVM图级优化按照优化范围,可分为局部优化和全局优化 局部优化是TVM图级优化的重点,其中算子融合是AI编译器必不可少的优化方法。 算子融合核心思想就是将多个算子合并成一个内核,因而无需将中间结果写回全局内存,减少了中间变量的分配,也减少了片上缓存和片外存储之间的数据传输。 那算子融合也是有条件的, 阅读全文
posted @ 2023-03-27 00:13 牛犁heart 阅读(312) 评论(0) 推荐(0) 编辑
摘要:虽然之前也依据tvm官方文档写过一篇关于TVM架构的博客,但总感觉属于一种身在此山中的感觉(偏向于TVM实现的各个模块),并没有一览众山小的即视感(对框架的整体理解)。 因此,今天再次请求出战... 华丽的分割线 首先呢,想先来介绍下常规编译器的结构和特征 常规的编译器通常是由前端(frontend 阅读全文
posted @ 2023-03-12 17:00 牛犁heart 阅读(1356) 评论(0) 推荐(0) 编辑
摘要:TVM介绍 为解决深度学习框架和硬件后端适配问题,华盛顿大学的陈天奇等人提出了TVM. TVM是一个端到端的全栈编译器,包括统一的IR堆栈和自动代码生成方法,其主要功能是优化在CPU、GPU和其他定制AI芯片上执行的AI模型,通过自动转换计算图,实现计算模式的融合和内存利用率最大化,并优化数据布局, 阅读全文
posted @ 2023-02-19 21:49 牛犁heart 阅读(236) 评论(0) 推荐(0) 编辑
摘要:schedule与计算逻辑分离是自动代码生成技术的核心概念,由MIT CASIL组的[Jonathan Ragan-Kelley](http://people.csail.mit.edu/jrk/)在2012年发表在SIGGRAPH上的文章率先提出,然后在2013年发表在PLDI上的文章给出了sch 阅读全文
posted @ 2022-10-05 17:55 牛犁heart 阅读(1095) 评论(0) 推荐(0) 编辑
摘要:TVM源码中涉及到表达式遍历的地方,一般是适用VisitExpr接口进行,这个接口设计TVM的visitor模式,具体分析可参考:TVM:visitor设计模式 基类tvm::relay::ExprFunctor 适用visitor遍历的起点是调用VisitExpr接口,看下基类tvm::relay 阅读全文
posted @ 2022-10-04 22:49 牛犁heart 阅读(488) 评论(0) 推荐(1) 编辑
摘要:visitor模式,因为它在编译器的框架中应用的广泛,在TVM中也是无处不在。 visitor模式介绍 Visitor(访问者)模式的定义:将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式 阅读全文
posted @ 2022-10-04 22:00 牛犁heart 阅读(479) 评论(0) 推荐(1) 编辑
摘要:Object.h概述 命名空间: TVM::runtime 文件中包含的结构: 1.结构体TypeIndex 2.类Object 3.类ObjectPtr 4.类ObjectRef 5.结构体ObjectPtrHash 6.结构体ObjectPtrEqual 7.宏 结构体TypeIndex 该结构 阅读全文
posted @ 2022-10-04 16:33 牛犁heart 阅读(280) 评论(0) 推荐(0) 编辑
摘要:安装VULKAN 参考:https://blog.csdn.net/luolinll1212/article/details/113261022 在编译TVM,当config.cmake中将USE_VULKAN 设置为ON时 set(USE_VULKAN ON) 需要下载VULKAN wget ht 阅读全文
posted @ 2022-08-27 00:32 牛犁heart 阅读(427) 评论(2) 推荐(0) 编辑
摘要:转载:https://www.cnblogs.com/wanger-sjtu/p/15063948.html 为实现多种语言支持,需要满足以下几点: 部署:编译结果可以从python/javascript/c++调用。 Debug: 在python中定义一个函数,在编译函数中调用。 链接:编写驱动程 阅读全文
posted @ 2022-08-07 11:16 牛犁heart 阅读(422) 评论(0) 推荐(0) 编辑
摘要:转载:https://blog.csdn.net/zx_ros/article/details/123526147 自定义算子的步骤: 1.定义算子属性节点 2.编写算子的输入输出类型推导关系函数 3.使用RELAY_REGISTER_OP宏注册算子 4.实现算子的compute函数 5.注册算子的 阅读全文
posted @ 2022-08-06 23:44 牛犁heart 阅读(606) 评论(0) 推荐(0) 编辑
摘要:在对TVM:编译流程一文中,从ONNX模型中读取模型并转换为relay IR,其中调用_convert_operator函数关于将onnx算子转换成Relay算子,其中如何实现当时直接跳过去了,本节将以卷积算子为例,看下Relay表达式是如何转换为TOPI算子并结合TVM的scheduler在后端上 阅读全文
posted @ 2022-08-06 23:39 牛犁heart 阅读(1236) 评论(0) 推荐(0) 编辑
摘要:深度学习编译器介绍 每一种硬件对应一门特定的编程语言,再通过特定的编译器去进行编译产生机器码,那随着硬件和语言的增多,编译器的维护难度会有很大困难。现代编译器已经解决了这个问题。 为了解决这个问题,科学家为编译器抽象出来了编译前端/编译中端/编译后端等概念,并引入IR(Intermediate Re 阅读全文
posted @ 2022-08-02 00:34 牛犁heart 阅读(1228) 评论(0) 推荐(0) 编辑
摘要:任何新的运行时环境都必须实现三个主要方面: DeviceAPI类为特定设备提供了一个句柄,以及用于与之交互的API。它定义了一个通用接口,用于查询设备参数(例如可用内存、线程数量等)和执行简单操作(例如从主机复制内存,或在设备的缓冲区之间复制内存)。 Target类包含函数将在其上运行的设备的描述。 阅读全文
posted @ 2022-07-31 12:22 牛犁heart 阅读(447) 评论(0) 推荐(0) 编辑
摘要:本文档适用于想要了解 TVM 架构和/或积极开发项目的开发人员。页面组织如下: 示例编译流程概述了 TVM 将模型的高层描述转换为可部署模块所采取的步骤。要开始使用,请先阅读本节。 逻辑架构组件部分描述了逻辑组件。后面的部分是针对每个逻辑组件的特定指南,按组件的名称组织。 设备/目标交互描述了 TV 阅读全文
posted @ 2022-07-30 23:36 牛犁heart 阅读(1031) 评论(0) 推荐(1) 编辑