利用 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 中文文档

相关文章
|
存储 编解码 算法
H.264编码及AAC编码基础 1
H.264编码及AAC编码基础
571 0
|
算法 安全 Java
z3-solver求解器
一个非常高级的工具,SMT求解器。应用领域非常广,解各类方程,解各类编程问题(例如解数独),解逻辑题等都不在话下。
|
12月前
|
SQL Java 数据库连接
MyBatis-Plus高级用法:最优化持久层开发
MyBatis-Plus 通过简化常见的持久层开发任务,提高了开发效率和代码的可维护性。通过合理使用条件构造器、分页插件、逻辑删除和代码生成器等高级功能,可以进一步优化持久层开发,提升系统性能和稳定性。掌握这些高级用法和最佳实践,有助于开发者构建高效、稳定和可扩展的企业级应用。
691 13
|
机器学习/深度学习 分布式计算 PyTorch
大规模数据集管理:DataLoader在分布式环境中的应用
【8月更文第29天】随着大数据时代的到来,如何高效地处理和利用大规模数据集成为了许多领域面临的关键挑战之一。本文将探讨如何在分布式环境中使用`DataLoader`来优化大规模数据集的管理与加载过程,并通过具体的代码示例展示其实现方法。
853 1
|
存储 人工智能 编译器
【AI系统】算子手工优化
本文深入探讨了手写算子调度的关键因素及高性能算子库的介绍,通过计算分析指标和 RoofLine 模型评估计算与访存瓶颈,提出了循环、指令、存储三大优化策略,并介绍了 TVM 和 Triton 两种 DSL 开发算子的方法及其在实际应用中的表现。
685 2
【AI系统】算子手工优化
|
11月前
|
人工智能 自然语言处理 算法
通义智文:文档应用赋能千行百业
通义智文是阿里巴巴推出的大规模文档处理技术体系,旨在提升生产力效率。最初作为阅读工具发布,现已发展为涵盖文档解析、理解、生成等多方面的技术平台。通义智文支持超长文档处理、多模态文本解析,并在法律、教育等领域提供专业服务。其创新算法如VGT版面分析和Layout-LM多模态模型,显著提升了文档处理精度。应用场景包括PPT创作、故事绘本生成及法律文书审查等,赋能千行百业。
|
机器学习/深度学习 人工智能 算法框架/工具
Python在人工智能方面的应用
Python在人工智能方面的应用
339 1
|
分布式计算 负载均衡 监控
p2p网络架构模型
P2P(Peer-to-Peer)模式是一种网络架构模型,在这种模型中,每个节点(peer)既是服务的提供者也是服务的消费者。这意味着每个参与的节点都可以直接与其他节点通信,并且可以相互提供资源和服务,例如文件共享、流媒体传输等。
535 6
|
设计模式 测试技术 Python
《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
【7月更文挑战第10天】Page Object Model (POM)是Selenium自动化测试中的设计模式,用于提高代码的可读性和维护性。POM将每个页面表示为一个类,封装元素定位和交互操作,使得测试脚本与页面元素分离。当页面元素改变时,只需更新对应页面类,减少了脚本的重复工作和维护复杂度,有利于团队协作。POM通过创建页面对象,管理页面元素集合,将业务逻辑与元素定位解耦合,增强了代码的复用性。示例展示了不使用POM时,脚本直接混杂了元素定位和业务逻辑,而POM则能解决这一问题。
392 6
|
人工智能 PyTorch 算法框架/工具
AI计算机视觉笔记二:基于YOLOV5的CPU版本部署openvino
本文档详细记录了YOLOv5模型在CPU环境下的部署流程及性能优化方法。首先,通过设置Python虚拟环境并安装PyTorch等依赖库,在CPU环境下成功运行YOLOv5模型的示例程序。随后,介绍了如何将PyTorch模型转换为ONNX格式,并进一步利用OpenVINO工具包进行优化,最终实现模型在CPU上的高效运行。通过OpenVINO的加速,即使是在没有GPU支持的情况下,模型的推理速度也从约20帧每秒提高到了50多帧每秒,显著提升了性能。此文档对希望在资源受限设备上部署高性能计算机视觉模型的研究人员和工程师具有较高的参考价值。
1268 0