TVM: An Automated End-to-End Optimizing Compiler for Deep Learning

news/2024/4/19 10:49:04/文章来源:https://blog.csdn.net/sexyluna/article/details/130353152

https://www.usenix.org/conference/osdi18/presentation/chen

文章目录

  • TVM: An Automated End-to-End Optimizing Compiler for Deep Learning
    • 引言
    • 1. 简介
    • 2. 总览
    • 3. 优化计算图
    • 4. 生成张量运算
      • 4.1 张量表达式和调度空间
      • 4.3 嵌套并行与协作
      • 4.3 张量化
      • 4.4 显式内存延迟隐藏
    • 5 .自动化优化
      • 5. 1 调度空间规范
      • 5.3 基于机器学习的成本模型
      • 5.3 安排探索
      • 5. 4 分布式设备池和 RPC
    • 6. 评估
    • 7. 相关工作
    • 8. 总结

TVM(深度学习编译器)是一个开源的深度学习编译器框架,其在深度学习模型的编译和优化方面具有很高的效率和灵活性。以下是一些优秀的TVM项目论文:

  1. “TVM: An Automated End-to-End Optimizing Compiler for Deep Learning”:这是TVM项目的官方论文,介绍了TVM的设计和实现,以及其在深度学习模型编译和优化方面的优势。 2018年
  2. “Optimizing Deep Learning Workloads on ARM GPU with TVM”:这篇论文介绍了如何使用TVM在ARM GPU上优化深度学习工作负载,提高性能和效率。2018年https://tvm.apache.org/2018/01/16/opt-mali-gpu
  3. “TVM: End-to-End Optimization Stack for Deep Learning”:这篇论文介绍了TVM的设计和实现,以及其在深度学习模型编译和优化方面的优势,同时还介绍了TVM的应用场景和未来发展方向。2018年 https://arxiv.org/abs/1802.04799
  4. “TVM: A Unified Deep Learning Compiler Stack”:这篇论文介绍了TVM的设计和实现,以及其在深度学习模型编译和优化方面的优势,同时还介绍了TVM的应用场景和未来发展方向。 2017年 https://tvm.apache.org/2017/08/17/tvm-release-announcement
  5. “TVM: An Automated End-to-End Optimizing Compiler for Tensor Programs”:这篇论文介绍了TVM的设计和实现,以及其在张量程序编译和优化方面的优势,同时还介绍了TVM的应用场景和未来发展方向。2018年 https://arxiv.org/abs/1802.04799

TVM: An Automated End-to-End Optimizing Compiler for Deep Learning

image-20230411002400246

引言

越来越需要将机器学习引入各种各样的硬件设备。当前的框架依赖于特定于供应商的运算符库,并针对范围较窄的服务器级 GPU 进行了优化。将工作负载部署到新平台——例如手机、嵌入式设备和加速器(例如 FPGA、ASIC)——需要大量的手动工作。我们提出了 TVM,这是一种编译器,它公开图形级运算符级优化,为跨不同硬件后端的深度学习工作负载提供性能可移植性。 TVM 解决了特定于深度学习的优化挑战,例如高级运算符融合映射到任意硬件基元内存延迟隐藏。它还通过采用一种新颖的、基于学习的成本建模方法来快速探索代码优化,从而自动优化低级程序以适应硬件特性。实验结果表明,TVM 提供跨硬件后端的性能,可与用于低功耗 CPU、移动 GPU 和服务器级 GPU 的最先进的手动调整库相媲美。我们还展示了 TVM 以新的加速器后端为目标的能力,例如基于 FPGA 的通用深度学习加速器。该系统是开源的,并在几家大公司内部使用

1. 简介

深度学习 (DL) 模型现在可以识别图像、处理自然语言并在具有挑战性的策略游戏中击败人类。将智能应用程序部署到各种设备的需求不断增长,从云服务器到自动驾驶汽车和嵌入式设备。由于硬件特性的多样性,包括嵌入式 CPU、GPU、FPGA 和 ASIC(例如 TPU [21]),将 DL 工作负载映射到这些设备很复杂。这些硬件目标在内存组织、计算功能单元等术语,如图 1 所示。当前的 DL 框架,例如 TensorFlow、MXNet、Caffe 和 PyTorch,依赖于计算图的中间表示来实现优化,例如自动微分和动态内存管理 [3, 4, 9]。然而,图级优化通常太高级而无法处理特定于硬件后端的运算符级转换。大多数这些框架都专注于一小部分服务器级 GPU 设备,并将特定于目标的优化委托给高度工程化和特定于供应商的运算符库。这些操作员级别的库需要大量的手动调整,因此过于专业和不透明,无法轻松地跨硬件设备移植。目前,在各种 DL 框架中为各种硬件后端提供支持需要大量的工程工作。即使对于受支持的后端,框架也必须在以下两者之间做出艰难的选择:

(1)避免产生不在预定义运算符库中的新运算符的图优化,

(2)使用这些新运算符的未优化实现启用图级和运算符级优化,

针对不同的硬件后端,我们采用了一种根本不同的端到端方法。我们构建了 TVM,这是一种编译器,它从现有框架中获取深度学习程序的高级规范,并为各种硬件后端生成低级优化代码。为了吸引用户,TVM 需要提供与跨不同硬件后端的众多手动优化运算符库具有竞争力的性能。这个目标需要解决下面描述的主要挑战

利用特定的硬件特性和抽象。 DL 加速器引入了优化的张量计算原语 [1、12、21],而 GPU 和 CPU 不断改进它们的处理元素。这对为给定的运算符描述生成优化代码提出了重大挑战。硬件指令的输入是多维的,具有固定或可变长度;他们规定了不同的数据布局;他们对内存层次结构有特殊要求。系统必须有效地利用这些复杂的原语才能从加速中获益。此外,加速器设计通常也有利于更精简的控制 [21] 并将大部分调度复杂性卸载到编译器堆栈。对于专门的加速器,系统现在需要生成代码来显式控制流水线依赖性以隐藏内存访问延迟——这是硬件为 CPU 和 GPU 执行的工作。

用于优化的大搜索空间 另一个挑战是在不手动调整运算符的情况下生成高效代码。内存访问、线程模式和新颖的硬件原语的组合选择为生成的代码(例如,循环块和排序、缓存、展开)创建了巨大的配置空间,如果我们实现黑盒自动调整。人们可以采用预定义的成本模型来指导搜索,但由于现代硬件的复杂性不断增加,因此很难建立准确的成本模型。此外,这种方法需要我们为每种硬件类型构建单独的成本模型。 TVM 通过三个关键模块来应对这些挑战。

(1) 我们引入了一种张量表达式语言来构建运算符,并提供程序转换原语,这些原语可以生成具有各种优化的不同版本的程序。该层扩展了 Halide [32] 的计算/调度分离概念,还将目标硬件内在函数与转换原语分开,从而支持新型加速器及其相应的新内在函数。此外,我们引入了新的转换原语来解决与 GPU 相关的挑战,并支持部署到专用加速器。然后我们可以应用不同的程序转换序列来形成一个丰富的空间给定运算符声明的有效程序。

(2) 我们引入了一个自动化程序优化框架来寻找优化的张量算子。优化器由基于 ML 的成本模型指导,随着我们从硬件后端收集更多数据,该模型会进行调整和改进。

(3) 在自动代码生成器之上,我们引入了一个图形重写器,它充分利用了高级和运算符级别的优化。

通过结合这三个模块TVM 可以从现有的深度学习框架中获取模型描述,执行联合高级和低级优化,并为后端生成特定于硬件的优化代码,例如 CPU、GPU 和 FPGA-基于专门的加速器。

该论文做出了以下贡献:

• 我们确定了为跨不同硬件后端的深度学习工作负载提供性能可移植性的主要优化挑战。

• 我们引入了新颖的调度原语,这些原语利用了跨线程内存重用、新颖的硬件内在函数和延迟隐藏。

• 我们提出并实施了一个基于机器学习的优化系统来自动探索和搜索优化的张量算子。

• 我们构建了一个端到端的编译和优化堆栈,允许将高级框架(包括 TensorFlow、MXNet、PyTorch、Keras、CNTK)中指定的深度学习工作负载部署到不同的硬件后端(包括 CPU、服务器 GPU、移动 GPU 和基于 FPGA 的加速器)。开源 TVM 已在几家大公司内部投入生产使用。

我们使用服务器级 GPU、嵌入式 GPU、嵌入式 CPU 和基于定制通用 FPGA 的加速器上的真实工作负载评估了 TVM。实验结果表明,TVM 提供了跨后端的可移植性能,并且比由手动优化库支持的现有框架实现了 1.2 倍到 3.8 倍的加速。

2. 总览

本节通过使用示例来介绍 TVM 的组件。图 2 总结了 TVM 中的执行步骤及其在论文中的相应部分。该系统首先将现有框架中的模型作为输入,并将其转换为计算图表示。然后执行高级数据流重写以生成优化图。运算符级优化模块必须为该图中的每个融合运算符生成高效代码。运算符在声明性张量表达式中指定规矩;执行细节未指定。 TVM 为给定硬件目标的运算符识别可能的代码优化集合。可能的优化形成了很大的空间,因此我们使用基于 ML 的成本模型来寻找优化的算子。最后,系统将生成的代码打包到一个可部署的模块中

最终用户示例。在几行代码中,用户可以从现有的深度学习框架中获取模型并调用 TVM API 以获得可部署的模块:

image-20230410213129413

这个编译运行时模块包含三个组件:最终优化的计算图(graph)、生成的运算符(lib)和模块参数(params)。然后可以使用这些组件将模型部署到目标后端:

TVM 支持 C++、Java 和 Python 等语言的多种部署后端。本文的其余部分描述了 TVM 的体系结构以及系统程序员如何扩展它以支持新的后端

3. 优化计算图

计算图是在 DL 框架 [3、4、7、9] 中表示程序的常用方法。图 3 显示两层卷积神经网络的示例计算图表示。这种高级表示与低级编译器中间表示 (IR)(例如 LLVM)之间的主要区别在于,中间数据项是大型多维张量。计算图提供了运算符的全局视图,但它们避免指定每个运算符必须如何实现。与 LLVM IR 一样,可以将计算图转换为功能等效的图以应用优化。我们还利用常见 DL 工作负载中的形状特异性来优化一组固定的输入形状。 TVM 利用计算图表示来应用高级优化:节点表示对张量或程序输入的操作,边表示操作之间的数据依赖关系。它实现了许多图级优化,包括:运算符融合,将多个小操作融合在一起;常量折叠,预先计算可以静态确定的图形部分,节省执行成本;一个静态内存规划通道,它预先分配内存来保存每个中间张量;和数据布局转换,将内部数据布局转换为后端友好的形式。我们现在讨论运算符融合和数据布局转换

**算子融合。**运算符融合将多个运算符组合到一个内核中,而不会将中间结果保存在内存中。这种优化可以大大减少执行时间,特别是在 GPU 和专用加速器中。具体来说,我们识别四类图运算符:

(1)单射(一对一映射,例如加法),

(2)归约(例如求和),

(3)复杂可融合(可以融合元素- wise map to output,例如conv2d)

(4)不透明(不能融合,例如排序)。

我们提供了融合这些运算符的通用规则,如下所示。多个单射算子可以融合成另一个单射算子。归约运算符可以与输入单射运算符融合(例如,融合比例和求和)。诸如 conv2d 之类的运算符是复杂的可融合的,

可以将逐元素运算符融合到它的输出中。我们可以应用这些规则将计算图转换为融合版本。图 4 展示了这种优化对不同工作负载的影响。我们发现融合运算符通过减少内存访问产生高达 1.2 倍到 2 倍的加速。

数据布局转换。有多种方法可以在计算图中存储给定的张量。最常见的数据布局选择是列优先和行优先。实际上,我们可能更喜欢使用更复杂的数据布局。例如,DL 加速器可能利用 4×4 矩阵运算,需要将数据平铺成 4×4 块以优化访问局部性。数据布局优化将计算图转换为可以使用更好的内部数据布局在目标硬件上执行的计算图。它首先在给定内存层次结构规定的约束的情况下为每个运算符指定首选数据布局。如果他们的首选数据布局不匹配,我们然后在生产者和消费者之间执行适当的布局转换。虽然高级图优化可以极大地提高 DL 工作负载的效率,但它们的有效性取决于算子库提供的内容。目前,少数支持运算符融合的 DL 框架需要运算符库提供融合模式的实现。随着定期引入更多网络运营商,可能融合内核的数量会急剧增加。当以越来越多的硬件后端为目标时,这种方法不再可持续,因为所需的融合模式实现数量与必须支持的数据布局、数据类型和加速器内在函数的数量一起增长。为程序和每个后端所需的各种操作手工制作运算符内核是不可行的。为此,我们接下来提出了一种代码生成方法,可以为给定模型的运算符生成各种可能的实现

4. 生成张量运算

TVM 通过在每个硬件后端生成许多有效的实现并选择优化的实现来为每个运算符生成高效的代码。这个过程建立在 Halide 将描述与计算规则(或调度优化)解耦的想法之上,并将其扩展为支持新的优化(嵌套并行、张量化和延迟隐藏)和各种硬件后端.我们现在突出显示 TVM 特定的功能

4.1 张量表达式和调度空间

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

image-20230410232844574

每个计算操作都指定了输出张量的形状和描述如何计算它的每个元素的表达式。我们的张量表达式语言支持常见的算术和数学运算,并涵盖常见的 DL 运算符模式。该语言不指定循环结构和许多其他执行细节,它提供了为各种后端添加硬件感知优化的灵活性。采用 Halide [32] 中的解耦计算/调度原则,我们使用调度来表示从张量表达式到低级代码的特定映射。许多可能的时间表都可以执行此功能。我们通过逐步应用保持程序逻辑等价性的基本转换(调度原语)来构建调度。图 5 显示了在专用加速器上调度矩阵乘法的示例。在内部,当我们应用调度转换时,TVM 使用数据结构来跟踪循环结构和其他信息。然后,此信息可以帮助为给定的最终计划生成低级代码。我们的张量表达式借鉴了 Halide [32]、Darkroom [17] 和 TACO [23] 的线索。它的主要增强功能包括支持下面讨论的新计划优化。为了在许多后端上实现高性能,我们必须支持足够的调度原语以涵盖不同硬件后端上的各种优化集。

image-20230410235542957

上图 总结了操作代码生成过程和和 TVM 支持的调度原语。我们重用了 Halide 中有用的原语和低级循环程序 AST,并引入了新的原语来优化 GPU 和加速器性能。新原语是实现最佳 GPU 性能所必需的,并且对于加速器至关重要。 CPU、GPU、类TPU加速器是深度学习的三种重要硬件。本节介绍了 CPU、GPU 和类似 TPU 的加速器的新优化原语,而第 5 节解释了如何自动派生高效的调度我们重用了 Halide 中有用的原语和低级循环程序 AST,并引入了新的原语来优化 GPU 和加速器性能。新原语是实现最佳 GPU 性能所必需的,并且对于加速器至关重要。 CPU、GPU、类TPU加速器是深度学习的三种重要硬件。本节介绍了 CPU、GPU 和类似 TPU 的加速器的新优化原语,而第 5 节解释了如何自动派生高效的调度

4.3 嵌套并行与协作

并行性是提高 DL 工作负载中计算密集型内核效率的关键。现代 GPU 提供大规模并行性,要求我们将并行模式烘焙到调度转换中。大多数现有解决方案都采用称为嵌套并行性的模型,这是一种 fork-join 形式。该模型需要并行调度原语来并行化数据并行任务;每个任务都可以进一步递归地细分为子任务,以利用目标体系结构的多级线程层次结构(例如,GPU 中的线程组)。我们称此模型为无共享嵌套并行,因为一个工作线程无法在同一并行计算阶段查看其兄弟的数据无共享方法的替代方法是协作获取数据。具体来说,线程组可以协作获取它们都需要的数据并将其放入共享内存空间。 1 此优化可以利用 GPU 内存层次结构和 en-通过共享内存区域实现跨线程数据重用。 TVM 使用调度原语支持这种众所周知的 GPU 优化,以实现最佳性能。以下 GPU 代码示例优化了矩阵乘法

image-20230410233128306

展示了这种优化的影响。我们将内存范围的概念引入调度空间,以便可以将计算阶段(代码中的 AS 和 BS)标记为共享。如果没有明确的内存范围,自动范围推断会将计算阶段标记为线程本地。共享任务必须计算组中所有工作线程的依赖关系。此外,必须正确插入内存同步屏障,以保证共享加载的数据对消费者可见。最后,除了对 GPU 有用之外,内存范围还让我们可以标记特殊的内存缓冲区,并在针对专门的 DL 加速器时创建特殊的降低规则

4.3 张量化

DL 工作负载具有很高的算术强度,通常可以分解为张量运算符,如矩阵-矩阵乘法或一维卷积。这些自然分解导致了最近添加张量计算原语的趋势 [1、12、21]。这些新原语为基于调度的编译创造了机会和挑战;虽然使用它们可以提高性能,但编译框架必须无缝集成它们。我们称这种张量化为:它类似于 SIMD 架构的矢量化,但有显着差异。指令输入是多维的,具有固定或可变长度,并且每个都有不同的数据布局。更重要的是,我们不能支持一组固定的原语,因为新的加速器正在出现,它们都有自己的张量指令变体。因此,我们需要一个可扩展的解决方案

我们通过使用张量内在声明机制将目标硬件内在与时间表分开,从而使张量化可扩展。我们使用相同的张量表达式语言来声明每个新硬件内在的行为和与之相关的降低规则。下面的代码展示了如何声明一个 8 × 8 张量硬件内在此外,我们引入了一个张量化调度原语来用相应的内在函数替换一个计算单元。编译器将计算模式与硬件声明相匹配,并将其降低为相应的硬件内在。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QikVC0Sc-1682344360327)(/Users/chendongsheng/Library/Application Support/typora-user-images/image-20230411000203162.png)]

张量化将时间表与特定的硬件原语分离,使得扩展 TVM 以支持新的硬件架构变得容易。生成的张紧调度代码符合高性能计算的实践:将复杂的操作分解为一系列微内核调用。我们还可以使用 tensorize 原语来利用手工制作的微内核,这在某些平台上可能是有益的。例如,我们通过利用位串行矩阵向量乘法微内核为移动 CPU 实现超低精度运算符,这些运算符对一位或两位宽的数据类型进行运算。这个微内核将结果累积到逐渐变大的数据类型中,以最大限度地减少内存占用。将微内核呈现为 TVM 固有的张量,比非张量化版本产生高达 1.5 倍的加速。

4.4 显式内存延迟隐藏

延迟隐藏是指将内存操作计算重叠以最大限度地利用内存和计算资源的过程。它需要不同的策略,具体取决于目标硬件后端。在 CPU 上,内存延迟隐藏是通过同步多线程 [14] 或硬件预取 [10、20] 隐式实现的。 GPU 依赖于许多线程扭曲的快速上下文切换 [44]。相比之下,TPU [21] 等专用 DL 加速器通常倾向于使用解耦访问执行 (DAE) 架构 [35] 进行更精简的控制,并将细粒度同步问题卸载到软件。图 9 显示了减少运行时延迟的 DAE 硬件管道。与单片硬件设计相比,流水线可以隐藏大部分内存访问开销,几乎可以充分利用计算资源。为了实现更高的利用率,必须使用细粒度的同步操作来扩充指令流。没有它们,就无法强制执行依赖关系,从而导致错误执行。因此,DAE 硬件流水线需要流水线阶段之间的细粒度依赖入队/出队操作,以提前正确执行,

image-20230411000404581

image-20230411000417808

如图上 的指令流所示。对需要显式低级同步的 DAE 加速器进行编程很困难。为了减轻编程负担,我们引入了一个虚拟线程调度原语,它允许程序员指定一个高级数据并行程序,就像他们指定一个支持多线程的硬件后端一样。然后 TVM 自动将程序降低为具有低级显式同步的单个指令流,如图 8 所示。该算法从高级多线程程序调度开始,然后插入必要的低级同步操作以保证每个线程内的正确执行。接下来,它将所有虚拟线程的操作交织到单个指令流中。最后,硬件恢复了由指令流中的低级同步决定的可用流水线并行性

延迟隐藏的硬件评估。

我们现在展示延迟隐藏在基于 FPGA 的自定义加速器设计上的有效性,我们在 6.4 小节中对此进行了深入描述。我们在加速器上运行每一层 ResNet,并使用 TVM 生成两个时间表:一个带有延迟隐藏,一个没有。隐藏延迟的调度将程序与虚拟线程并行化,以暴露管道并行性,从而隐藏内存访问延迟。结果在图 10 中显示为屋顶线图 [47]; Roofline 性能图可以深入了解给定系统在不同基准测试中使用计算和内存资源的情况。总体而言,延迟隐藏提高了所有 ResNet 层的性能。峰值计算利用率从没有延迟隐藏的 70% 增加到有延迟隐藏的 88%。

5 .自动化优化

鉴于丰富的调度原语集,我们剩下的问题是为 DL 模型的每一层找到最佳运算符实现。在这里,TVM 为与每一层相关联的特定输入形状和布局创建了一个专门的运算符。这种专业化提供了显着的性能优势(与针对较小的形状和布局多样性的手工代码形成对比),但它也带来了自动化挑战。系统需要选择调度优化——例如修改循环顺序或优化内存层次——以及特定于调度的参数,例如平铺大小和循环展开因子。这种组合选择为每个硬件后端创建了一个很大的运算符实现搜索空间。为了应对这一挑战,我们构建了一个包含两个主要组件的自动调度优化器:

一个提出有希望的新配置的调度浏览器

一个预测给定配置性能的机器学习成本模型

本节介绍这些组件和 TVM 的自动优化流程(图 11)

image-20230411001235815

5. 1 调度空间规范

我们构建了一个时间表模板规范 API,让开发人员在时间表空间中声明旋钮。在指定可能的时间表时,模板规范允许在必要时结合开发人员的领域特定知识。我们还为每个硬件后端创建了一个通用主模板,它根据使用张量表达式语言表达的计算描述自动提取可能的旋钮。在高层次上,我们希望考虑尽可能多的配置,让优化器管理选择负担。因此,优化器必须为我们实验中使用的真实世界 DL 工作负载搜索数十亿种可能的配置

5.3 基于机器学习的成本模型

从大型配置空间中找到最佳调度的一种方法是通过黑盒优化,即自动调整。该方法用于调整高性能计算库 [15、46]。然而,自动调整需要很多实验来确定一个好的配置另一种方法是构建一个预定义的成本模型来指导对特定硬件后端的搜索而不是运行所有可能性并测量它们的性能。理想情况下,一个完美的成本模型考虑了影响性能的所有因素:内存访问模式数据重用管道依赖性线程荷兰国际集团模式,等等。不幸的是,由于现代硬件的复杂性不断增加,这种方法很繁琐。此外,每个新的硬件目标都需要一个新的(预定义的)成本模型。

相反,我们采用统计方法来解决成本建模问题。在这种方法中,调度浏览器会提出可以提高运营商绩效的配置。对于每个调度配置,我们使用一个 ML 模型,该模型将降低的循环程序作为输入并预测其在给定硬件后端上的运行时间。该模型使用探索期间收集的运行时测量数据进行训练,不需要用户输入详细的硬件信息。我们在优化期间探索更多配置时定期更新模型,这也提高了其他相关工作负载的准确性。通过这种方式,ML 模型的质量随着更多的实验试验而提高。表 1 总结了自动化方法之间的主要区别。基于 ML 的成本模型在自动调整和预定义成本建模之间取得平衡,并且可以从相关工作负载的历史性能数据中获益

机器学习模型设计选择

在选择日程管理器将使用的 ML 模型时,我们必须考虑两个关键因素:质量和速度。 schedule explorer 频繁查询成本模型,由于模型预测时间和模型改装时间而产生开销。为了有用,这些开销必须小于测量性能所需的时间性能

实际硬件上的性能,根据特定的工作负载/硬件目标,这可能是几秒的数量级。这种速度要求将我们的问题与传统的超参数调整问题区分开来,在传统的超参数调整问题中,执行测量的成本相对于模型开销非常高,并且可以使用更昂贵的模型。除了模型的选择,我们还需要选择一个目标函数来训练模型,例如配置预测运行时间的误差。然而,由于探索者仅根据预测的相对顺序(A 运行速度比 B 快)选择最佳候选者,因此我们不需要直接预测绝对执行时间。相反,我们使用排名目标来预测运行时成本的相对顺序。我们在 ML 优化器中实现了几种类型的模型

我们采用梯度树提升模型(基于 XGBoost [8]),它根据从循环程序中提取的特征进行预测;这些功能我包括每个循环级别的每个内存缓冲区的内存访问计数和重用率,以及循环注释的单热编码,例如“向量化”、“展开”和“并行”。

我们还评估了一个神经网络模型,该模型使用 TreeRNN [38] 在没有特征工程的情况下总结循环程序的 AST。图 13 总结了成本模型的工作流程。我们发现 tree boosting 和 TreeRNN 具有相似的预测质量。然而,前者执行预测的速度是后者的两倍,而且训练时间要少得多。因此,我们在实验中选择梯度树提升作为默认成本模型。尽管如此,我们相信这两种方法都是有价值的,并期待未来对这个问题进行更多的研究。平均而言,树提升模型在 0.67 毫秒内进行预测,比运行实际测量快数千倍。图 12 将基于 ML 的优化器与黑盒自动调整方法进行了比较;前者比后者更快地找到更好的配置

5.3 安排探索

一旦我们选择了成本模型,我们就可以使用它来选择有前途的配置,在这些配置上迭代运行实际测量。在每次迭代中,探索者使用 ML 模型的预测来选择一批候选对象以运行测量。然后将收集的数据用作训练数据来更新模型。如果不存在初始训练数据,则探索器会随机选择候选对象进行测量。最简单的探索算法通过成本模型枚举并运行每个配置,选择前 k 个预测性能。然而,这种策略在大搜索空间中变得难以处理。相反,我们运行并行模拟退火算法 [22]。探索者从随机配置开始,并且在每一步随机走到附近的配置。如果成本按照成本模型的预测降低,则此转换成功。如果目标配置具有更高的成本,它很可能会失败(拒绝)。随机游走倾向于收敛于成本模型所预测的具有较低成本的配置。探索状态在成本模型更新中持续存在;这些更新后,我们从上次配置继续

5. 4 分布式设备池和 RPC

分布式设备池可扩展硬件试验的运行,并支持多个优化作业之间的细粒度资源共享。 TVM 实现了一个定制的、基于 RPC 的分布式设备池,使客户端能够在特定类型的设备上运行程序。我们可以使用这个接口在主机编译器上编译程序,请求远程设备,运行远程运行,并在主机上以相同的脚本访问结果。 TVM 的 RPC 支持动态上传并运行使用其运行时约定的交叉编译模块和函数。因此,相同的基础设施可以执行单个工作负载优化和端到端图推理。我们的方法可以跨多个设备自动执行编译、运行和分析步骤。这种基础设施对于嵌入式设备尤其重要,传统上,嵌入式设备需要繁琐的手动工作来进行交叉编译、代码部署和测量

6. 评估

7. 相关工作

深度学习框架 [3, 4, 7, 9] 为用户提供了方便的接口来表达 DL 工作负载并将它们轻松部署在不同的硬件后端上。虽然现有框架目前依赖供应商特定的张量运算符库来执行其工作负载,但它们可以利用 TVM 的堆栈为大量硬件设备生成优化代码。高级计算图 DSL 是表示和执行高级优化的典型方法。 Tensorflow 的 XLA [3] 和最近推出的 DLVM [45] 属于这一类。交涉这些作品中的计算图相似,本文也使用了高级计算图DSL。虽然图级表示非常适合高级优化,但它们太高级了,无法在各种硬件后端下优化张量运算符。之前的工作依赖于特定的降低规则来直接生成低级 LLVM 或求助于供应商制作的库。这些方法需要为每个硬件后端和运营商变体组合付出大量的工程努力。 Halide [32] 介绍了分离计算和调度的想法。我们采用 Halide 的见解并在我们的编译器中重用其现有的有用调度原语。我们的张量运算符调度还与 GPU 的 DSL [18、24、36、37] 和基于多面体的循环变换 [6,43] 的其他工作相关。 TACO [23] 介绍了一种在 CPU 上生成稀疏张量运算符的通用方法。 Weld [30] 是用于数据处理任务的 DSL。我们特别专注于解决 GPU 和专用加速器的 DL 工作负载的新调度挑战。这些工作中的优化管道可能会采用我们的新原语。 ATLAS [46] 和 FFTW [15] 等高性能库使用自动调整来获得最佳性能。张量理解 [42] 应用黑盒自动调整和多面体优化来优化 CUDA 内核。 OpenTuner [5] 和现有的超参数调整算法 [26] 应用域不可知搜索。在 Halide [29] 中,使用预定义的成本模型自动安排图像处理管道。 TVM 的 ML 模型使用考虑程序结构的有效领域感知成本建模。基于的分布式调度优化器可扩展到更大的搜索空间,并且可以在大量受支持的后端上找到最先进的内核。更重要的是,我们提供了一个端到端的堆栈,可以直接从 DL 框架中获取描述,并与图级堆栈一起进行联合优化尽管用于深度学习的加速器越来越受欢迎 [11, 21],但仍不清楚如何构建编译堆栈以有效地针对这些设备。我们评估中使用的 VDLA 设计提供了一种通用方法来总结类似 TPU 的加速器的特性,并支持关于如何为加速器编译代码的具体案例研究。我们的方法也可能有利于将深度学习编译到 FPGA [34,40] 的现有系统。本文提供了一个通用的解决方案,通过张量化和编译器驱动的延迟隐藏来有效地定位加速器。

8. 总结

我们提出了一个端到端的编译堆栈来解决跨各种硬件后端的深度学习的基本优化挑战。我们的系统包括自动端到端优化,这在历史上是一项劳动密集型和高度专业化的任务。我们希望这项工作将鼓励对端到端编译方法的更多研究,并为 DL 系统软硬件协同设计技术开辟新的机会。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_103081.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跌倒检测和识别4:C++实现跌倒检测(含源码,可实时跌倒检测)

跌倒检测和识别4:C实现跌倒检测(含源码,可实时跌倒检测) 目录 跌倒检测和识别4:C实现跌倒检测(含源码,可实时跌倒检测) 1. 前言 2. 跌倒检测模型(YOLOv5) (1)跌倒检测模型训练 …

2023云数据库技术沙龙MySQL x ClickHouse专场成功举办

4月22日,2023首届云数据库技术沙龙 MySQL x ClickHouse 专场,在杭州市海智中心成功举办。本次沙龙由玖章算术、菜根发展、良仓太炎共创联合主办。围绕“技术进化,让数据更智能”为主题,汇聚字节跳动、阿里云、玖章算术、华为云、腾…

【大数据之Hadoop】十九、MapReduce总结

MapTask工作机制 (1)Read阶段: job的提交流程:待读写的源数据由客户端进行切片划分,划分完成之后提交(切片信息、jar包、xml配置文件)给yarn,yarn开启MrAppMaster,MrAppMaster读取切片信息&…

10.java程序员必知必会类库之邮件

前言 邮件功能在当前互联网应用中已经是很成熟的功能,也是作为java程序员应该掌握的技能。常见使用场景有: 电商软件开电子发票,需要发到用户邮箱里面生产实时报警,需要发到邮箱里面银行软件申请的征信报告,电子账单…

《C++ Primer Plus》(第6版)第17章编程练习

《C Primer Plus》(第6版)第17章编程练习 《C Primer Plus》(第6版)第17章编程练习1. 计算输入流中第一个\$之前的字符数目2. 将键盘输入(直到模拟的文件尾)复制到通过命令行指定的文件中3. 将一个文件复制…

【难学易用c++ 之 继承】

目录: 前言一、继承的概念及定义(一)概念(二)继承定义继承关系和访问限定符继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承与友元六、继承与静态成员七…

如何使用阿里云短信服务实现登录页面,手机验证码登录?

1:个人如何使用阿里云短信服务? 2022如何使用个人阿里云短信服务?_linxiMY的博客-CSDN博客添加完成之后,等待审核!一般2个小时就会出来审核结果了,这里我因为注册申请时填写规则有误,足足审核了…

pytest 学习三(前置后置操作)

pytest测试框架_pytest框架-CSDN博客 一、常用的操作 一、setup/teardown 每个用例之前、之后执行 二、setup_class/teardown_class 在每个类之前、之后执行一次 二、pytest.fixture 设置前置后置操作范围 pytest.fixture(scope"",params,autouse,ids,name) 其中 sc…

JavaScript模块化开发

目录: 1 认识模块化开发 2 CommonJS和Node 3 require函数解析 4 AMD和CMD(了解) 5 ESModule用法详解 6 ESModule运行原理 模块化不是两个不同的js文件直接导入到某个页面中的,因为这两个文件只要有相同的变量或函数&#xf…

R基础函数概览(一)

rep 函数形式:rep(x, time , length , each ,) 参数说明: x:代表的是你要进行复制的对象,可以是一个向量或者是一个因子。 times:代表的是复制的次数,只能为正数。负数以及NA值都会为错误值。复制是指的…

云原生(docker+k8s+阿里云)-Docker

Gitee-Kubernetes学习 kubectl备忘清单 k8s官方文档-task [云原生-kubectl命令详解] ingress详解 ingress官方文档 云原生-语雀-架构师第一课 从Docker到Kubernetes进阶-社区 云计算学习路线-阿里云大学 如上图,服务器有公网ip和私网ip,公网ip是外部访问…

Ubuntu20.04使用多卡训练HyperNetwork模型和LoRA模型全流程及疑难问题解决方案

目录 一. LoRA模型多卡训练1.1 安装xformer等库1.2 设置路径1.3 多卡训练 二. LoRA模型多卡训练疑难报错解决方案多卡训练报错 软硬件配置: CPU: AMD 5800 8core 16Thread GPU: NVIDIA RTX 3090 *1 NVIDIA TITAN RTX *1 OS: Ubuntu20.04 一. LoRA模型多卡训练 1.1 …

一篇终结synchronized

一:基本原理 Java对象在内存中由两部分组成 : 1 是成员变量 2 是对象头,以32位虚拟机介绍:此时对象头是64位,即8字节 其中32个字节代表 mark word 另外32个字节代表klass word分别是什么意思呢? 1 klass …

写题总结1

先把自己写完的总结一下: 题目一: 猫儿园的告示牌上贴着 ab 大小的矩形广告纸。猫猫对广告不感兴趣,她想知道能否用 cd 的矩形白纸完全覆盖这个广告。猫猫可以对白纸进行平移、旋转,但不能折叠或撕开等。如果可以完全覆盖输出 YE…

滴水逆向3期笔记与作业——01汇编

防止OneNote丢失。 海哥牛逼。 01汇编笔记 01进制进制定义10-2进制转换八进制 02数据宽度/逻辑运算数据宽度与存储逻辑运算计算机做加法的本质作业 03通用寄存器_内存读写通用寄存器表通用寄存器图内存读写计算机操作系统位数意义 04内存地址_堆栈寻址公式PUSH指令POP指令作业 …

【IAR工程】STM8S基于ST标准库读取DHT11数据

【IAR工程】STM8S基于ST标准库读取DHT11数据 ✨申明:本文章仅发表在CSDN网站,任何其他网站,未注明来源,见此内容均为盗链和爬取,请多多尊重和支持原创!🍁对于文中所提供的相关资源链接将作不定期更换。&…

4月有8本SCIE期刊被剔除(附MDPI/Frontiers/Hindawi最新在检期刊)

2023年4月SCI、SSCI期刊目录更新 2023年4月18日,科睿唯安更新了WOS期刊目录,继上次3月WOS期刊目录剔除50本SCIE&SSCI期刊之后,此次4月更新又有8本SCIE期刊发生变动,其中有4本期刊被踢出SCIE数据库,4本期刊更改了名…

流程图拖拽视觉编程--概述

一般的机器视觉平台采用纯代码的编程方式,如opencv、halcon,使用门槛高、难度大、定制性强、开发周期长,因此迫切需要一个低代码开发的视觉应用平台。AOI缺陷检测的对象往往缺陷种类多,将常用的图像处理算子封装成图形节点,如抓直…

Android 系统架构大图

android的系统架构和其操作系统一样,采用了分层的架构。从架构图看,android分为四个层,从高层到低层分别是应用程序层、应用程序框架层、系统运行库层和Linux核心层。 1.应用程序 Android会同一系列核心应用程序包一起发布,该应用…

确定因果随机森林的树木数量 the number of trees

前言 推断因果性和分析异质性是统计学家在处理混杂任务中的圣杯。传统且主流的方法有:倾向性评分、分层分享、比例风险模型等。新的方法也有很多,代表就是:因果随机森林。这种算法,浅看难度一般,深入探索发现坑还是很多的。这篇博客不对算法做深入探讨,仅仅是我在阅读文…