利用 UMA 使硬件加速器可直接用于 TVM

简介: 利用 UMA 使硬件加速器可直接用于 TVM

本篇文章译自英文文档 Making your Hardware Accelerator TVM-ready with UMA

作者是 Michael J. Klaiber,Christoph Gerum,Paul Palomero Bernardo。

更多 TVM 中文文档可访问 →TVM 中文站

本节介绍通用模块化加速器接口(UMA)。UMA 提供了一个易用的 API 来将新的硬件加速器集成到 TVM 中。

本教程详细介绍了如何利用 UMA 使得你的硬件加速器可直接用于 TVM。虽然这个问题没有万能的解决方案,但 UMA 旨在提供一个稳定的纯 Python API,从而将许多种类的硬件加速器集成到 TVM 中。

本教程将通过三个逐渐复杂的用例来介绍 UMA API。这些用例引入了三个模拟加速器 Vanilla、Strawberry 和 Chocolate,并用 UMA 将它们集成到 TVM 中。

Vanilla

Vanilla 是一个由 MAC 数组组成的简单加速器,没有内部存储器。它只能处理 Conv2D 层,所有其他层都在 CPU 上执行,同时也协调 Vanilla。 CPU 和 Vanilla 共享内存。

Vanilla 的 C 接口 vanilla_conv2dnchw(...) 用于执行 Conv2D 操作(包括 same-padding),它接收指向输入特征图、权重和结果的指针,以及 Conv2D 的维度:oc、iw、ih、ic、kh 和 kw。

int vanilla_conv2dnchw(float* ifmap, float*  weights, float*  result, int oc, int iw, int ih, int ic, int kh, int kw);

脚本 uma_cli 为新的加速器创建带有 API(UMA-API)调用的代码骨架。

Vanilla 的使用方式如下:(--tutorial vanilla 添加了本部分教程所需的所有附加文件)

pip install inflection
cd $TVM_HOME/apps/uma
python uma_cli.py --add_hardware vanilla_accelerator --tutorial vanilla

uma_cli.py 在 vanilla_accelerator 目录中生成这些文件。

backend.py
codegen.py
conv2dnchw.cc
passes.py
patterns.py
run.py
strategies.py

Vanilla 后端

vanilla 生成的后端位于 vanilla_accelerator/backend.py 中:

class VanillaAcceleratorBackend(UMABackend):
 """VanillaAccelerator 的 UMA 后端。"""
 def __init__(self):
 super().__init__()
        self._register_pattern("conv2d", conv2d_pattern())
        self._register_tir_pass(PassPhase.TIR_PHASE_0, VanillaAcceleratorConv2DPass())
        self._register_codegen(fmt="c", includes=gen_includes)
 @property
 def target_name(self):
 return "vanilla_accelerator"

定义迁移模式

为了指定 Conv2D 迁移到 Vanilla,vanilla_accelerator/patterns.py 中将其描述为 Relay 数据流模式(DFPattern)。

def conv2d_pattern():
    pattern = is_op("nn.conv2d")(wildcard(), wildcard())
    pattern = pattern.has_attr({"strides": [1, 1]})
 return pattern

为了将输入计算图的 Conv2D 算子映射到 Vanilla 的底层函数调用 vanilla_conv2dnchw(...),在 VanillaAcceleratorBackend 中注册了 TIR pass VanillaAcceleratorConv2DPass(稍后讨论)。

Codegen

文件 vanilla_accelerator/codegen.py 定义了静态 C 代码,它被添加到生成的结果 C 代码(由 gen_includes 中的 TVM 的 C-Codegen 生成)中,其目的是包含 Vanilla 的底层库 vanilla_conv2dnchw()。

def gen_includes() -> str:
    topdir = pathlib.Path(__file__).parent.absolute()
    includes = ""
    includes += f'#include "{topdir}/conv2dnchw.cc"'
 return includes

如上面的 VanillaAcceleratorBackend 所示,用 self._register_codegen 可将其注册到 UMA。

self._register_codegen(fmt="c", includes=gen_includes)

构建神经网络并在 Vanilla 上运行

为了演示 UMA 的功能,将为单个 Conv2D 层生成 C 代码,并在 Vanilla 加速器上运行。文件 vanilla_accelerator/run.py 提供了一个使用 Vanilla 的 C-API 运行 Conv2D 层的 demo。

def main():
    mod, inputs, output_list, runner = create_conv2d()
    uma_backend = VanillaAcceleratorBackend()
    uma_backend.register()
    mod = uma_backend.partition(mod)
    target = tvm.target.Target("vanilla_accelerator", host=tvm.target.Target("c"))
    export_directory = tvm.contrib.utils.tempdir(keep_for_debug=True).path
 print(f"Generated files are in {export_directory}")
    compile_and_run(
        AOTModel(module=mod, inputs=inputs, outputs=output_list),
        runner,
        interface_api="c",
        use_unpacked_api=True,
        target=target,
        test_dir=str(export_directory),
 )
main()

运行 vanilla_accelerator/run.py,将以模型库格式(MLF)生成输出文件。

输出结果:

Generated files are in /tmp/tvm-debug-mode-tempdirs/2022-07-13T13-26-22___x5u76h0p/00000

查看生成的文件:

输出结果:

cd /tmp/tvm-debug-mode-tempdirs/2022-07-13T13-26-22___x5u76h0p/00000
cd build/
ls -1
codegen
lib.tar
metadata.json
parameters
runtime
src

若要评估生成的 C 代码,请查看 codegen/host/src/default_lib2.c。

cd codegen/host/src/
ls -1
default_lib0.c
default_lib1.c
default_lib2.c

在 default_lib2.c 中,可以看到生成的代码调用了 Vanilla 的 C-API,然后执行了一个 Conv2D 层:

TVM_DLL int32_t tvmgen_default_vanilla_accelerator_main_0(float* placeholder, float* placeholder1, float* conv2d_nchw, uint8_t* global_workspace_1_var) {
 vanilla_accelerator_conv2dnchw(placeholder, placeholder1, conv2d_nchw, 32, 14, 14, 32, 3, 3);
 return 0;
}


Strawberry

即将上线

Chocolate

即将上线

征求社区意见

若本教程不适合你的加速器,请将你的需求添加到 TVM 论坛中的 UMA 帖子 中。我们很乐意通过扩展本教程来提供更多指导,例如如何利用 UMA 接口使得更多种类的 AI 硬件加速器可直接用于 TVM。

参考

[UMA-RFC]UMA:通用模块化加速器接口,TVM RFC,2022 年 6 月。

[DFPattern]Relay 中的模式匹配

下载 Python 源代码:uma.py

下载 Jupyter Notebook:uma.ipynb

以上就是该文档的全部内容,点击查看更多 TVM 中文文档。

相关文章
|
8月前
|
人工智能 文字识别 物联网
ModelScope魔搭社区发布月报 -- 26年2月
临近年关,ModelScope迎来春节模型发布潮:Qwen3、GLM-4.7、MiniMax M2.1等大模型密集上新;AIGC生图、语音合成、具身智能全面突破;OpenAPI、OAuth、Gallery等生态基建同步升级,加速AI开源普惠。(239字)
1155 7
|
3月前
|
存储 人工智能 安全
OpenClaw一键安装TopClaw官网,小龙虾智能体汉化版下载教程
TopClaw是OpenClaw官方中文汉化版,一键安装、零代码门槛,支持Win/Mac全平台。全程中文界面,术语通俗易懂,自动配置环境,安装仅需2-3分钟。功能完整无阉割,数据本地存储,隐私安全可靠,目前为国内装机量与好评率双第一的开源AI工具。
569 0
|
5月前
|
JSON 前端开发 测试技术
Kimi-k2.6 流式回包乱序后,我这样接入 ​D​М‌X​Α‌РΙ
kimi-k2.6 不止于聊天,其核心价值在于“可执行交付”:统一支持代码生成、长时程任务、Agent协作、文档→技能复用及多格式输出,具备工程级组合能力。它契合企业对“单模型多工位”的刚需——在研发、内容中台等场景中,稳定闭环完成需求拆解、编码、文档整理等多步任务。真正落地需依托DMXAPI网关实现标准化API集成,解决Web路径的不确定性,让模型能力成为可度量、可审计、可持续的生产基础执行层。(239字)
|
6月前
|
人工智能 自然语言处理 数据可视化
阿里云百炼上线DeepSeek-V4:API 价格与官网一致,百万Tokens输入最低1元、输出最低2元
阿里云百炼正式推出DeepSeek-V4系列模型,包含DeepSeek-V4-pro和DeepSeek-V4-flash两款,全模型享受低至4.5折优惠,API价格与DeepSeek官网一致,百万Tokens输入最低1元、输出最低2元。该系列模型覆盖全面、成本优化显著且使用便捷,支持跨模型使用,承诺消费越高、周期越长,折扣越大。活动提供多种包月、包季套餐及特惠价格,满足不同用户需求,助力企业和开发者轻松实现AI落地,广泛应用于电商营销、广告创作、短剧漫剧、AI Coding、智能客服及AI办公等领域。
|
6月前
|
缓存 监控 网络协议
通过IP地址查询判断网络风险,有哪些具体指标和判断方法?
本文详解IP风险评估三大核心维度:基础属性(如net_type、地理位置)、行为特征(频率、IP段聚集性)与历史信誉(risk_score、threat_tags),结合离线库毫秒查询与动态阈值策略,提供可落地的分级风控方案,有效识别代理、秒拨及云主机恶意流量。
通过IP地址查询判断网络风险,有哪些具体指标和判断方法?
|
9月前
|
安全 关系型数据库 MySQL
Rocky Linux9 selinux介绍及常见问题排查
SELinux是Rocky Linux 9默认启用的安全模块,通过委任式存取控制(MAC)机制,基于程序域(Domain)与文件类型(Type)的策略规则,实现对系统资源的精细化访问控制。相比传统DAC,SELinux即使root也无法绕过权限限制,显著提升安全性。其核心组件包括主体、目标、政策和安全上下文,配合`setroubleshoot`、`auditd`等工具可高效排查“403 Forbidden”等常见问题。通过`restorecon`、`semanage`修复文件类型,或使用`setsebool -P`调整布尔值,可在不关闭SELinux的前提下解决服务权限需求
|
9月前
|
运维 监控 安全
IT运维事故复盘工具指南:从应急响应到体系化改进的全流程解析
在数字化时代,IT运维事故频发,复盘不应追责,而应推动系统性改进。通过结构化复盘,还原时间线、量化影响、深挖根因、落实可追踪的优化措施,将事故转化为能力沉淀。借助专业工具与科学方法,构建“记录-分析-改进-验证”闭环,提升组织韧性与抗风险能力,实现从被动“救火”到主动“防火”的跨越。
|
API Docker 容器
如何免费获取 ChatGPT API Key?
上篇文章介绍了NextChat项目,只需配置ChatGPT API Key即可拥有私人ChatGPT网页应用。本文继续介绍免费获取API Key的来源——GPT_API_free,一个拥有13.6K Star的Github开源项目。需用Github账号绑定领取Key,支持gpt-3.5-turbo、embedding、gpt-4,但gpt-4每天限3次调用。GPT_API_free也提供付费版API,以支持项目持续运营。
10886 0
如何免费获取 ChatGPT API Key?
|
自然语言处理 搜索推荐 BI
有哪些好用的待办事项提醒软件?主流7款大对比
随着生活和工作节奏的加快,待办事项提醒软件成为了我们的“救命神器”。本文评测了7款主流的待办事项软件:板栗看板、Todoist、Microsoft To Do、TickTick、Google Keep、Any.do 和滴答清单,从功能、适用场景和优缺点等方面进行对比,帮助你找到最适合自己的那一款。无论是团队协作、个人时间管理还是生活与工作的平衡,总有一款能满足你的需求。
10180 1