TVM:一个端到端的用于开发深度学习负载以适应多种硬件平台的IR栈 

本文对TVM的论文进行了翻译整理

深度学习如今无处不在且必不可少。这次创新部分得益于可扩展的深度学习系统,比如 TensorFlow、MXNet、Caffe 和 PyTorch。大多数现有系统针对窄范围的服务器级 GPU 进行了优化,并且需要在其他平台(如手机、IoT 设备和专用加速器(FPGA、 ASIC))上部署大量工作。随着深度学习框架和硬件后端数量不断增加,我们提出了一个统一的中间表征(IR)堆栈,可以弥补以生产力为中心的深度学习框架与性能或效率导向的硬件后端之间的差距。

我们很高兴宣布 TVM 的发行将解决这一问题。TVM 是一个全新的框架,它可以:

l 优化 CPU、GPU 和其他专业化硬件的常规深度学习的计算量

l 自动转换计算图以最小化内存利用率,优化数据布局,融合计算模式

l 提供从现有的前端框架到裸机硬件的端到端编译,一直到浏览器可执行的 Javascript

有了 TVM 的帮助,只需少量额外工作我们即可轻易地在手机端、嵌入式设备甚至浏览器上运行深度学习的工作负载。TVM 还为多硬件平台上的深度学习工作负载提供了统一的优化

框架,其中包括依赖全新计算原语的专用加速器。

通过采用编译器社区的共同理念,并提供两个中间表征层,我们有效地将高级深度学习算法降低到多硬件后端。在今天的版本中,我们开源了包含 x86、ARM、OpenCL、Metal、CUDA 和 Javascript 优化原语的 TVM 工具包。目前,我们正积极地为专用硬件加速和英伟达的 GEMM 优化的 Volta 架构提供支持。

技术细节

TVM 堆栈的目标在于提供一个可重复使用的工具链来将高级神经网络描述从深度学习框架前端向下编译为多硬件后端的低级机器代码。拿 Apache MXNet 作为前端的例子,以下代码段演示了如何使用 TVM 将深层学习模型的高级描述编译为针对目标硬件定制的优化可执行模块。

挑战在于支持多个硬件后端,同时将计算、内存和能源足迹(energy footprint)保持在最低水平。我们借鉴了编译器社区的共同理念,以弥合大量深度学习框架和硬件后端之间的差距:我们构建了一个由 NNVM 组成的两级中间层,一个可用于任务调度、内存管理以及 TVM(用于优化计算内核的富有表现力的低级 IR)的高级中间表征(IR)。

堆栈的第一级是基于计算图的表征。计算图是一个有向无环图,其表征作为节点的计算和作为边缘的数据流依赖性。这一表征非常强大:它允许我们将操作属性融入到计算图中,并指定转换规则以迭代优化计算图。这是一个被大多数现有深度学习框架的采用的惯常方法,包括 TVM 堆栈中的 NNVM 图表征、TensorFlow XLA 和英特尔的 ngraph。

很多强大的优化可由图优化框架支持。例如,我们提供了一个子线性内存优化功能,允许用户在单块 GPU 上训练 1000 层的 ImageNet ResNet。

然而,我们发现只基于 IR 的计算图并不足以应对支持不同硬件后端的挑战。原因是像卷积或矩阵乘法一样的图运算符可以非常不同的方式映射和优化每个硬件后端。这些特定硬件的优化在内存布局、并行线程模式、缓存访问模式和硬件原语选择方面的变数可能很大。我们希望能够以通用表征的方式明确地表达这些优化旋钮(optimization knob),以有效地导航优化空间。

我们构建了一个低级表征以解决这一问题。该表征基于索引公式,并额外支持递推计算。

低级 IR 采用现有的图像处理语言(比如 Halide 或 darkroom)的原理以制定一个富有表现力的深度学习 DSL。TVM 构建了由循环转换工具比如 loopy、多面体分析启发的图优化。我们也从深度学习框架比如 MXNet、TensorFlow、Theano 使用的数据流描述语言汲取灵感,然后在调度阶段对 TVM 中描述的算法进行处理,以应用针对目标硬件后端定制的转换。

TVM 包括通常出现在 CPU 优化框架中的标准转换原语。更重要的是,TVM 通过利用线程协作模式、数据布局转换和强大的新计算原语,集成了针对 GPU 的全新优化原语。TVM 与 NNVM 的结合为优化软件堆栈中深度学习工作负载提供了一个很好的机会,从而实现了图级别与运算符级别优化的联合计算。

多语言和平台支持

TVM 的众多优势之一在于它可以支持多种语言和平台。TVM 框架中有两个组件:编译器栈,其中包含完整的优化库以产生优化的机器代码;以及轻量级运行环境,提供在不同平台上部署编译模块所需

的可移植性。

TVM 目前支持嵌入式编译器堆栈的 Python 和 C++ 接口。我们在设计中最大限度地重用框架,以便编译器堆栈的改进可以在 Python 和 C++ 组件之间互换使用。我们还提供了一个轻量级运行环境,可以在包括 Android、iOS、树莓派和 Web 浏览器在内的平台上直接运行诸如 Javascript、Java、Python 和 C++ 等语言的 TVM 编译代码。

远程部署和执行

TVM 支持使用 TVM PRC 进行交叉编译,测试嵌入式设备,这是一种轻量级界面,用于在远程嵌入式设备上部署和执行 TVM 交叉编译模块。我们 TVM 用户提供了易用的高级 Python 界面,用于在各种低级嵌入式设备上进行远程编译、优化,并测试深度学习算法。

性能

TVM 目前仍然处在早期发展阶段,我们会在未来看到更多改进,但目前它已经展现出了强大的实力。

TVM 为我们提供了灵活性,让我们可以探索不同硬件平台上,不同深度学习内核中丰富的优化空间。例如,TVM 允许我们裁剪数据布局,为内核与平台融合模式需求。注意,构建基线库可用于更通用的问题,而 TVM 的优化内核通过自动调整过程对人们评估的工作负载进行了大量调整。TVM 可以作为快速生成专属内核的绝佳工具。

本节列出的结果仍有提升空间

树莓Pi

在结果的第一部分,我们比较了 TVM CPU 计划与 nnpack 在树莓派 3B 上执行 ResNet 任务的表现。由于时间有限,我们使用 TVM 实现直接卷积,而 nnpack 对 3×3 内核执行 winograd 转换。

我们可以看到,使用 TVM 自动调整内核,我们可以获得类似于 nnpack 中的手动优化内核的性能(实验在树莓派上进行)。

GPU结果

PS. 该测试结果由 Leyuan Wang(AWS/UCDavis)、Yuwei Hu(图森未来)与 Weitang Liu(AWS/UCDavis)提供。

为了进行概念证明,我们构建了一种端到端编译管道,可以将 MXNet 模型编译成 TVM 执行图。我们通过自动融合运算符并使 TVM 生成融合的内核,在图形节点之间和之中应用优化。我们对 MobileNet 在 ImageNet 上的运行表现进行基准测试,结果如下:

我们可以看到,TVM 在速度上快过基准方法。更有意思的是,内核融合可以带来更快的速度提升。值得一提的是,TVM 可以自行生成所有优化 GPU 内核,而不依赖于外部库,如 CuDNN。

我们正在开展新的实验,期待获得更好的结果。

.

开源

TVM 始于华盛顿大学 Paul G. Allen 计算机科学与工程学院的研究项目。它被设计成持 DLPack——一个被多种深度学习框架共享的张量数据结构。在开发过程中,我们得到了来自华盛顿大学、AWS、奇虎 360、Facebook、香港科技大学、图森未来、UCDavis、上海交大以及 DMLC 开源社区和 DLPack 计划成员们的支持。展望未来,该项目将继续遵循 Apache 开源模式,力图构建一个由社区维护的项目,欢迎大家的参与。

源码

  • Github page can be found here: https://github.com/dmlc/tvm
  • TVM is DLPack compatible, which makes it easy to support frameworks that adopts the standard, such as MXNet, PyTorch, Caffe2 and tiny-dnn.

TVM:一个端到端的用于开发深度学习负载以适应多种硬件平台的IR栈的更多相关文章

  1. [AI开发]深度学习如何选择GPU?

    机器推理在深度学习的影响下,准确性越来越高.速度越来越快.深度学习对人工智能行业发展的贡献巨大,这得益于现阶段硬件计算能力的提升.互联网海量训练数据的出现.本篇文章主要介绍深度学习过程中如何选择合适的 ...

  2. Kelp.Net是一个用c#编写的深度学习库

    Kelp.Net是一个用c#编写的深度学习库 基于C#的机器学习--c# .NET中直观的深度学习   在本章中,将会学到: l  如何使用Kelp.Net来执行自己的测试 l  如何编写测试 l  ...

  3. 【神经网络与深度学习】【VS开发】【CUDA开发】VS2013 配置CUDNN V4 DEMO

    VS2013 配置CUDNN V4 DEMO 众所周知,当前主流深度学习的实现中调用的底层API都是cudnn,自己做项目需要开发深度学习模块时,也需要调用cudnn库,因此熟悉cudnn库是很有必要 ...

  4. 适合新手:从零开发一个IM服务端(基于Netty,有完整源码)

    本文由“yuanrw”分享,博客:juejin.im/user/5cefab8451882510eb758606,收录时内容有改动和修订. 0.引言 站长提示:本文适合IM新手阅读,但最好有一定的网络 ...

  5. Vue 全家桶 + Electron 开发的一个跨三端的应用

    代码地址如下:http://www.demodashi.com/demo/11738.html GitHub Repo:vue-objccn Follow: halfrost · GitHub 利用 ...

  6. 端到端TVM编译器(下)

    端到端TVM编译器(下) 4.3 Tensorization DL工作负载具有很高的运算强度,通常可以分解为张量运算符,如矩阵乘法或一维卷积.这些自然分解导致了最近的添加张量计算原语.这些新的原语带来 ...

  7. 移动端拖拽(模块化开发,触摸事件,webpack)

    通过jquery可以很容易实现CP端的拖拽.但是在移动端却不好用了.于是我自己写了一个在移动端的拖拽demo,主要用到的事件是触摸事件(touchstart,touchmove和touchend). ...

  8. Salesforce开源TransmogrifAI:用于结构化数据的端到端AutoML库

    AutoML 即通过自动化的机器学习实现人工智能模型的快速构建,它可以简化机器学习流程,方便更多人利用人工智能技术.近日,软件行业巨头 Salesforce 开源了其 AutoML 库 Transmo ...

  9. dr-helper项目设计介绍(一个包括移动端和Web端的点餐管理系统)

    一.源代码路径 https://github.com/weiganyi/dr-helper 二.界面 通过浏览器訪问Web服务,能够看到界面例如以下: ADT-Bundle编译project生成dr- ...

随机推荐

  1. 使用SlidingDrawer(滑动式抽屉)实现抽屉效果

    SlidingDrawer隐藏屏外的内容,并允许用户通过handle以显示隐藏内容.它可以垂直或水平滑动,它有俩个View组成,其一是可以拖动的handle,其二是隐藏内容的View.它里面的控件必须 ...

  2. 发布nuget包

    首先在nuget(www.nuget.org)注册账号,这里可以使用微软账号直接登录 一般有两种方式 1:在工程上右键打包然后直接在网站上上传就可以 2:通过获取key,然后使用控制台提交 登录后在右 ...

  3. Introduction to pointers in C

    The basic purpose of developing a C programming tutorial for this website – CircuitsToday – is to ma ...

  4. JS进阶学习<一>

    一:区分大小写: 1. JS是区分大小写的,如:classname和ClassName是不一样的.同时注意方法.属性.变量等的大小写吆. 2. JS中的字符.符号等一定要在英文状态下输入吆. 二:变量 ...

  5. ubuntu go 开发环境搭建

    访问:https://golang.org/dl/ 下载 go1.12.4.linux-amd64.tar.gz wget https://dl.google.com/go/go1.12.4.linu ...

  6. 微信小程序wxml页面toFixed保留两位小数,wxs脚本语言

    在wxml页面执行toFixed函数的时候发现失效,在微信小程序的js页面是生效的,但是我不希望在data中保留这些额外的数据,于是找到了下面这种解决方案wxs脚本语言. <wxs module ...

  7. 配置文件 "G:\虚拟机列表\Linux001.vmx" 由产品 VMware 创建, 其版本 VMware Workstation 不兼容并且不能使用.

    解析: 报这种错误一般是虚拟机文件里声明的VMware版本和真实的VMware版本不一致导致.我们可以手动更改真实VMware版本,或者更改虚拟机文件里声明的VMware版本.以下我们通过更该虚拟机文 ...

  8. git(程序员的时光机)

    git 是什么 最强大的分布式版本控制系统,没有之一 版本控制: 完成一项任务,最终的成果可能是经过中间修修修改n次得到的,在这n个版本之间的切换就叫版本控制. 集中式的版本控制svn,cvs缺点: ...

  9. SpringSecurity 配置

    SpringSecurity+JWT https://www.jianshu.com/p/5b9f1f4de88d https://blog.csdn.net/qq_35494808/article/ ...

  10. DNS 域名系统与邮件服务器

    目录 DNS 域名系统 定义 域名分类 解析流程 DNS分类 资源记录 格式 资源记录类型 用bind搭建一台DNS服务器 安装bind 创建自己的zone文件 在主配置文件中,增加自己的zone 检 ...