本篇文章译自英文文档 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)@propertydef 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).pathprint(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 -1codegen
lib.tar
metadata.json
parameters
runtime
src

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

cd codegen/host/src/
ls -1default_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 中文文档。

利用 UMA 使硬件加速器可直接用于 TVM相关推荐

  1. 硬件加速器为人工智能应用服务

    硬件加速器为人工智能应用服务 Hardware accelerators serve AI applications 硬件加速器(Hardware accelerators)是用于执行特定任务(如对对 ...

  2. Android利用Socket与硬件通信之智能家居APP

    Android利用Socket与硬件通信之智能家居APP - JCLovebiancheng - 博客园 在socket使用时,可以用1024-65535的端口号

  3. 基于近端策略优化的阻变存储硬件加速器自动量化

    摘 要 卷积神经网络在诸多领域已经取得超出人类的成绩.但是,随着模型存储开销和计算复杂性的不断增加,限制处理单元和内存单元之间数据交换的"内存墙"问题阻碍了其在诸如边缘计算和物联网 ...

  4. 2023-04-18:ffmpeg中的hw_decode.c的功能是通过使用显卡硬件加速器(如 NVIDIA CUDA、Intel Quick Sync Video 等)对视频进行解码,从而提高解码效

    2023-04-18:ffmpeg中的hw_decode.c的功能是通过使用显卡硬件加速器(如 NVIDIA CUDA.Intel Quick Sync Video 等)对视频进行解码,从而提高解码效 ...

  5. VT-x/AMD-V 硬件加速器已被启动,但当前处于无效状态

    今天在virtualboxvbox中安装64位centos6.5时出现以下错误: VT-x/AMD-V硬件加速器已被启动,但当前处于无效状态.您虚拟电脑内的操作系统将无法检测到64位的CPU,因此也将 ...

  6. 爬虫实战:CentOS安装JDK,部署Java程序,利用screen使其保持在前台运行

    一.CentOS 7 yum 安装与配置 JDK 参考:https://blog.csdn.net/github_38336924/article/details/82221258 1.检查是否已安装 ...

  7. python eel 多线程_利用Eel使JavaScript调用Python程序

    利用Eel使JavaScript调用Python程序 Eel简介 Eel是一个轻量的python桌面GUI开发第三方库, 它使用HTML/JS作为界面开发语言, 但是能够访问所有的python功能, ...

  8. android硬件加速器及其问题小结

    发现自己的手机上某个界面出现了花屏,某些控件背景被拉伸过多遮住了其他控件,很难看.这种现象高概率出现,分析了下发现:一旦发生这种现象,必然会打印下面这种log,google了下,这种log应该是硬件加 ...

  9. hg226g 虚拟服务器,华为HG8245H救砖番外篇之利用JTAG完成硬件初始化

    原文发在我的bloghttp://blog.csersoft.net/archives/196 前言 前几天使用UBoot恢复mtd分区时因为误操作导致flash全部被擦除.这下设备上电时连Start ...

最新文章

  1. arrays must all be same length
  2. 单例模式 -- Java
  3. Java的中BIO、NIO、AIO-1
  4. gradle-com.android.build.api.transform.TransformException:Error while generating the main dex list
  5. easyui动态显示和隐藏表头
  6. Spring(二)--FactoryBean、bean的后置处理器、数据库连接池、引用外部文件、使用注解配置bean等...
  7. 用php做一个分页显示的,php一个分页显示类
  8. 不可小觑汽车广告海报,设计感分分钟爆棚!
  9. 模板上 php dede,DEDE模板中使用php和if判断语句实例
  10. NLP学习—23.基于Transformer的机器翻译实战
  11. 亚马逊云平台采集转单机采集实现
  12. Atitit.研发管理--提升效率--软件开发方法DSM总结o99
  13. DO / DTO / BO / VO / AO
  14. mysql 改进前序遍历树_“无限层级传销”系统设计?前序遍历树的Mysql方案
  15. 春节红包战:他们到底在争什么?
  16. java.net.UnknownHostException: master (HBase报错)
  17. CBAM CBAM: Convolutional Block Attention Module
  18. 操作系统笔记——Linux系统实例分析、Windows系统实例分析
  19. 封装Python脚本:使用企业微信机器人发送消息至企业微信
  20. 空间三角形_被忽悠买下奇葩户型,三角形空间无从下手,空置一年被设计师拯救...

热门文章

  1. 【VS2017】【Windows SDK】【MSB803】找不到 Windows SDK 版本10.0.17134.0的解决办法
  2. barracuda mysql,MySQL Antelope和Barracuda的区别分析_MySQL
  3. 毕业设计-基于机器学习的二维码和条形码识别
  4. Marven:使用Maven构建Java项目
  5. [分享] 冒险岛079私服搭建
  6. 如何将谷歌地图导出为百度瓦片
  7. Android完全禁止第三方软件安装的方法
  8. IP地址和子网划分学习笔记之《IP地址详解》
  9. Android U盘 读写
  10. DSPE-PEG9-COOH分子式:C62H120NO20P的化学性质