用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。

图形优化框架可以支持许多强大的优化。例如,提供了sublinear亚线性内存优化功能。可在单个 GPU 上训练 1000 层ImageNet ResNet。

发现仅基于计算图的 IR 不足以解决支持不同硬件后端的挑战。原因是,对于每个硬件的后端,可能会以非常不同的方式映射和优化单个图形算子,如卷积或矩阵乘法。这些针对硬件的优化在内存布局、并行线程模式、缓存访问模式和硬件原始选择方面可能存在巨大差异。希望能够以通用表示方式明确表达这些优化模块,有效引导优化空间。
构建一个低level级别的表示来解决这个问题。此表示基于索引公式,为复发计算提供额外支持。

低级 IR 采用现有图像处理语言(如Halid或darkroom)的原则,定制具有表现力的深度学习 DSL。TVM 构建低level级别优化的理论来自循环转换工具,如循环和多面体分析。从 MXNet, TensorFlow, Theano.等深度学习框架中使用的数据流描述语言中汲取灵感。然后在调度阶段处理 TVM 中描述的算法,应用针对目标硬件后端量身定制的转换。

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。

可以发现,通过 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算子的再现设计灵感。
源代码Source code
• Github page页面可以在这里找到: https://github.com/dmlc/tvm
• TVM 兼容DLPack,因此可以轻松支持采用该标准的框架,如 MXNet, PyTorch, Caffe2和微小 dnn。

用TVM在硬件平台上部署深度学习工作负载的端到端 IR 堆栈相关推荐

  1. 通过MACE在Android手机上部署深度学习模型

    1. MACE的环境搭建 参考我的博客:MACE的环境搭建--conda实现 2. 构建项目 (1)下载MACE项目到本地 git clone https://github.com/XiaoMi/ma ...

  2. 在英特尔硬件上部署深度学习模型的无代码方法 OpenVINO 深度学习工作台的三部分系列文章 - CPU AI 第一部

    作者 Taylor, Mary, 翻译 李翊玮 关于该系列 了解如何转换.微调和打包推理就绪的 TensorFlow 模型,该模型针对英特尔®硬件进行了优化,仅使用 Web 浏览器.每一步都在云中使用 ...

  3. 使用aws跑深度学习_RNN示例项目从开发到部署(三):在AWS上部署深度学习模型...

    虽然我很喜欢为自己建立数据科学和编程项目,但我同样乐于与世界上的任何人在线分享它.幸好,我们以使用AWS(Amazon Web Services),这样我们可以在几分钟内免费将Python Web应用 ...

  4. 在英特尔硬件上部署深度学习模型的无代码方法 关于OpenVINO深度学习工作台的三部分系列 第二部

    作者 Taylor, Mary, 翻译 李翊玮 关于 OpenVINO™ 深度学习工作台的三部分系列文章 关于该系列 了解如何转换.微调和打包 推理就绪的 TensorFlow 模型,该模型针对英特尔 ...

  5. 在英特尔硬件上部署深度学习模型的无代码方法 OpenVINO 深度学习工作台的三部分系列 - CPU AI 第二部

    作者 Taylor, Mary, 翻译 李翊玮 关于该系列 了解如何转换.微调和打包 推理就绪的 TensorFlow 模型,该模型针对英特尔®硬件进行了优化,仅使用 Web 浏览器.每一步都在云中使 ...

  6. 在Android上部署深度学习模型之UI设计(七)

    导读 前面介绍了一些Android相关的配置文件,这篇文章我们主要来介绍一下Android UI设计相关的知识,如何来设计界UI. Android的布局 Android的UI主要是利用布局结合控件来设 ...

  7. 边缘计算 | 在移动设备上部署深度学习模型的思路与注意点

  8. 如何在浏览器上跑深度学习模型?并且一行JS代码都不用写

    翻译 | 林椿眄 编辑 | 周翔 2017 年 8 月,华盛顿大学的陈天奇团队发布了 TVM,和 NNVM 一起组成深度学习到各种硬件的完整优化工具链,支持手机.CUDA.OpenCL.Metal.J ...

  9. 实践教程 | TensorRT部署深度学习模型

    作者 | ltpyuanshuai@知乎 来源 | https://zhuanlan.zhihu.com/p/84125533 编辑 | 极市平台 本文仅作学术分享,版权归原作者所有,如有侵权请联系删 ...

最新文章

  1. pyhon滤镜详细教程
  2. Linux驱动开发环境配置(内核源码树构造)
  3. jetson nano install mxnet (亲测)
  4. OpenCV使用Kinect和其他OpenNI兼容的深度传感器
  5. 基本符号有_【国际数学】数学基本符号介绍
  6. mysql5.6+master+date_MySQL5.6的4个自带库详解
  7. 给前端开发人员上几道菜~
  8. 解决springmvc在multipart/form-data方式提交请求在过滤器Filter中获取不到参数的问题
  9. 从关系型数据库到非关系数据库
  10. 骑士人才系统4.0,5.0火车头数据抓取
  11. 08_MySQL的函数
  12. 跑三小时的monkey测试该怎么算_Android命令Monkey压力测试,详解
  13. Talk预告 | 阿里巴巴达摩院算法工程师许贤哲:DAMO-YOLO:兼顾速度与精度的高效目标检测框架
  14. Java 9 与 Java 10
  15. discuz插入幻灯片_如何将符号插入Google文档和幻灯片
  16. 购买iPhone手机时的专业术语名词解析
  17. 安科瑞预付费管理系统如何在高校学生公寓应用?及现场硬件如何选型?
  18. 基于PHP使用rabbitmq实现消息队列
  19. maple 解代数方程组得多项式_利用修正影射法求组合KdV方程新的精确解
  20. 214、最全无线网桥知识

热门文章

  1. 条形码?二维码?生成、解析都在这里!
  2. 2022-2028年中国镀金属膜行业市场研究及前瞻分析报告
  3. 【springboot】入门
  4. 一步一步写自己的SqlHelper类库
  5. CentOS 安装docker.ce报错提示containerd.io >= 1.2.2-3问题
  6. 合肥工业大学—SQL Server数据库实验一:数据库的创建和删除
  7. 特斯拉fsd全自动驾驶与华为自动驾驶
  8. 在Relay中注册新TVM算子
  9. 自动调度GPU的卷积层
  10. CodeGen融合核心关系循环扩展