pass基础设施 Relay和TVM IR都包含一系列优化pass,用于改善模型的性能指标,如平均推断、内存占用或特定设备的功耗。有一套标准的优化和机器学习特有的优化,包括常量折叠、死代码消除、算子布局更改、算子融合、缓冲区处理和循环转换等。通过使用遍历期间和/或遍历之前收集的分析结果,将每个pass都被构造为ir-to-ir转换。然而,随着TVM的迅速发展,对这些pass进行更系统和更有效管理的需求变得越来越明显。另外,一个管理跨TVM栈不同层(如Relay和tir)的pass的通用框架,为开发人员快速原型化和将实现的pa
TabaleGen介绍 本文翻译自TableGen Overview — LLVM 15.0.0git documentationTableGen的目的是帮助开发和维护领域特定信息的记录。因为可能有大量这样的记录,所以专门设计它来允许编写灵活的描述,并提取出这些记录的共同特性。这减少了描述中的重复数量,减少了出错的机会,并使结构领域特定信息变得更容易。TableGen前端解析文件,实例化声明,并将结果传递给特定领域的后端进行处理。有关TableGen的深入描述,请参阅TableGen Programmer’s Reference
Device/Target交互 本文翻译自Device/Target Interactions — tvm 0.9.dev0 documentation本文档是为有兴趣了解TVM框架如何与特定设备API交互的开发人员编写的,或者希望实现对新API或新硬件的支持的开发人员编写的。任何新的运行时环境都必须实现三个主要方面。DeviceAPI类为特定设备提供了一个句柄,以及用于与之交互的API。它定义了一个通用接口,用于查询设备参数(例如可用内存、线程数量等)和执行简单操作(例如从主机复制内存,或在设备的缓冲区之间复制内存)。Target类包含
模块序列化介绍 部署TVM运行时模块时,无论是CPU还是GPU, TVM只需要一个动态共享库即可。关键是我们统一的模块序列化机制。本文档将介绍TVM模块序列化格式标准及实现细节。让我们先为构建一个ResNet-18 GPU 工作负载作为例子。 序列化入口API是tvm.module.Module的export_library。在这个函数中,我们将执行以下步骤:1. 收集所有DSO模块(LLVM模块和C模块)2. 一旦我们有了DSO模块,我们将调用保存函数将它们保存到文件中。3. 接下来,我们将检查是否导入了模块,
TableGen程序员参考 本文翻译自TableGen Programmer’s Reference — LLVM 15.0.0git documentationTableGen使用输入文件中的信息生成复杂的输出文件,输入源文件比输出文件更容易编码,也更容易维护和修改。输入文件中供TableGen处理的信息以声明式风格编码,信息包括类和记录。内部化的记录被传递到各种后端,后端从记录的子集中提取信息,并生成一个或多个输出文件。这些输出文件通常是C++的.inc文件,但也可以是后端开发人员需要的任何其他类型的文件。本文档将详细介绍LLVM
将VM放入TVM:Relay虚拟机 Relay是一种新的程序表示方法,它实现了大量机器学习程序的表示和优化。不幸的是,在引入支持更有表现力的程序集的同时,我们也引入了一些新的执行上的挑战。Relay的解释器可以执行完整的语言,但是有明显的限制,这使得它不适合生产部署。它被构造成通过遍历AST来执行程序的低效解释器。这种方法在概念上很简单,但效率很低,因为AST遍历严重依赖于间接性。在编译动态代码方面还有更多的挑战,比如动态调度和内存分配、完全动态张量形状和控制流。解释器为这些提供了简单的解决方案,但没有一个是足够引人注目或优化的。第二种执行机
TVM调试器 TVM调试器是一个调试TVM计算图执行的接口。它有助于在TVM运行时提供对图结构和张量值的访问。图经过relay优化后,以json序列化格式存储。json文件中包含了图的全部信息。UX可以直接使用这个图,也可以将这个图转换成UX可以理解的格式。下面将解释Graph JSON格式1. nodes:在json中,节点代表占位符或计算节点。节点存储为一个列表。节点包含以下信息:(1)flatten_data:是否需要在执行前将数据扁平化(2)func_name:融合后的函数名,对应于Relay编译过程生成的库中的
TVM运行时系统 本文翻译自TVM Runtime System — tvm 0.9.dev0 documentationTVM的编译器栈开发和部署支持多种编程语言。在本文中,我们将解释TVM运行时的关键元素。我们需要满足一些有趣的需求:我们希望能够用任何语言定义函数,并在另一种语言中调用该函数。我们还希望最小化运行时核心,以便部署到嵌入式设备上。PackedFunc是我们找到的解决上述挑战的一个简单而优雅的解决方案。一个单独的PackedFunc对象表示一个调用者和被调用者可能使用不同语言的函数调用。下面的代码块提供了一个
设计和架构 本文档适用于想要了解TVM架构和/或积极参与项目开发的开发人员。本页面组织如下:本指南提供了体系结构的一些补充视图。首先,我们回顾一个单一的端到端编译流,并讨论关键数据结构和转换。这个基于运行时的视图主要关注运行编译器时每个组件的交互。然后我们将回顾代码库的逻辑模块及其关系。这一部分提供了一个静态的总体设计视图。在本指南中,我们将学习编译器中的一个编译流程示例。下图显示了该流程。在高层次上,它包含几个步骤:设计和理解复杂系统的最佳方法之一是识别关键数据结构,和操作(转换)这些数据结构的API。一旦确定了关键
在TVM中添加自己的代码生成器 本文翻译自Bring Your Own Codegen To TVM — tvm 0.9.dev0 documentation随着深度学习工作负载所针对的硬件设备数量不断增加,用户在各种设备上实现高性能所需的知识也不断增加。为了让数据科学家在开发新模型时不必担心性能问题,硬件后端提供商要么提供有许多常用的深度学习算子的库(譬如MKLDNN或cuDNN),要么提供框架(譬如TensorRT),让用户以某种方式描述自己的模型,以实现高性能。然而,用户在尝试使用新的库或设备时,必须学习新的编程接口。因此,对统一编
在Relay中添加一个编译pass 本文翻译自Adding a Compiler Pass to Relay — tvm 0.9.dev0 documentation编译器pass是扩展Relay特性集和对Relay程序进行优化的主要接口。通过编写编译器pass,您可以修改AST或收集有关AST的信息,这取决于您的目标。事实上,Relay的一些最重要的内部特性(例如自动微分和类型推断)只不过是“标准的”编译器pass。从较高的层次上讲,编写pass有两个关键组件:首先,我们将概述编写编译器pass的关键机制。然后,我们将分析一个Relay常量
调试TVM 本文翻译自Debuggging TVM — tvm 0.9.dev0 documentationTVM提供了详细日志记录功能,允许提交跟踪级调试消息,而不会影响生成的TVM二进制文件大小或TVM运行时间。你可以在你的代码中像下面这样使用VLOG:在本例中,传递给VLOG()的2表示详细级别。级别越高,打印的日志越多。通常TVM级别从0到2不等,3只用于极低级的核心运行时属性。VLOG系统在启动时被配置为打印0到N之间的VLOG语句。N可以是全局的,也可以是单个文件定义的。vlog默认不打印,不影响二进