全文翻译(二): TVM: An Automated End-to-End Optimizing Compiler for Deep Learning
3.优化计算图
计算图是在DL框架中表示程序的常用方法。图3显示了两层卷积神经网络的计算图表示示例。这种高级表示与低级编译器中间表示(IR,如LLVM)间的主要区别,中间数据项是大型多维张量。计算图提供了算子的全局视图,但避免指定每个算子必须如何实现。与LLVM IRs一样,计算图可以转换为功能等效图优化。利用常见DL工作负载中的形状特异性,优化一组固定的输入shape。

Figure 3: Example computational graph of a two-layer convolutional neural network. Each node in the graph represents an operation that consumes one or more tensors and produces one or more tensors. Tensor operations can be parameterized by attributes to confifigure their behavior (e.g., padding or strides).

TVM利用计算图表示应用高级优化:节点表示对张量或程序输入的算子,边表示算子间的数据依赖关系。实现多级图形优化,包括:算子fusion,将多个小算子融合在一起;常量折叠,预先计算可静态确定的图形部分,节省执行成本;静态内存调度过程,预先分配内存,保存每个中间张量;数据布局转换,将内部数据布局转换为后端友好的形式。
现在讨论算子融合和数据布局转换。
算子融合
算子融合将多个算子组合到单个内核中,无需将中间结果保存在内存中。这种优化可以大大减少执行时间,特别是在GPU和专用加速器中。具体来说,认识到四类图算子:
(1)内射(一对一映射,如add)
(2)归约(如sum)
(3)复杂输出可融合(将元素映射融合到输出,如conv2d)
(4)不透明(不能融合,如sort)。
提供了融合这些算子的通用规则,如下所示。
多个内射算子可以融合成另一个内射算子。归约算子可以与输入内射算子融合(例如,融合scale和sum)。如conv2d类的算子是复杂的可外fusion的,可以将元素算子fusion到输出中。可以应用这些规则,将计算图转换为融合版本。

Figure 4: Performance comparison between fused and non-fused operations. TVM generates both operations. Tested on NVIDIA Titan X.
图4演示了对不同工作负载的影响的优化。通过减少内存访问,融合算子可以产生高达1.2倍到2倍的加速比。
数据布局转换。在计算图中存储给定张量有多种方法。最常见的数据布局选择是列主视图和行主视图。实际上,可能喜欢使用复杂的数据布局。例如,DL accelerator可能利用4×4矩阵运算,需要将数据平铺到4×4块中,优化局部访问。

Figure 5: Example schedule transformations that optimize a matrix multiplication on a specialized accelerator.
数据布局优化,可以使用更好的内部数据布局,转换计算图形,在目标硬件上执行图形。先指定每个算子的首选数据布局,给定内存层次结构指定的约束。然后,如果生产者和消费者的首选数据布局不匹配,将在两者间执行适当的布局转换。
虽然高级图优化可以极大地提高DL工作负载的效率,但效率仅与operator library提供的一样高。目前,支持算子融合的少数DL框架,要求算子库提供融合模式的实现。随着更多的网络算子定期推出,可能的融合内核数量可能会大幅增加。当针对越来越多的硬件后端时,这种方法不再具有可持续性,因为所需的融合模式实现数量,随着必须支持的数据布局,数据类型和加速器内部结构的数量,组合增长。接下来提出一种代码生成方法,可以为给定模型的算子生成各种可能的实现。
4.生成张量运算
TVM通过在每个硬件后端,生成许多有效的实现,选择优化的实现,为每个算子生成高效的代码。
该过程基于Halide,将描述与计算规则(或调度优化)分离,将支持新的优化(嵌套并行,张量化和延迟隐藏)和大量硬件后端。重点介绍TVM的特定功能。

4.1张量表达式和表空间

Figure 6: TVM schedule lowering and code generation process. The table lists existing Halide and novel TVM scheduling primitives being used to optimize schedules for CPUs, GPUs and accelerator back-ends. Tensorization is essential for accelerators, but it can also be used for CPUs and GPUs. Special memory-scope enables memory reuse in GPUs and explicit management of onchip memory in accelerators. Latency hiding is specifific to TPU-like accelerators.

引入了一种支持自动代码生成的张量表达式语言。与高级计算图表示不同,张量算子的实现是不透明的,每个算子都用索引公式表达式语言描述。以下代码显示了用于计算转置矩阵乘法的张量表达式示例:

如何计算每个元素的表达式,每个计算算子都指定输出张量的形状和描述。张量表达式语言支持常见的算术和数学运算,涵盖常见的DL算子模式。该语言没有指定循环结构和许多其它执行细节,为各种后端添加硬件感知优化。采用Halide的解耦计算/调度原理,从张量表达式到低级代码的特定映射,使用调度表示。
许多可能的调度,都可以执行此功能。
通过增量应用基本转换(调度原语)构建调度,持程序的逻辑等价性。图5显示了在专用加速器上,调度矩阵乘法的示例。在内部,TVM使用一个数据结构,跟踪循环结构和其它信息,因为应用了调度转换。然后,这些信息可以为给定的最终调度生成低级代码。

Figure 7: Performance comparison between TVM with and without cooperative shared memory fetching on matrix multiplication workloads. Tested on an NVIDIA Titan X.
张量表达式从Halide,Darkroom,TACO中获取线索。主要增强功能,包括支持下面讨论的新调度优化。为了在许多后端上实现高性能,必须支持足够多的调度原语,覆盖不同硬件后端上的各种优化。图6总结了TVM支持的算子代码生成过程和调度原语。重用有用的原语和来自Halide的低级循环程序AST,引入新的原语,优化GPU和加速器性能。新原语是实现最佳GPU性能所必需的,也是加速器所必需的。CPU、GPU、TPU类加速器是深度学习的三种重要硬件类型。
本节介绍了CPU、GPU和TPU类加速器的新优化原语,第5节说明了如何自动导出有效的调度。
4.2嵌套并行与协作
并行性是提高DL工作负载中,计算密集型内核效率的关键。现代GPU提供了巨大的并行性,要求将所有并行模式bake到调度转换中。大多数现有的解决方案,都采用了一种称为嵌套并行(一种fork-join形式)的模型。该模型需要一个并行schedule原语,并行化数据并行任务;每个任务可以进一步递归细分为子任务,利用目标体系结构的多级线程层次结构(例如,GPU中的线程组)。称此模型为无共享嵌套并行,因为一个工作线程,无法在同一并行计算阶段,查看同级的数据。
无共享方法的另一种替代方法是协同获取数据。具体来说,线程组可以协作获取所有需要的数据,放入共享内存空间。此优化可以利用GPU内存层次结构,通过共享内存区域跨线程重用数据。TVM支持这种众所周知的GPU优化,使用调度原语实现最佳性能。下面的GPU代码示例优化了矩阵乘法。

图7展示了这种优化的影响。将内存作用域的概念引入调度空间,以便将计算阶段(代码中的AS和BS)标记为共享。没有显式存储范围,自动范围推断,将计算阶段标记为线程本地。共享任务必须计算组中,所有工作线程的依赖关系。
必须正确插入内存同步屏障,确保共享加载的数据对用户可见。最后,除了对GPU有用之外,内存作用域标记特殊的内存缓冲区,在针对专用DL加速器时,创建特殊的降低规则。
4.3 张量化
DL工作负载具有很高的运算强度,通常可以分解为张量算子,如矩阵乘法或一维卷积。这些自然分解导致了最近的添加张量计算原语。这些新原语为基于调度的编译,带来了机遇和挑战;虽然这些使用可以提高性能,但编译框架必须无缝集成。称为张量化:类似于SIMD体系结构的矢量化,但有显著差异。指令输入是多维的,具有固定或可变的长度,每个都有不同的数据布局。无法支持一组固定的原语,因为新的加速器用自定义的张量指令变体出现。
需要一个可扩展的解决方案。
通过使用张量内在声明机制,将目标硬件结构从调度中分离出来,使张量化具有可扩展性。使用相同的张量表达式语言,声明每个新硬件内在的行为,以及与之相关的降低规则。下面的代码显示了如何定义8×8张量硬件的内在特性。

引入了一个tensorize调度原则,用相应的内部函数替换计算单元。编译器使用硬件声明匹配计算模式,降低到相应的硬件本身。
Tensorization将调度与特定的硬件原语分离,易于扩展TVM支持新的硬件体系结构。Tensorization调度生成的代码,符合高性能计算的实践:将复杂算子分解为一系列微内核调用。可以使用tensorize原语,进行手工制作的微内核的优点,这在某些平台形式中可能是有益的。例如,为移动CPU实现超低精度算子,这些CPU通过利用位串行数据算子1或2位宽的数据类型矩阵向量乘法微内核。该微内核将结果累加为越来越大的数据类型,以最小化内存占用。将微内核作为TVM固有的张量表示,可产生高达1.5倍于非张量化的加速比。

4.4显式内存延迟隐藏
延迟隐藏将内存算子与计算重叠的过程,最大限度地利用内存和计算资源。根据目标硬件后端的不同,需要不同的策略。

Figure 8: TVM virtual thread lowering transforms a virtual thread-parallel program to a single instruction stream; the stream contains explicit low-level synchronizations that the hardware can interpret to recover the pipeline parallelism required to hide memory access latency.
在CPU上,内存延迟隐藏通过同步多线程或硬件预取隐式实现的。GPU依赖于许多线程的快速上下文切换。相反,像TPU这样的专用DL加速器,通常支持使用解耦访问执行(DAE)的精简控制架构和卸载细粒度的问题与软件同步。

Figure 9: Decoupled Access-Execute in hardware hides most memory access latency by allowing memory and computation to overlap. Execution correctness is enforced by low-level synchronization in the form of dependence token enqueueing/dequeuing actions, which the compiler stack must insert in the instruction stream.
图9显示了一个减少运行时延迟的DAE硬件管道。与单片硬件设计相比,该管道可以将大部分内存访问隐藏在头上,几乎充分利用计算资源。要为了获得更高的利用率,必须使用细粒度同步算子,扩充指令流。如果没有这些算子,依赖关系将无法强制执行,导致错误的执行。因此,DAE硬件管道,需要细粒度依赖排队,在管道阶段间均衡操作,保证正确执行,如图9的指令流所示。
编程需要显式低级同步的DAE加速器很困难。为了减轻编程负担,引入了虚拟线程调度原语,让程序员指定一个高级数据并行程序,就像指定一个支持多线程的硬件后端一样。TVM会自动降低program,转换为具有低级显式同步的单个指令流,如图8所示。该算法从高级多线程程序调度开始,插入必要的低级同步算子,确保在每个线程内正确执行。接下来,将所有虚拟线程的算子交错到single的指令流。

Figure 10: Rooflfline of an FPGA-based DL accelerator running ResNet inference. With latency hiding enabled by TVM, performance of the benchmarks is brought closer to the rooflfline, demonstrating higher compute and memory bandwidth effificiency.

参考文献:
TVM: An Automated End-to-End Optimizing Compiler for Deep Learning

全文翻译(二): TVM: An Automated End-to-End Optimizing Compiler for Deep Learning相关推荐

  1. 全文翻译(全文合集):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning

    全文翻译(全文合集):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning 摘要 人们越来越需要将机器学习应用到各种各样 ...

  2. 全文翻译(一):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning

    全文翻译(一):TVM: An Automated End-to-End Optimizing Compiler for Deep Learning 摘要 人们越来越需要将机器学习应用到各种各样的硬件 ...

  3. 【TVM全文翻译】TVM: An Automated End-to-End Optimizing Compiler for Deep Learning

    目录 Abstract 1. Introduction 2. Overview 3. Optimizing Computational Graphs 4. Generating Tensor Oper ...

  4. 【论文笔记】(二)CheXNet: Radiologist-Level Pneumonia Detection on Chest X-Rays with Deep Learning

    论文名称: CheXNet: Radiologist-Level Pneumonia Detection on Chest X-Rays with Deep Learning 发表期刊: arXiv, ...

  5. Deep Learning 教程翻译

    Deep Learning 教程翻译 非常激动地宣告,Stanford 教授 Andrew Ng 的 Deep Learning 教程,于今日,2013年4月8日,全部翻译成中文.这是中国屌丝军团,从 ...

  6. 全文翻译(三) TVM An Automated End-to-End Optimizing Compiler

    全文翻译(三) TVM An Automated End-to-End Optimizing Compiler 5. 自动化优化 考虑到一组丰富的调度原语,剩下的问题是为DL模型的每一层,找到最佳的算 ...

  7. 全文翻译(四) TVM An Automated End-to-End Optimizing Compiler

    全文翻译(四) TVM An Automated End-to-End Optimizing Compiler 6.3 嵌入式GPU评估 对于移动GPU实验,在配备ARM Mali-T860MP4 G ...

  8. 专业英语翻译(二)Deep Learning(上)(词组+生词+段落翻译+全文翻译)

    11/11 原文: Deep learning allows computational(计算的) models that are composed of multiple processing la ...

  9. 《易经》全文翻译(值得收藏)

    1.<易经>中隐含的28条天规,大智慧! 一:以自我为中心的人,将困于人生最大的陷阱 人人都有"自我"--身体.思想.财产.名誉.地位等等.如果你是一个聪明人,不仅要为 ...

最新文章

  1. cordova 发布 android release 签名打包
  2. mysql 学习笔记08 日期相关函数2
  3. uuid表示时间的部分_技术译文 | UUID 很火但性能不佳?今天我们细聊一聊
  4. 网络游戏中网络模块浅析
  5. pku1067----取石子游戏(博弈)
  6. 计算机网络实验指导书 pdf,计算机网络实验指导书(新版).pdf
  7. nginx集群部署,实现负载均衡和nfs共享
  8. 偶极子天线的优缺点_一种双面印刷偶极子天线解析
  9. uni-app使用HBuilder X编辑器本地打包app(apk)详情步骤
  10. matlab点类型,Matlab中的类(Class)
  11. xss.haozi.me靶机
  12. 蠢蛋秀:匠心独运的脑筋急转弯游戏
  13. Android OpenGLES滤镜开发之贴纸效果
  14. 终于有人把 “单点“ 登录说清楚了!
  15. bitlocker加密怎么解除(破解Bitlocker加密方法)
  16. 京东之鉴:兄弟是兄弟,员工是员工!-千氪
  17. Autofac 资料整理
  18. 信息系统分析与设计 第十一章 系统详细设计
  19. 两台电脑通过trunk口互通,修改trunk 接口pvid后不通了 <1>
  20. 快速提高计算能力——matlab多项式计算

热门文章

  1. 使用JPA进行Update操作 @Query注解的用法,JPL
  2. 2021-2027年中国智能马桶盖行业市场研究及前瞻分析报告
  3. 规范的 Commit Message
  4. Kali2021.2 VMware最新版安装步骤
  5. Jupyter Magic - Timing(%%time %time %timeit)
  6. Pytorch: 命名实体识别: BertForTokenClassification/pytorch-crf
  7. Pytorch中多GPU训练指北
  8. [PyTorch] rnn,lstm,gru中输入输出维度
  9. 适用于CUDA GPU的Numba 随机数生成
  10. CVPR目标检测与实例分割算法解析:FCOS(2019),Mask R-CNN(2019),PolarMask(2020)