【TVM教程】设备/目标交互
TVM 现已更新到 0.21.0 版本TVM 中文文档已经和新版本对齐。Apache TVM 是一个深度的深度学习编译框架适用于 CPU、GPU 和各种机器学习加速芯片。在线运行 TVM 学习教程链接是https://hyper.ai/notebooks/48919?utm_sourceDistributeutm_mediumDistribute-TVMutm_campaignDistribute-TVM-260126本文档面向希望了解 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需要执行以下注册步骤创建一个实例化 DeviceAPI 并返回其指针的函数FooDeviceAPI* FooDeviceAPI::Global() { static FooDeviceAPI inst; return inst; }在 TVM 注册表中注册TVM_FFI_STATIC_INIT_BLOCK() { namespace refl tvm::ffi::reflection; refl::GlobalDef().def(device_api.foo, FooDeviceAPI::Global); }在 base.h 的TVMDeviceExtType枚举中为新的 DeviceAPI 添加条目。值需大于DLDeviceType::kDLExtDev且小于DeviceAPIManager::kMaxDeviceAPI。在 device_api.h 的DeviceName中添加对应枚举 → 字符串映射该字符串需与GlobalDef().def中一致。在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 格式字符串通常通过 Pythontvm.target.Target({kind: cuda, max_num_threads: 1024})在代码生成器中可通过以下方式访问 target 属性Ctarget-GetAttrT(param_name)Pythontarget.attrsTarget 代码生成器​代码生成器将优化后的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中可通过名称访问。

相关新闻

矩阵的行列式是什么

矩阵的行列式是什么

矩阵的行列式(determinant,简称 det)是线性代数中一个非常重要的概念。它只定义在方阵(行数等于列数的矩阵)上,是一个从矩阵中计算出来的标量值(就是一个数字)。行列式反映了矩阵在线…

2026/7/6 6:13:31 阅读更多 →
<span class=“js_title_inner“>10种顶级 AI Agent 策略全解析:ChatGPT 智能应用开发必备指南</span>

<span class=“js_title_inner“>10种顶级 AI Agent 策略全解析:ChatGPT 智能应用开发必备指南</span>

随着 ChatGPT 等大语言模型的普及,AI Agent 已成为下一代 AI 应用的核心。本文深入浅出地介绍 Agent 策略模式,帮助你理解如何选择和应用不同的 Agent 架构,打造更智能的 AI 应用。AI 工具中的 Agent:从理论到实践如今&#xff0c…

2026/7/5 2:51:54 阅读更多 →
DDoS安全防护怎么选,如何挑选DDoS防护

DDoS安全防护怎么选,如何挑选DDoS防护

DDoS防护的选择标准选择DDoS防护方案需综合考虑业务规模、预算、攻击类型及服务商能力。防护方案应具备弹性扩展、实时监测和快速响应能力。评估时需关注防护带宽、清洗能力、响应时间等核心指标。评估业务需求明确业务对延迟和可用性的要求。金融、游戏等行业需低延迟和高可用…

2026/7/3 15:29:11 阅读更多 →

最新新闻

思源宋体完整指南:免费开源字体如何提升你的中文设计品质

思源宋体完整指南:免费开源字体如何提升你的中文设计品质

思源宋体完整指南:免费开源字体如何提升你的中文设计品质 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为寻找高质量的中文字体而烦恼吗?思源宋体这款由A…

2026/7/6 6:12:49 阅读更多 →
华为云 ECS 上部署 Prometheus + Grafana 监控体系

华为云 ECS 上部署 Prometheus + Grafana 监控体系

ECS 规格: **ECS-Monitor** | 2vCPU / 4GiB(s6.medium.2) | Ubuntu 22.04 | 40GiB SSD | 1 | 跑 Prometheus Grafana Alertmanager | | **ECS-Target** | 2vCPU / 2GiB(s6.small.2) | Ubuntu 22.04 | 40GiB SSD | …

2026/7/6 6:10:48 阅读更多 →
如何用Zotero-Better-Notes实现笔记双向同步:告别手动复制粘贴的终极指南

如何用Zotero-Better-Notes实现笔记双向同步:告别手动复制粘贴的终极指南

如何用Zotero-Better-Notes实现笔记双向同步:告别手动复制粘贴的终极指南 【免费下载链接】zotero-better-notes Everything about note management. All in Zotero. 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-better-notes 还在为Zotero和Obsidi…

2026/7/6 6:08:46 阅读更多 →
短剧出海中小企业主流广告素材监测工具(2026 最新,预算友好型)

短剧出海中小企业主流广告素材监测工具(2026 最新,预算友好型)

按中小团队适配度、短剧垂直能力、价格、国内访问稳定性分为 4 大类:短剧专精平价工具、通用高性价比工具、大厂专业工具(预算充足再选)、官方免费工具(基础备用)。一、短剧垂直专精(中小短剧团队首选&…

2026/7/6 6:06:46 阅读更多 →
Adobe软件激活新选择:5分钟掌握通用破解工具

Adobe软件激活新选择:5分钟掌握通用破解工具

Adobe软件激活新选择:5分钟掌握通用破解工具 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 还在为Adobe Creative Cloud的高昂订阅费而犹豫吗&#xff…

2026/7/6 6:06:46 阅读更多 →
智能网盘直链解析:重新定义文件下载体验

智能网盘直链解析:重新定义文件下载体验

智能网盘直链解析:重新定义文件下载体验 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 / 迅雷云…

2026/7/6 6:02:46 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻