【TVM教程】设备/目标交互

TVM设备与目标交互:深度学习模型高效部署的硬件适配指南 在深度学习模型部署领域,硬件适配是核心挑战之一。其原理在于将抽象的模型计算图映射到具体物理设备的计算能力与内存特性上,这直接决定了模型的执行效率。TVM(Tensor Virtual Machine)通过引入“目标”这一硬件能力描述符,在编译时指导优化与代码生成,实现跨平台性能优化。这项技术的核心价值在于解决了模型可移植性与硬件性能之间的矛盾,使得同一模型能在CPU、GPU、NPU等多种设备上高效运行。应用场景广泛覆盖边缘计算、移动端部署、云端推理等。本文聚焦于TVM中设备与目标交互的实践,深入解析如何正确 阅读详情

TVM 现已更新到 0.21.0 版本,TVM 中文文档已经和新版本对齐。

Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。

在线运行 TVM 学习教程→https://go.hyper.ai/PEh1Q

本文档面向希望了解 TVM 框架如何与特定设备 API 进行交互的开发者,或希望为新的 API 或新硬件添加支持的开发者。

对于任何新的运行时环境,需要实现三个主要部分:

  • DeviceAPI <tvm-target-specific-device-api>{.interpreted-text role=“ref”} 类提供对特定设备的句柄,以及用于与其交互的 API。它定义了一套通用接口,用于查询设备参数(例如:可用内存、线程数量等),以及执行简单操作(例如:从主机复制内存,或在设备缓冲区之间复制数据)。
  • Target <tvm-target-specific-target>{.interpreted-text role=“ref”} 类包含将要运行函数的设备描述。它同时暴露给目标代码生成器和优化 Pass。
  • 目标代码生成器 <tvm-target-specific-codegen>{.interpreted-text role=“ref”} 从 IRModule 构建一个由一个或多个 PackedFunc <tvm-runtime-system-packed-func>{.interpreted-text role=“ref”} 组成的 Module <tvm-runtime-system-module>{.interpreted-text role=“ref”}。

DeviceAPI​

DeviceAPI(设备 API)表示对特定硬件设备 API 的访问句柄。(例如,CUDADeviceAPI 处理所有通过 CUDA 框架的交互。)大多数 DeviceAPI 方法都接受一个 device_id 参数,用于指定访问哪个设备。

在 Python 中,通常使用 tvm.runtime.device{.interpreted-text role=“py:func”} 函数访问特定设备,该函数返回指定 API 所访问设备的句柄。(例如,tvm.runtime.device('cuda', 0) 表示访问通过 CUDA API 访问的物理设备 0。)

  • 属性查询 — GetAttr 用于查询不同的设备特定参数,例如设备名称、线程数量等。可查询的参数定义在 enum DeviceAttrKind,文件位置: device_api.h。 并非所有参数都适用于所有设备。如果某个参数无法查询(例如 Vulkan 上的 kMaxClockRate),或不适用(例如 CPU 上的 kWarpSize),应返回 nullptr。

  • 设置活动设备 — SetDevice 应将某个设备设置为当前活动设备。如果目标代码生成器生成的 PackedFunc 需要在设备上执行,该执行应发生在当前活动设备上。

  • 内存管理 — 用于在设备上分配和释放内存的工具函数。

    • 分配数据空间 — AllocDataSpace 和 FreeDataSpace 用于在设备上分配和释放数据存储空间。这些空间可作为算子输入和输出,并构成算子图的主要数据流。必须支持主机与数据空间之间的数据传输。返回值为不透明指针 void*。某些实现返回真实地址,但这不是必须的,该指针也可能是仅可由设备后端解释的句柄。该 void* 将作为参数传递给其他后端函数(例如 CopyDataFromTo)。
    • 分配工作空间 — AllocWorkspace 和 FreeWorkspace 用于分配和释放工作区。这些区域用于算子内部中间值存储,不要求可与主机传输。如果子类未实现,则默认调用对应的数据空间分配函数。
    • 数据复制 — CopyDataFromTo 应在不同位置之间复制数据。复制类型由 dev_from 和 dev_to 决定。实现应该支持将内存从CPU复制到设备,从设备复制到CPU,以及在单个设备上从一个缓冲区复制到另一个缓冲区。如果源或目标位于 CPU,则指针为可直接用于 memcpy 的主机地址;如果位于设备,则指针必定由 AllocDataSpace 或 AllocWorkspace 生成。
      这些复制会排队在某个 TVMStreamHandle 流中执行。但是实现不应假设 CPU 缓冲区在函数返回后仍然有效或可访问。
  • 执行流管理 — 管理 TVMStreamHandle(执行命令的并行流)。

    • 创建流 — CreateStream / FreeStream 负责分配和释放执行流。如果设备只有单一指令队列,则 CreateStream 应返回 nullptr。
    • 设置活动流 — SetStream 用于将某个流设置为当前活跃流。目标代码生成器生成的函数执行时应提交到该流。
    • 同步到 CPU — StreamSync 应同步流,使之在执行完成前阻塞返回。
    • 流间同步 — SyncStreamFromTo 应在两个流之间插入同步屏障,使目标流在源流执行完当前排队命令前无法继续执行。

为了使 TVM 能够使用新的 DeviceAPI,需要执行以下注册步骤:

  1. 创建一个实例化 DeviceAPI 并返回其指针的函数:
FooDeviceAPI* FooDeviceAPI::Global() {
  static FooDeviceAPI inst;
  return &inst;
}
  1. 在 TVM 注册表中注册:
TVM_FFI_STATIC_INIT_BLOCK() {
  namespace refl = tvm::ffi::reflection;
  refl::GlobalDef().def("device_api.foo", FooDeviceAPI::Global);
}
  1. 在 base.h 的 TVMDeviceExtType 枚举中为新的 DeviceAPI 添加条目。值需大于 DLDeviceType::kDLExtDev,且小于 DeviceAPIManager::kMaxDeviceAPI。
  2. 在 device_api.h 的 DeviceName 中添加对应枚举 → 字符串映射,该字符串需与 GlobalDef().def 中一致。
  3. 在 tvm.runtime.Device的 _DEVICE_TYPE_TO_NAME 与 _DEVICE_NAME_TO_TYPE 字典中添加对应映射。

Target 定义​

Target 对象是有关物理设备、其硬件/驱动限制和能力的属性查询表。Target 可在优化阶段和代码生成阶段使用。虽然所有运行时共享相同的 Target 类,但不同运行时可能需要额外的 target 特定属性。

在 target_kind.cc 中使用 TVM_REGISTER_TARGET_KIND 注册新的 target,需传入 target 名称,以及对应运行设备的 TVMDeviceExtType 或 DLDeviceType。通常情况下,target 名称和设备名称一致(如 "cuda" 运行于 kDLCUDA),但也有例外(例如 "llvm" 与 "c" 目标都运行于 kDLCPU)。

所有 target 选项通过 add_attr_option 添加,可带默认值。可以使用 set_target_parser 添加解析器,用于处理依赖其他参数或硬件属性的动态参数。

该参数解析器定义了如何从字符串格式构造 target。这由 Target::Target(const String&) 构造函数执行,该构造函数接受 JSON 格式字符串,通常通过 Python:

tvm.target.Target('{"kind": "cuda", "max_num_threads": 1024}')

在代码生成器中,可通过以下方式访问 target 属性:

  • C++:target->GetAttr<T>(param_name)
  • Python:target.attrs

Target 代码生成器​

代码生成器将优化后的 IRModule 转换为可执行表示。每个代码生成器必须注册到 TVM 框架中,其名称为:

"target.build.foo"

其中 foo 与先前 TVM_REGISTER_TARGET_KIND 中的名称一致。

示例:

tvm::runtime::Module GeneratorFooCode(IRModule mod, Target target);
TVM_FFI_STATIC_INIT_BLOCK() {
  namespace refl = tvm::ffi::reflection;
  refl::GlobalDef().def("target.build.foo", GeneratorFooCode);
}

代码生成器有两个参数。第一个是要编译的IRModule,第二个是描述代码应该运行在哪个设备上的目标 Target。由于编译环境不一定与执行环境相同,因此代码生成器不应直接向设备查询属性,而应始终使用 Target 中的属性。

输入 IRModule 中的每个函数都应在输出的 runtime::Module 中可通过名称访问。

【TVM系列二】TVM介绍 文章同步更新在公众号 AIPlayer,欢迎扫码关注,共同进步 目录 一、TVM的工作流程 1、整体流程 2、关键数据结构 3、Transformations 4、搜索空间和基于机器学习的转换 5、目标代码转化 二、逻辑架构组件 三、运行TVM实例 1、交叉编译runtime 2、编译模型 3、运行模型 四、总结 一、TVM的工作流程 TVM主要由两个部分组成: (1)TVM编译器:负责编译和优化模型 (2)TVM runtime:提供目标设备上运行模型的API .. 阅读详情

相关推荐

TVM-初识TVM

目录TVM简介那么TVM是什么?TVM做了哪些工作 TVM简介 随着深度学习的发展,深度学习的能力可以说是越来越强大,识别率节节攀升,与此同时,深度学习框架也变得越来越多,目前比较主流的深度学习框架包括:Pytorch、TensorFlow、MxNet、Caffe、Keras等。 一般进行深度学习任务主要包括两部分,一是训练出精度比较高的模型,然后将其部署到对应的目标机器上。 针对第一部分,自然我们可以使用各种深度学习框架,通过修改网络参数等,训练出精度比较满意的模型,一般情况下,在训练深度学习模型的时候,

qq_33287871的博客 4433

初识 TVM

如有图像或公式显示错误,可以访问我的个人博客:https://www.wanglichun.tech/2019/11/15/tvm/ 笔者也是最近偶然的机会才开始接触TVM,使用过后发现,经过auto-tuning后的TVM模型在速度是竟然超过了TensorRT,并且笔者使用的是MXNet框架,TVM对MXNet绝对的友好,对于Pytorch等模型,可以使用ONNX,操作也一样简单,使用起来基本类...

小菜鸟的AI之路 7152

UE4/5项目GPU崩溃?可能是Windows的TDR机制在搞鬼!深入浅出聊聊TdrDelay与显卡超时

本文深入探讨了UE4/5项目中GPU崩溃的常见原因,揭示了Windows TDR机制的工作原理及其对渲染进程的影响。通过调整TdrDelay参数和优化GPU负载,提供了解决显卡超时问题的实用方案,帮助开发者提升项目稳定性。

weixin_30691649的博客 410

【TVM系列教程一】深度学习编译器及TVM 介绍

0x0. 介绍大家好呀,在过去的半年到一年时间里,我分享了一些算法解读,算法优化,模型转换相关的一些文章。这篇文章是自己开启学习深度学习编译器的第一篇文章,后续也会努力更新这个系列。这篇文...

算法码上来 2231

退火朗之万动力学采样

退火朗之万动力学采样(Simulated Annealing Langevin Dynamics Sampling)结合了退火技术和朗之万动力学,是一种用于分子模拟和统计物理中的计算方法。这种方法可以帮助系统从局部最小值中逃逸,以找到全局最小值或进行有效的配置空间探索。

weixin_39699362的博客 1949

vTaskStartScheduler()详解

是启动 FreeRTOS 实时内核的“扳机”。在调用它之前,你只是创建了一些任务结构,但它们都处于“待命”状态,系统仍然在按传统的裸机前后台方式运行。调用这个函数后,FreeRTOS 内核会接管系统的控制权,开始根据优先级调度你创建的任务,多任务环境才真正开始。关键点:它没有参数。它的所有行为都由中的配置宏控制。它通常不会返回。一旦调用,除非没有任务可以运行(或者你显式地停止了调度器),否则程序流永远不会回到main()函数中调用它的下一行。是一个没有参数但行为由精密控制的函数。

Shylock_Mister的博客 1594

TVM Compiler中文教程:TVM使用内联和数学函数

文章目录TVM使用内联和数学函数直接声明外部数学函数调用统一内联函数调用内部Lowering规则总结 TVM使用内联和数学函数 TVM支持基础算术运算操作,但是在很多情况下我们需要更复杂的內建函数。例如exp指数函数。 这些內建函数取决于目标系统,在不同的平台可能有不同的名字。这个教程中,我们将学习调用目标特定的內建函数,和怎么能够通过TVM内联API统一接口。 from __future__ i...

Mars_WH的专栏 2267

LLCE、PFE模块,二层交换/桥接的通用学习转发机制

NXP 文档里给出的正式全称如下:面向 CAN/CAN-FD、LIN、FlexRay 的“低延迟通信引擎”,用多核 M0 固件做报文收发、过滤、路由,把主 CPU 中断负荷降到几乎 0。“数据包转发引擎”,负责以太网帧的分类、修改、转发、VLAN/NAT/IPsec 等 offload,支持 2 Gbit/s 线速且主机负载 ≈0。两者都跑各自固件,通过内部 AXI 桥可互连,实现“CAN→ETH”零主核参与的硬件级网关功能。是它们都集成在。

qq_25461777的博客 1303

【TVM 教程】Python 目标参数化

​对于任何支持的开发环境,TVM 都应该生成数值正确的结果。因此,在编写验证数值输出的单元测试时,这些单元测试应在所有受支持的开发环境上执行。由于这是一个非常常见的使用场景,TVM 提供了辅助函数来参数化单元测试,使它们可以在所有已启用且具有兼容设备的目标上运行。测试套件中的一个 Python 函数可以展开成多个参数化的单元测试,每个测试针对一个单一的目标设备。测试必须存在于已传递给 pytest 的文件或目录中。

HyperAI超神经 476

基于航天宏图PIE-SAR软件的高分三号(GF-3)SAR影像的预处理

软件官网 航天宏图—国内领先的卫星运营与应用服务提供商(官网) 一、数据导入 数据导入-GF-3-根据模式选择 参数文件导入解压后GF-3数据的XML文件 通道自动填充 设置输出目录 确定 等待,加载图像、自动构建金字塔 二、复数数据转换 强度/幅度特征是SAR影像最主要的特征之一,基于SAR强度/幅度影像可以提取地物目标信息,因此需要将SAR复数数据转换为SAR强度/幅度数据。导入输入影像,设置参数类型,输出目录、命名、类型; 漫长的等待 三、多视 为提...

weixin_52127098的博客 9003

结构力学本构模型:复合材料模型:复合材料热力学行为技术教程_2024-08-07_06-54-53.Tex

热塑性复合材料是一种由热塑性树脂基体和增强纤维组成的复合材料。与热固性复合材料不同,热塑性复合材料在加热时可以软化,冷却时硬化,这一过程可以重复进行,因此它们具有可回收和可再加工的特性。热塑性树脂,如聚酰胺(尼龙)、聚碳酸酯、聚醚醚酮(PEEK)等,与碳纤维、玻璃纤维等增强材料结合,可以制备出具有高强度、高刚度和良好耐热性的复合材料。热粘弹性理论是研究材料在温度变化和时间依赖性载荷作用下的变形和应力响应。复合材料,由于其独特的微观结构,展现出复杂的热粘弹性行为。

808

TVM设备与目标交互:深度学习模型部署的核心机制解析

在深度学习模型部署领域,异构计算是解决训练与部署环境差异的关键技术。其核心原理在于通过中间表示和编译器优化,将高级计算描述转换为适应不同硬件架构的本地高效代码。这一过程的技术价值在于实现了模型在不同硬件平台上的高性能、可移植部署。应用场景广泛涵盖从云端GPU服务器到边缘设备如手机CPU、嵌入式NPU等多样化环境。TVM作为深度学习编译栈,通过设备与目标的交互机制,将编译时硬件环境描述与运行时物理执行实体解耦,其中目标定义硬件指令集、计算单元和运行时库,而设备则负责实际计算和内存管理,这种设计使得同一编译产物

weixin_33525298的博客 284

vscode配置matlab工作环境

前面有两篇文章我们分别讲了在vscode里面如何配置C语言环境和python环境,那两篇文章总体来说比较复杂,当然这篇也有许多有趣的问题。 附上链接: 文章目录matlab简介基本要求code runner插件与matlab相关的插件添加路径小结code runner是否支持更多语言更多选择另一个选择 matlab简介 MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 MATLAB是ma

Cachel Wood的博客 4541

【TVM 教程】设置 RPC 系统

Apache TVM是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →远程过程调用(RPC)是 Apache TVM 的一个非常重要且有用的功能,它允许我们在实际硬件上运行编译后的神经网络(NN)模型,而无需触及远程设备,输出结果将通过网络自动传回。通过消除手动工作,如将输入数据转储到文件、将导出的 NN 模型复制到远程设备、设置设备用户环境以及将输出结果复制到主机开发环境,RPC 极大地提高了开发效率。

HyperAI超神经 1072

微信删除的聊天记录怎么恢复(2024年最新攻略合集)

随着微信对我们生活中方方面面的渗透,微信已然从一款简单的社交软件过渡成为现时代的一种生活方式,而微信中的聊天记录就是我们和朋友之间历程的最好证明。对此,今天我们来聊聊微信删除的聊天记录怎么恢复的问题。

m0_70960708的博客 945

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【TVM 教程】向 TVM 中添加 Codegen

Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →https://tvm.hyper.ai/

HyperAI超神经 1044

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【TVM教程】在 Arduino 上为 microTVM 训练视觉模型

​构建物联网设备时,通常想让它们能够看到并理解它们周围的世界。可以采取多种形式,但通常设备也会想知道某种物体是否在其视野中。例如,安全摄像头可能会寻找人,因此它可以决定是否将视频保存到内存中。红绿灯可能会寻找汽车,这样它就可以判断哪个信号灯应该首先改变。或者森林相机可能会寻找一种动物,从而估计动物种群的数量。为使这些设备价格合理,我们希望为这些设备配置一个低成本处理器,如nRF52840(在 Mouser 上每个售价 5 美元)或RP2040(每个只需 1.45 美元)。

HyperAI超神经 1067

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

TVM简介

TVM软件栈 工作流程 从已有的深度学习框架中获取一个模型并将此模型转换为计算图表示(深度学习框架的前端主要是计算图表示以及自动梯度); 图中 Section 3 使用一些方法优化当前的计算图得到优化后的计算图(操作融合,可以将多个操作合并为一个kernel,以此节省存储中间结果的空间;数据布局转换,改变计算图中张量的存储方式以适应目标硬件设备并提升执行效率); 图中 Section 4 针对...

MLer 4万+

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

深度学习编译器学习记录~

ict_rtf的博客 4012

【tvm官网教程】张量表达与调度

【tvm官网教程】张量表达与调度目的1. 调度原语1.1 te常用接口1.2 stage常用成员函数欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 目的 编译器是下一代大厂之争的关键,曾经有过

B10030607的博客 2407

TVM设备与目标交互:从硬件抽象到高效部署的完整指南

在深度学习模型部署中,硬件适配是核心挑战。模型需要从高级框架的通用表示转换为特定硬件的底层指令,这一过程涉及硬件能力抽象、编译优化和运行时调度。TVM作为深度学习编译器,通过Target(目标)对硬件能力进行结构化描述,包括指令集、内存层级和厂商库支持,为编译器提供优化蓝图。在运行时,Device(设备)作为硬件实例,与Runtime系统协同工作,管理内存分配、内核启动和异步执行。理解设备与目标交互的原理,能够解决模型跨平台部署中的兼容性和性能问题,特别是在边缘计算和异构硬件场景下,实现从CPU、GPU到专

weixin_29058331的博客 318

如何在H20上安装FlashKDA?SM90环境避坑实战清单

**FlashKDA** 是一个基于 CUTLASS 构建的高性能 **Kimi Delta Attention(KDA)CUDA 算子**项目,把门控线性注意力的前向计算融合成两个低层 kernel,在 H20 上对比 `fla_chunk_kda` 可获得约 **1.9×~2.3×** 的加速。本文面向 H20(SM90)环境,给出完整的 4 步安装流程和一份实战避坑清单,帮你在第一遍编译就顺

gitblog_00695的博客 723

【TVM教程】设计与架构

IRModule:包含 relay.Function 和 tir.PrimFuncruntime.Module:包含 runtime.PackedFunc编译基本是在进行关键数据结构之间的转换。relay/transform 和 tir/transform 是确定性的基于规则的转换meta-schedule 则包含基于搜索的转换最后,编译流程示例只是 TVM 堆栈的一个典型用例。将这些关键数据结构和转换提供给 Python 和 C++ API。

HyperAI超神经 1245

TVM -- Design and Architecture

本文档适用于想要了解 TVM 架构和/或积极开发项目的开发人员。该页面的组织如下: 示例编译流程概述了 TVM 将模型的高级描述转换为可部署模块所采取的步骤。 要开始使用,请先阅读本节。 逻辑架构组件部分描述了逻辑组件。 后面的部分是针对每个逻辑组件的特定指南,按组件的名称组织。 设备/目标交互页面描述了 TVM 如何与每个受支持的物理设备和代码生成目标进行交互。 请随意查看开发人员操作指南以获取有用的开发技巧。 本指南提供了架构的一些补充视图。 首先,我们回顾了一个端到端的编译流程,并讨论了关键的数据

zachariah2000的博客 4499

【TVM 教程】Python Target 参数化

Apache TVM 是一个深度的深度学习编译框架,适用于 CPU、GPU 和各种机器学习加速芯片。更多 TVM 中文文档可访问 →远程过程调用(RPC)是 Apache TVM 的一个非常重要且有用的功能,它允许我们在实际硬件上运行编译后的神经网络(NN)模型,而无需触及远程设备,输出结果将通过网络自动传回。通过消除手动工作,如将输入数据转储到文件、将导出的 NN 模型复制到远程设备、设置设备用户环境以及将输出结果复制到主机开发环境,RPC 极大地提高了开发效率。

HyperAI超神经 837
上一篇: 从Moltrbot到政策红利,站在风口的「AI一人公司」能否做大做强?
下一篇: 【Triton 教程】triton_language.abs
HyperAI超神经
博客等级 码龄7年 8872粉丝 1753原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值