宜春建设局网站编程猫加盟条件和费用
2026/3/14 12:43:57 网站建设 项目流程
宜春建设局网站,编程猫加盟条件和费用,网站建设技术方案模板,网页特效经典300例本文档适用于想要了解 TVM 架构或积极开发项目的开发者。本文档组织结构如下#xff1a; 整体编译流程示例#xff1a;概述 TVM 如何将一个高级模型描述转换为可部署模块的各个步骤。建议首先阅读本节以了解基础流程。简要介绍 TVM 栈中的关键组件。您也可以参考 TensorIR 深…本文档适用于想要了解 TVM 架构或积极开发项目的开发者。本文档组织结构如下整体编译流程示例概述 TVM 如何将一个高级模型描述转换为可部署模块的各个步骤。建议首先阅读本节以了解基础流程。简要介绍 TVM 栈中的关键组件。您也可以参考 TensorIR 深度解析 和 Relax 深度解析了解 TVM栈中两个核心部分的详细内容。本指南提供了架构的一些补充视图。首先研究端到端的编译流程并讨论关键的数据结构和转换。这种基于 runtime 的视图侧重于运行编译器时每个组件的交互接下来我们将研究代码库的逻辑模块及其关系。本部分将提供该设计的静态总体视图。编译流程示例本指南研究编译器中的编译流程示例下图展示了流程。从高层次来看它包含以下步骤导入 前端组件将模型引入到 IRModule 中它包含了内部表示模型的函数集合。转换 编译器将 IRModule 转换为功能与之等效或近似等效例如在量化的情况下的 IRModule。许多转换与target后端无关并且允许 target 配置转换 pipeline。Target 转换 编译器将 IRModule 转换codegen为指定 target 的可执行格式。target的转换结果被封装为 runtime.Module可以在 runtime 环境中导出、加载和执行。Runtime 执行 用户加载 runtime.Module并在支持的 runtime 环境中运行编译好的函数。关键数据结构设计和理解复杂系统的最佳方法之一就是识别关键数据结构和操作转换这些数据结构的 API。识别了关键数据结构后就可以将系统分解为逻辑组件这些逻辑组件定义了关键数据结构的集合或是数据结构之间的转换。IRModule 是整个堆栈中使用的主要数据结构。一个 IRModuleintermediate representation module包含一组函数。目前支持两种主要的功能变体variantrelay::Function 是一种高层功能程序表示。一个 relay.Function 通常对应一个端到端的模型。可将relay.Function 视为额外支持控制流、递归和复杂数据结构的计算图。tir::PrimFunc是一种底层程序表示包含循环嵌套选择、多维加载/存储、线程和向量/张量指令的元素。通常用于表示算子程序这个程序在模型中执行一个可融合的层。在编译期间Relay 函数可降级为多个 tir::PrimFunc 函数和一个调用这些 tir::PrimFunc 函数的顶层函数。在编译和转换过程中所有的 Relax 运算符都会被下沉lower为 tir::PrimFunc 或 TVM PackedFunc这些函数可以直接在目标设备上执行。而对 Relax 运算符的调用则会被下沉为对低层函数的调用例如 R.call_tir 或 R.call_dps。转换前面介绍了关键数据结构接下来讲转换。转换的目的有优化将程序转换为等效甚至更优的版本。降级将程序转换为更接近 target 的较低级别表示。 relay/transform 包含一组优化模型的pass。优化包括常见的程序优化例如常量折叠和死码消除以及特定于张量计算的 pass例如布局转换和 scale 因子折叠。Relax 转换Relax 转换包括一系列应用于 Relax 函数的 Pass。优化内容包括常见的图级优化如常量折叠、无用代码消除等以及后端特定的优化例如库调度。tir 转换tir 转换包含一组应用于 tir 函数的 pass主要包括两类TensorIR 调度TensorIR schedule TensorIR 调度旨在为特定目标优化 TensorIR函数通常由用户指导控制目标代码的生成。对于 CPU 目标TIR PrimFunc即使没有调度也可以生成有效代码并在目标设备上运行但性能较低。对于 GPU 目标调度是生成有效线程绑定代码的关键。详情请参考TensorIR 转换教程。此外TVM 提供了 MetaSchedule 来自动搜索最优的 TensorIR 调度。降层 PassLowering Passes 这些 Pass 通常在应用调度后执行将 TIR PrimFunc转换为功能等价但更贴近目标表示的版本。例如有些 Pass 会将多维访问扁平化为一维指针访问或者将中间表示中的 intrinsic扩展为目标特定的形式并对函数入口进行修饰以符合运行时调用约定。 许多底层优化可以在目标阶段由 LLVM、CUDA C以及其他目标编译器处理。因此我们将寄存器分配等底层优化留给下游编译器处理仅专注于那些它们未涵盖的优化。跨层转换Cross-level transformationsApache TVM 提供统一的策略来优化端到端模型。由于 IRModule 同时包含 Relax 和 TIR 函数跨层转换的目标是在这两类函数之间应用变换来修改 IRModule。例如relax.LegalizeOps Pass 会通过将 Relax 算子降层为 TIR PrimFunc 并添加至 IRModule 中同时将原有的 Relax 算子替换为对该 TIR 函数的调用从而改变 IRModule。另一个例子是 Relax 中的算子融合流程包括 relax.FuseOps 和 relax.FuseTIR它将多个连续的张量操作融合为一个操作。与以往手动定义融合规则的方法不同Relax 的融合流程会分析 TIR 函数的模式自动检测出最佳融合策略。目标转换Target Translation目标转换阶段将 IRModule 转换为目标平台的可执行格式。对于 x86 和 ARM 等后端TVM 使用 LLVM IRBuilder 构建内存中的 LLVM IR。也可以生成源码级别的语言如 CUDA C 和 OpenCL。此外TVM 支持通过外部代码生成器将 Relax 函数子图直接翻译为目标代码。目标代码生成阶段应尽可能轻量大多数转换和降层操作应在此阶段之前完成。TVM 还提供了 Target 结构体用于指定编译目标。目标信息也可能影响前期转换操作例如目标的向量长度会影响向量化行为。Runtime 执行TVM runtime 的主要目标是提供一个最小的 API从而能以选择的语言包括 Python、C、Rust、Go、Java 和 JavaScript加载和执行编译好的工件。以下代码片段展示了一个 Python 示例import tvm # Python 中 runtime 执行程序示例带有类型注释 mod: tvm.runtime.Module tvm.runtime.load_module(compiled_artifact.so) arr: tvm.runtime.Tensor tvm.runtime.tensor([1, 2, 3], devicetvm.cuda(0)) fun: tvm.runtime.PackedFunc mod[addone] fun(arr) print(arr.numpy())tvm.runtime.Module 封装了编译的结果。runtime.Module 包含一个 GetFunction 方法用于按名称获取 PackedFuncs。tvm.runtime.PackedFunc 是一种为各种构造函数消解类型的函数接口。runtime.PackedFunc 的参数和返回值的类型如下POD 类型int, float、string、runtime.PackedFunc、runtime.Module、runtime.Tensor 和 runtime.Object 的其他子类。tvm.runtime.Module 和 tvm.runtime.PackedFunc 是模块化 runtime 的强大机制。例如要在 CUDA 上获取上述 addone 函数可以用 LLVM 生成主机端代码来计算启动参数例如线程组的大小然后用 CUDA 驱动程序 API 支持的 CUDAModule 调用另一个 PackedFunc。OpenCL 内核也有相同的机制。以上示例只处理了一个简单的 addone 函数。下面的代码片段给出了用相同接口执行端到端模型的示例import tvm # python 中 runtime 执行程序的示例带有类型注释 factory: tvm.runtime.Module tvm.runtime.load_module(resnet18.so) # 在 cuda(0) 上为 resnet18 创建一个有状态的图执行模块 gmod: tvm.runtime.Module factory[resnet18](tvm.cuda(0)) data: tvm.runtime.Tensor get_input_data() # 设置输入 gmod[set_input](0, data) # 执行模型 gmod[run]() # 得到输出 result gmod[get_output](0).numpy()主要的结论是 runtime.Module 和 runtime.PackedFunc 可以封装算子级别的程序例如 addone以及端到端模型。总结与讨论综上所述编译流程中的关键数据结构有IRModule包含 relay.Function 和 tir.PrimFuncruntime.Module包含 runtime.PackedFunc编译基本是在进行关键数据结构之间的转换。relay/transform 和 tir/transform 是确定性的基于规则的转换meta-schedule 则包含基于搜索的转换最后编译流程示例只是 TVM 堆栈的一个典型用例。将这些关键数据结构和转换提供给 Python 和 C API。然后就可以像使用 numpy 一样使用 TVM只不过关注的数据结构从 numpy.ndarray 改为 tvm.IRModule。以下是一些用例的示例用 Python API 直接构建 IRModule。编写一组自定义转换例如自定义量化。用 TVM 的 Python API 直接操作 IR。tvm/supportsupport 模块包含基础架构最常用的程序例如通用 arena 分配器arena allocator、套接字socket和日志logging。tvm/runtimeruntime 是 TVM 技术栈的基础。它提供加载和执行已编译产物的机制。运行时定义了一套稳定的 C API 标准接口用于与前端语言如 Python 和 Rust交互。除了 ffi::Function runtime::Object 是 TVM 运行时的核心数据结构之一。它是一个带有类型索引的引用计数基类支持运行时类型检查和向下转型。该对象系统允许开发者向运行时引入新的数据结构例如 Array、Map 以及新的 IR 数据结构。除了用于部署场景TVM 编译器本身也大量依赖运行时机制。所有 IR 数据结构都是 runtime::Object 的子类因此可以直接从 Python 前端访问和操作。我们使用 PackedFunc 机制将各种 API 暴露给前端使用。不同硬件后端的运行时支持定义在 runtime 子目录中例如 runtime/opencl。这些特定于硬件的运行时模块定义了设备内存分配和设备函数序列化的 API。runtime/rpc 实现了对 PackedFunc 的 RPC 支持。我们可以利用 RPC 机制将交叉编译后的库发送到远程设备并基准测试其执行性能。该 RPC 基础设施使得能够从多种硬件后端收集数据用于基于学习的优化。TVM 运行时系统运行时信息模块序列化指南设备/目标交互tvm/nodenode 模块在 runtime::Object 的基础上为 IR 数据结构增加了更多功能。其主要功能包括反射、序列化、结构等价性检查以及哈希计算。得益于 node 模块我们可以在 Python 中通过字段名直接访问 TVM IR 节点的任意字段x tvm.tir.Var(x, int32) y tvm.tir.Add(x, x) # a 和 b 是 tir.Add 节点的字段 # 可以通过字段名直接访问 assert y.a x我们还可以将任意 IR 节点序列化为 JSON 格式并加载回来。这种保存/加载和查看 IR 节点的能力为提高编译器的可用性打下了基础。tvm/irtvm/ir 文件夹包含所有 IR 函数变体所共享的统一数据结构与接口。该模块中的组件被 tvm/relax 和 tvm/tir 共享主要包括IRModule类型PassContext 和 PassOp不同的函数变体如 relax.Function 和 tir.PrimFunc可以共存于一个 IRModule 中。尽管这些变体的内容表示不同但它们使用相同的数据结构来表示类型。因此不同函数变体之间可以共享函数签名的表示结构。统一的类型系统使得在定义好调用约定的前提下一个函数变体可以调用另一个从而为跨函数变体的优化奠定了基础。此外我们还提供了统一的 PassContext 用于配置 Pass 行为并提供组合 Pass 的方式构建优化流程。如下示例# 配置 tir.UnrollLoop pass 的行为 with tvm.transform.PassContext(config{tir.UnrollLoop: { auto_max_step: 10 }}): # 在该上下文下执行的代码Op 是用于表示系统内置的原始操作符/内建指令的通用类。开发者可以向系统注册新的 Op并附加属性例如该操作是否是逐元素操作。Pass 基础设施tvm/targettarget 模块包含将 IRModule 转换为目标运行时代码的所有代码生成器同时也提供了一个通用的 Target 类用于描述目标平台。编译流程可以根据目标平台的属性信息和每个目标 id如 cuda、opencl所注册的内建信息来自定义。设备/目标交互tvm/relaxRelax 是用于表示模型计算图的高级 IR。多种优化过程定义在 relax.transform 中。需要注意的是Relax 通常与 TensorIR 的 IRModule 协同工作许多转换会同时作用于 Relax 和 TensorIR 函数。更多信息可参考 Relax 深度解析。tvm/tirTIR 定义了低级程序表示。我们使用 tir::PrimFunc 来表示可以由 TIR Pass 转换的函数。除了 IR 数据结构TIR 模块还包括位于 tir/schedule 中的一组调度原语位于 tir/tensor_intrin 中的内置指令位于 tir/analysis 中的分析 Pass位于 tir/transform 中的转换/优化 Pass更多信息请参考 TensorIR 深度解析。tvm/arith该模块与 TIR 紧密相关。低级代码生成中的一个核心问题是对索引的算术属性进行分析——如是否为正数、变量界限、描述迭代器空间的整数集合等。arith 模块提供了一套主要用于整数分析的工具TIR Pass 可以利用这些工具简化和优化代码。tvm/te 和 tvm/topiTETensor Expression是用于描述张量计算的领域专用语言DSL。需要注意的是Tensor Expression 本身并不是可以直接存储进 IRModule 的自包含函数。我们可以使用 te.create_prim_func 将其转换为 tir::PrimFunc然后集成进 IRModule。尽管可以使用 TIR 或 TE 为每个场景直接构造算子但这种方式较为繁琐。为此topiTensor Operator Inventory提供了一组预定义算子覆盖了 numpy 操作和深度学习常见操作。tvm/meta_scheduleMetaSchedule 是一个用于自动搜索优化程序调度的系统。它是 AutoTVM 和 AutoScheduler 的替代方案可用于优化 TensorIR 调度。需要注意的是MetaSchedule 目前仅支持静态形状工作负载。tvm/dlightDLight 提供一套预定义、易用且高性能的 TIR 调度策略。其目标包括全面支持动态形状工作负载轻量级提供无需调优或仅需极少调优的调度策略且性能合理稳定性强DLight 的调度策略具有通用性即使当前规则不适用也不会报错而是自动切换至下一个规则

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询