用TVM在硬件平台上部署深度学习工作负载的端到端 IR 堆栈
用TVM在硬件平台上部署深度学习工作负载的端到端 IR 堆栈
深度学习已变得无处不在,不可或缺。这场革命的一部分是由可扩展的深度学习系统推动的,如滕索弗洛、MXNet、咖啡和皮托奇。大多数现有系统针对范围狭窄的服务器级
GPU 进行了优化,需要在其它平台,如移动电话、物联网设备和专用加速器(FPGA、ASIC)上部署大量精力。随着深度学习框架和硬件后端数量的增加,建议建立一个统一的中间表示 (IR) 堆栈,以缩小以生产力为中心的深度学习框架与面向性能或效率的硬件后端之间的差距。
TVM 是一个新颖的框架,可以:
- 表示并优化 CPU、GPU 和其它专业硬件的常见深度学习计算工作负载
- 自动转换计算图以最大限度地减少内存利用、优化数据布局和融合计算模式
- 提供从现有前端框架到裸机硬件的端到端编译,一直到浏览器可执行的 javascripts。
TVM可以轻松地在移动电话、嵌入式设备甚至浏览器上运行深度学习工作负载,不需要额外的支持。TVM 还为众多硬件平台(包括依赖新型计算原始的专用加速器)的深度学习工作量提供了统一的优化框架。
采用编译器方案,提供两个中间表示层,有效地将高级深度学习算法降低到多个硬件后端。
开源TVM包包含x86、ARM、OpenCL、Metal、CUDA和Javascript的原型优化。致力于专业硬件加速和 Nvidia 的 GEMM 优化Volta架构提供支持。
技术细节
TVM 堆栈的目标是提供可重复使用的工具链,以编译从深度学习框架前端到低级机器代码的高层神经网络描述,用于多个硬件后端。以 Apache MXNet 为例,以下代码片段演示,如何使用 TVM 将深度学习模型的高level描述,编译为针对目标硬件定制的优化可执行模块。
挑战在于支持多个硬件后端,同时将计算、内存和能量消耗保持在最低水平。借用AICompiler的智慧,以弥合众多深度学习框架和硬件后端之间的差距:
构建了由 NNVM 组成的两级中间层、用于任务调度和内存管理的高级中级代表 (IR) 和用于优化计算内核的具有表现力的低level IR 的 TVM。
堆栈的第一个级别是基于计算图形的表示。计算图是指示式循环图,表示计算作为节点,数据流依赖性表示边缘。此表示非常强大:
将操作属性bake到计算图中,指定转换规则,迭代优化计算图形。这是大多数现有深度学习框架所采用的常见方法,包括 TVM 堆栈中的 NNVM 图形表示、TensorFlow XLA 和英特尔的 ngraph。
发现仅基于计算图的 IR 不足以解决支持不同硬件后端的挑战。原因是,对于每个硬件的后端,可能会以非常不同的方式映射和优化单个图形算子,如卷积或矩阵乘法。这些针对硬件的优化在内存布局、并行线程模式、缓存访问模式和硬件原始选择方面可能存在巨大差异。希望能够以通用表示方式明确表达这些优化模块,有效引导优化空间。
构建一个低level级别的表示来解决这个问题。此表示基于索引公式,为复发计算提供额外支持。
低级 IR 采用现有图像处理语言(如Halid或darkroom)的原则,定制具有表现力的深度学习 DSL。TVM 构建低level级别优化的理论来自循环转换工具,如循环和多面体分析。从 MXNet, TensorFlow, Theano.等深度学习框架中使用的数据流描述语言中汲取灵感。然后在调度阶段处理
TVM 中描述的算法,应用针对目标硬件后端量身定制的转换。
TVM includes standard transformation
primitives commonly found in CPU optimization frameworks. More importantly, TVM
incorporates novel optimization primitives targeted at GPUs, by exploiting
thread cooperation patterns, data layout transformations and powerful new
compute primitives. Using TVM in combination with NNVM provides an rich
opportunity to optimize deep learning workloads across the software stack,
enabling joint compute graph-level and operator-level optimizations.
TVM 包括 CPU 优化框架中常见的标准原型转换。更重要的是,TVM 通过利用线程调度模式、数据布局转换和强大的新原型计算,整合了针对 GPU 的新型优化。使用 TVM 与 NNVM 相结合,为优化整个软件堆栈中的深度学习工作负载提供了丰富的机会,实现了联合计算图形级别和算子级别的优化。
多语言和平台支持
TVM 的众多优势之一,在于对多个平台和语言的丰富支持。框架的两个组件:包含完整优化库以生成优化机器代码的编译器堆栈,以及轻量级lightweight的runtime,以及在不同平台上部署编译模块所需的便携性。
TVM 当前支持嵌入式编译器堆栈的python和C++接口。设计框架时,考虑到了最大的再利用,以便编译器堆栈改进,可以在 Python 和C++组件之间互换应用。
提供轻量级的runtime,可以在包括 Android、iOS、raspberry pi和 Web 浏览器在内的平台上,以javascript,
java, python, C++等语言直接运行 TVM 编译代码。
远程部署和执行
TVM 支持使用 TVM RPC 对嵌入式设备进行交叉编译和测试,这是一个轻量级界面,可在远程嵌入式设备上部署和执行 TVM 交叉编译模块。这为 TVM 用户提供了熟悉的高级 Python 界面,以便在各种低级嵌入式设备上远程编译、优化和测试深度学习算法。
性能
TVM能够灵活地探索各种深度学习内核的丰富优化空间,用于多个硬件平台。例如,TVM为最关心的内核和平台定制数据布局和融合模式要求。基线库是针对更通用的问题创建的,而 TVM 的优化内核则针对通过自动调整过程评估的工作负载进行了大量调整。TVM 充当快速生成获取此类专用内核的桥梁。
Raspberry
Pi树莓派
在结果的第一部分,将TVM CPU调度与树莓派3B执行网格工作负载上的nnpack进行了比较。使用TVM实现直接卷积,而nnpack用于执行3x3内核的winograd conv。
We can find that with
TVM’s autotuned kernels, we can obtain performance similar to the
hand-optimized kernels in nnpack for the raspberry pi experiments. 可以发现,通过 TVM 的自动调谐内核,可以获得类似于 nnpack 中hand-optimized kernels手动优化内核的性能,用于aspberry pi实验。
GPU 结果
创建了一个端到端的编译管道,可以将 MxNet 模型编译到 TVM 执行图形。通过自动将算子融合在一起,让 TVM 生成融合内核,在图形节点内和图形节点之间应用优化。对mobilenet ImageNet的工作量进行了基准测试,并讨论了以下结果:
TVM在速度方面可以优于baseline基线方法。更有趣的是,内核融合带来了额外的加速。值得一提的是,TVM 能够自行生成所有优化的 GPU 内核,无需依赖 CuDNN 等外部库。
开源努力
TVM最初是华盛顿大学保罗·艾伦学校计算机科学与工程系的研究项目。TVM 堆栈旨在支持DLPack,这是多个主要深度学习框架对张力数据结构的共识。收到了来自UW, AWS, Qiho
360, Facebook, HKUST, TuSimple, UCDavis, SJTU以及DMLC开源社区和DLPack倡议成员的早期贡献。今后,该项目将遵循Apache
open-source model开源模式,创建社区维护项目。
- Halide:TVM使用HalideIR作为数据结构,用于arithematic简单化和低level lowering。HalideIR来自Halide。还从Halide那里学习,在TVM中实施lowing管道。
- Loopy:使用整数集分析及其循环转换原始。
- Theano:symbolic scan算子的再现设计灵感。
- Github page页面可以在这里找到: https://github.com/dmlc/tvm
- TVM 兼容DLPack,因此可以轻松支持采用该标准的框架,如 MXNet, PyTorch, Caffe2和微小 dnn。
源代码Source code
用TVM在硬件平台上部署深度学习工作负载的端到端 IR 堆栈的更多相关文章
- 利用Tengine在树莓派上跑深度学习网络
树莓派是国内比较流行的一款卡片式计算机,但是受限于其硬件配置,用树莓派玩深度学习似乎有些艰难.最近OPENAI为嵌入式设备推出了一款AI框架Tengine,其对于配置的要求相比传统框架降低了很多,我尝 ...
- flask部署深度学习模型
flask部署深度学习模型 作为著名Python web框架之一的Flask,具有简单轻量.灵活.扩展丰富且上手难度低的特点,因此成为了机器学习和深度学习模型上线跑定时任务,提供API的首选框架. 众 ...
- CentOS7服务器上部署深度/机器学习环境推荐首选anaconda3
CentOS7服务器上部署深度/机器学习环境推荐首选anaconda3,亲测~~ 因为可以创建不同的环境版本或虚拟环境 CentOS7服务器安装anaconda3后,CentOS7服务器开启后自动将a ...
- 从零开始在ubuntu上配置深度学习开发环境
从零开始在ubuntu上配置深度学习开发环境 昨天一不小心把原来配置好的台式机的开发环境破坏了,调了半天没有调回来,索性就重装一次ubuntu系统.这篇文章主要记录一个简单的.‘傻瓜式’教程. 一.U ...
- github上热门深度学习项目
github上热门深度学习项目 项目名 Stars 描述 TensorFlow 29622 使用数据流图进行可扩展机器学习的计算. Caffe 11799 Caffe:深度学习的快速开放框架. [Ne ...
- 点云上的深度学习及其在三维场景理解中的应用(PPT内容整理PointNet)
这篇博客主要是整理了PointNet提出者祁芮中台介绍PointNet.PointNet++.Frustum PointNets的PPT内容,内容包括如何将点云进行深度学习,如何设计新型的网络架构 ...
- ubuntu16.04上安装深度学习基本框架caffe2 pytorch tensorflow opencv
anaconda3.5.2.0----python3.6: conda install tensorflow-gpu -y --prefix /media/wkr/diskHgst/ubun ...
- TVM:一个端到端的用于开发深度学习负载以适应多种硬件平台的IR栈
TVM:一个端到端的用于开发深度学习负载以适应多种硬件平台的IR栈 本文对TVM的论文进行了翻译整理 深度学习如今无处不在且必不可少.这次创新部分得益于可扩展的深度学习系统,比如 TensorFlo ...
- 如何运行具有奇点的NGC深度学习容器
如何运行具有奇点的NGC深度学习容器 How to Run NGC Deep Learning Containers with Singularity 高性能计算机和人工智能的融合使新的科学突破成为可 ...
随机推荐
- Sublime Text 3.1 3170 / 3176 注册码(附降级与禁止更新方法)
3.1 3176 可用注册码 127.0.0.1 www.sublimetext.com 127.0.0.1 license.sublimehq.com ----- BEGIN LICENSE --- ...
- Android so库文件的区节section修复代码分析
本文博客地址:http://blog.csdn.net/qq1084283172/article/details/78818917 一.Android so库文件的节表secion修复方案整理 1.简 ...
- POJ2296二分2sat
题意: 给n个点,每个点必须在一个正方形上,可以在正方向上面边的中点或者是下面边的中点,正方形是和x,y轴平行的,而且所有的点的正方形的边长一样,并且正方形不能相互重叠(边相邻可以),问满 ...
- FCKeditor编辑器漏洞
目录 FCKeditor asp网页 aspx网页 php网页 jsp网页 FCKeditor FCKeditor是一个功能强大支持所见即所得功能的文本编辑器,可以为用户提供微软office软件一样的 ...
- 记一次CTF的签到题
开篇 打开题目网站 首先看到的是一个人博客,功能点非常少,功能较多的页面就是留言板了 一开始没啥思路,就想着抓包能不能找到SQL注入无果,在这个地方卡了很久 柳暗花明 在乱点的时候,无意中发现题目中的 ...
- web技术培训(一)-云服务器、域名相关
云服务器 什么是云服务器(这部分可以跳过) 云服务器(Elastic Compute Service, ECS)是一种简单高效.安全可靠.处理能力可弹性伸缩的计算服务.其管理方式比物理服务器更简单高效 ...
- 解决docker镜像无法删除的问题
发现问题 来自守护进程的错误响应:冲突:无法删除050f26b6caca(必须强制) - 映像在多个存储库中被引用 Error response from daemon: conflict: unab ...
- angularjs中的常遇问题整理
1.页面中默认图片的显示 {{img || "/upload/img.png"}} 2.接口中的数据没有及时读取到,$apply $.post( url, {}, function ...
- 截取字符串长度,超出部分用省略号代替 PHP
function subText($text, $length){ if (mb_strlen($text, 'utf8') > $length) { return mb_substr($tex ...
- Codeforces Round #687 (Div. 2, based on Technocup 2021 Elimination Round 2)
A. Prison Break 题意:就是在一个n*m的矩阵中,以(1,1)为起点(n,m)为终点,每个点以每个单位1s的速度移动,问总共至少需要多少秒,所有的矩阵点就能够全部移动到(r,c)中 思路 ...