用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 高性能计算机和人工智能的融合使新的科学突破成为可 ...
随机推荐
- hdu2594 简单KMP
题意: 给你两个串,问你s1的前缀和s2的后缀最长公共部分是多少. 思路: 根据KMP的匹配形式,我们求出s1的next,然后用s1去匹配s2,输出当匹配到s2的最后一个的时候的匹 ...
- Method Overlonding
The method overloading is using one single method name with different parameters to created differen ...
- thinkphp中常用到的sql操作
1.清空某表数据: $sql = 'truncate table table_name'; Db::execute($sql );
- 百度地图api逆地址解析 PHP
一.说明:逆地址查询就是根据经纬度信息获取地址位置信息 二.参数:$lat:纬度值 ,$lng:经度值 ,$ak = 自己的AK:(百度地图开放平台对应ak链接:http://lbsyun.baidu ...
- Django(2)python虚拟环境virtualenvwrapper
python虚拟环境 虚拟环境(virtual environment),它是一个虚拟化,从电脑独立开辟出来的环境.通俗的来讲,虚拟环境就是借助虚拟机来把一部分内容独立出来,我们把这部分独立出来的东西 ...
- C#中的类、方法和属性
这节讲C#中的类,方法,属性.这是编码中我们最直接打交道的三个结构. 类: 类(class)是面向对象中最基本的单元,它是一种抽象,对现实世界中事物的抽象,在C#中使用class关键字声明一 ...
- 内网渗透-横向移动($IPC&at&schtasks)
内网渗透-横向移动 #建立ipc连接并将后门添加至计划任务 前置条件:获取到某域主机权限->得到明文或者hash,通过信息收集到的用户列表当做用户名字典->用得到的密码明文当做密码字典 本 ...
- webpack 快速入门 系列 —— 实战一
实战一 准备本篇的环境 虽然可以仅展示核心代码,但笔者认为在一个完整的环境中边看边做,举一反三,效果更佳. 这里的环境其实就是初步认识 webpack一文完整的示例,包含 webpack.devSer ...
- 痞子衡嵌入式:在i.MXRT启动头FDCB里使能串行NOR Flash的Continuous read模式
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是在FDCB里使能串行NOR Flash的Continuous read模式. 前面关于串行Flash传输时序的文章 <Fast R ...
- 【vue2】(一)基础使用
[vue2](一)基础使用 MVVM MVVM: View - Model - ViewModel View: Dom层,视图层 Model: Plain JavaScript Objects,数据层 ...