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

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

摘要

人们越来越需要将机器学习应用到各种各样的硬件设备中。现在的框架依赖于特定于供应商的算子库,针对窄带的服务器级GPU进行优化。将工作负荷部署到新平台,如移动电话,嵌入式设备和加速算子(如FPGA,ASIC)-需要大量手动操作。

提出了TVM,一个开源图形级别的编译器和算子级优化,提供高效跨多个应用程序移植到深度学习工作负荷硬件后端。TVM解决了深度学习特有的优化难题,如高级算子融合,映射到任意硬件原语,内存延迟隐藏。

通过以下方式自动优化底层程序,适配硬件特性:

采用一种自定义的,基于学习的成本模型方法,用于快速探索代码优化。实验结果表明,TVM可在不同的领域,提供高性能硬件后端,可与最先进的低功耗CPU,mobile GPU,server-class GPUs的手动调优库抗衡。展示了TVM面向加速算子后端的能力,如作为基于FPGA的通用深度学习加速算子。TVM系统是开源的,在几家大公司提供量产服务。

1.引言

深度学习(DL)模型,可以识别图像,处理自然语言,在挑战性战略游戏中击败人类。智能应用部署的需求日益增长,从云服务器,自动驾驶汽车和嵌入式设备,广泛应用于各种设备。由于硬件特性的多样性,包括嵌入式CPU,GPU,FPGA和ASIC(如TPU),将DL工作负荷,映射到这些设备非常重要。这些硬件目标包括内存组织,计算功能单元,如图1所示。

 

Figure 1: CPU, GPU and TPU-like accelerators require different on-chip memory architectures and compute primitives. This divergence must be addressed when generating optimized code.

当前的DL框架,如TensorFlow,MXNet,Caffe和Pytorch,依靠计算图实现优化,如自动微分和动态内存管理。图形级优化,通常太深奥,无法处理硬件后端特定的算子级转换。大部分框架专注于一个狭窄的服务器类GPU设备,特定于目标的优化高度工程化和特定于供应商的算子libraries。这些算子库,过于专业化和不透明,不易于跨硬件设备进行移植,需要大量的手动调谐数据。提供在各种DL框架中,支持各种硬件后端,目前需要大量的工程效率。即使对于受支持的后端,框架也必须在以下两者间,做出艰难的选择:

(1) 避免产生预定义运算子库中,没有的新运算符算子的图形优化

(2)使用这些新算子的未优化实现。

不同的硬件后端,实现图形级和算子级优化,采用了一种有趣的,完全不同的端到端方法。构建TVM,一种采用高级规范的编译器,从现有框架支持不同的代码生成,低级优化代码硬件后端。为了吸引用户,TVM需要提供与跨di-verse硬件后端的多种手动优化算子库相竞争的性能。这一目标需要解决下文介绍的主要挑战。

利用特定的硬件功能和限制。

DL加速算子引入了优化的张量计算原语,GPU和CPU不断改进处理元素。一个重大的挑战,客户生成优化的代码给定的算子描述。硬件指令的输入是多维的,可以是固定的,也可以是可变的长度;规定了不同的数据布局;有内存层次结构的特殊要求。系统必须利用加速算子,有效地处理这些复杂的原语。加速算子的设计也是如此,通常倾向于更精简的控制和load更多编译器堆栈复杂调度。对于专门化的加速算子,系统需要生成显式控制管道,针对CPU和GPU的硬件,优化隐藏内存访问延迟关系的代码。

优化的大搜索空间另一个挑战,在不手动调整算子的情况下,生成高效代码。内存访问,线程模式和新型硬件原语的组合选择,为生成的代码创建巨大的配置空间(例如,循环布局和排序,缓存,展开)。如果实施blackbox黑盒自动调谐,将产生巨大的搜索成本。可以采用预先确定的成本模型,指导搜索,由于模型的复杂性越来越高,构建准确成本模型,很难建立模型现代硬件。此外,要求为每种硬件类型,建立单独的成本模型。

TVM通过三个关键模块解决了这些挑战。

(1)引入一种张量表达式语言。

构建算子提供程序转换,通过各种优化生成不同版本的program原语。这一层开展Halid的计算/调度分离概念,将目标硬件本质与转换原语分离,支持新型加速算子及相应的新intrinsics。此外,引入了新的转换原语,应对与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的组件。

 

Figure 2: System overview of TVM. The current stack supports descriptions from many deep learning frameworks and exchange formats, such as CoreML and ONNX, to target major CPU, GPU and specialized accelerators.

图2总结了TVM中的执行步骤及相应部分。该系统首先将现有框架中的模型作为输入,转换为计算图形表示。然后执行高级数据流重写,生成优化的图。操作员级优化模块必须生成efficient代码-此图中每个融合运算符的。运算符是用声明性张量表达式语言指定的;未指定执行细节。TVM为给定的目标识别一组可能的代码优化

硬件目标的算子。可能的优化形成了一个很大的空间,使用基于ML的成本模型,寻找优化的算子。最后,系统将生成的代码,打包到可部署模块中。

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

import tvm as t

# Use keras framework as example, import model

graph, params = t.frontend.from_keras(keras_model)

target = t.target.cuda()

graph, lib, params = t.compiler.build(graph, target, params)

这个编译后的运行时模块,包含三个组件:

最终优化的计算图(graph)、生成的算子(lib)和模块参数(params)。可以使用这些组件,将模型部署到目标后端

import tvm.runtime as t

module = runtime.create(graph, lib, t.cuda(0))

module.set_input(**params)

module.run(data=data_array)

output = tvm.nd.empty(out_shape, ctx=t.cuda(0))

module.get_output(0, output)

TVM支持局域网中的多个部署后端,如C++、java和Python。本文的其余部分描述了TVM的体系结构,及系统程序员如何扩展,支持新的后端。

 

 

参考文献:
TVM: An Automated End-to-End Optimizing Compiler for Deep Learning
posted @ 2021-10-26 06:28  吴建明wujianming  阅读(218)  评论(0编辑  收藏  举报