专栏名称: 计算机视觉深度学习和自动驾驶
讨论计算机视觉、深度学习和自动驾驶的技术发展和挑战
目录
相关文章推荐
最高人民法院  ·  人民日报评论员:民营企业和民营企业家勇担重任 ... ·  19 小时前  
新周刊  ·  苦等三年,这8.5分神剧终于回归了 ·  昨天  
重庆市高级人民法院  ·  李永利院长赴铜梁调研人民法庭建设工作 ·  2 天前  
三联生活周刊  ·  25岁女演员之死:韩国娱乐圈的“男女有别” ·  3 天前  
51好读  ›  专栏  ›  计算机视觉深度学习和自动驾驶

深度神经网络在硬件上编译器的深入比较

计算机视觉深度学习和自动驾驶  · 公众号  ·  · 2024-06-28 00:06

正文

2019年来自清华大学的硬件上DNN编译器综述论文“An In-depth Comparison of Compilers for Deep Neural Networks on Hardware”。

将 NN 模型映射到高性能硬件实现的难度来自多种因素,包括从多个操作的计算复杂性到不同的硬件特性(例如内存分层结构和并行性)。本文介绍一种通用的编译器流程,并对编译器框架的域特定语言(DSL)、中间表示(IR)、优化策略和自动调度方法进行深入比较。基于这些编译器框架,重新实现典型的 NN 模型,并评估最终的性能。另外,回顾之前关于编译器框架和针对定制的基于 FPGA 加速器优化工作(深度神经网络虚拟机,DNNVM),得到有关通用处理器的编译器设计与基于 FPGA 的加速器编译器设计之间差异分析。


如图是DNN编译器的通用框架:


为了将各个应用转换为优化的实现,编译器已使用了几十年[8]。 得益于 CPU 和 GPU 的成熟市场,编译器能够从高级编程语言高效地生成平台相关的代码,而 Eigen[9]、MKL[10] 和 OpenBLAS[11] 等线性代数加速库则提供了 DNN 的优化实现。 此外,在定制加速器的设计中,计算机辅助工具在将不同的 DNN 映射到硬件模块并生成平台执行的高效指令方面,发挥着关键作用。

不幸的是,神经网络是计算密集型的,并且涉及延迟-关键的任务。用户编写算法以适应线性代数加速库是一个繁琐的过程。现有的编译器也很难集成新引入的优化方法来跟上算法快速发展的步伐;它们无法轻易提供足够的加速率来弥合编写的算法和目标硬件之间的差距。基于这些考虑,为了提高设备的吞吐量并提高生产率,近年来出现了几种受编译器启发的框架,可以智能地简化优化神经网络性能的实现。

深度神经网络的编译器框架在高级 DNN 规范的背景下工作,尤其是来自深度学习框架的模型,例如 Caffe[2]、TensorFlow[1]、MXNet[20] 和 PyTorch[3]。优化步骤应用于编译过程的不同阶段,这些编译器框架的处理流程可分为五层:1)前端,2)中间表示 (IR),3)高级优化,4)低级优化,和 5)后端。

首先,前端将深度神经网络的高级规范转换为特定于编译器的 IR。这些 IR 通常采用有向无环图[1][3] 的形式,其中每个节点代表一个计算操作,每个边表示操作之间的数据依赖关系。因此,可以在这些 IR 上使用图算法[13][19] 来融合操作并优化数据布局。除了高级 IR,编译器的优化过程中还采用了多个广泛的 IR[21]–[24]。深度神经网络工作负载可以分解为张量运算,例如矩阵-向量乘法和矩阵-矩阵乘法。低级优化方法[12][13]用于优化调度,以增强数据局部性并充分利用硬件平台的并行性。这个问题变成了使用什么优化以及选择哪些参数(例如,平铺大小、融合策略和矢量化)。在编译阶段可能会应用数百个低级优化的步骤。最后,后端[24],[25]负责将优化的实现映射到机器相关的可执行指令。

挑战的地方包括以下这些方面:

  • 1)IR。一种有效的设计思路是将算法描述与深度学习框架和硬件平台解耦。IR 不仅应该提供简洁、可移植且富有表现力的语法来表示 NN 模型和控制流,还应该提供包含算法和硬件平台特征的强大抽象表示,以便进行后续分析和优化。

  • 2)调度流水线。确定何时计算函数、将数据存储在何处以及缓存多长时间,以及重计算和数据局部性之间的权衡,是调度器面临的主要挑战。融合和平铺的组合是增强生成-使用局部性和充分利用并行性的最常用方法,但优化空间太大而无法探索。

  • 3)自动调整。如果所有优化步骤和调度都是手动指定,那么即使对于最有经验的工程师来说,也要花费高昂的工程成本才能实现理想的性能。自动调整是指一种结合模型的方法,用户可以使用该模型有效地遍历整个优化空间。对于自动调整,开发一种能够遍历所有潜在有利优化选择的方法,是一项挑战,该方法结合精确的执行成本和有限的时间复杂度。

  • 4)后端和代码生成。由于专用加速器的自定义指令集架构,自定义加速器的后端需要从头开始设计。在某些极端情况下,最终实现可能不针对单个 CPU 或 GPU 核,而 CPU/G-PU/FPGA/ASIC 平台的混合执行带来新的挑战。实现中的小改动可能会影响内存管理、设备之间的通信、同步和优化选择。

Halide

Halide 编译器[12]最初是为图像处理而设计的,神经网络与图像处理有许多相似之处。它们都是由许多操作组成的长计算序列组成,并且都结合了模板计算和流式程序的挑战。即使是经验丰富的工程师,也必须为每个复杂的操作手动地用 C、CUDA 或汇编编写优化流水线的数千行代码,才能达到峰值性能。优化的流水线无法移植到其他架构。考虑到这些方面,Halide 应用了高级抽象和高效的调度方法来提高可移植性和可组合性。

包括DSL、自动调度器和可移植到不同架构。

TVM

TVM 是一个端到端的全栈编译器框架,它将来自多个深度学习框架的深度神经网络高级规范,映射到针对多种硬件后端的低级优化代码。TVM 已经成为一个社区,吸引了许多开发人员基于 TVM 堆栈优化模型。

包括Relay、图级优化、算子级优化自动化和异构混合执行。

DLVM

DLVM 中的 IR 是一种基于图的模块化表示,具有一组抽象分层结构,包括模块、函数、基本块和指令。具体来说,每个模块包含类型定义和函数,每个函数包含由基本块形成的控制流图,每个基本块包含具有数据依赖关系的指令(DAG 形式)。DLVM 中的虚拟指令包括基本的细粒度数学算子,可分为 1) 元素算子(如 add 和 tanh)和 2) 复杂算子(如 dot 和 convolve)。DLVM 中的优化步骤包括代数简化、线性代数融合、矩阵乘法重排序和一些传统的编译器优化步骤。最终,DLVM IR 存在于比 BLAS 实现和 LLVM 代码生成计算核更低的一级。

TC(Tensor Comprehension)

在 GPU 上,预优化的库函数并行执行操作所实现的性能,取决于数据大小、数据布局和 GPU 的各种硬件特性。然而,创建一个涵盖这些特性组合的所有转换和优化,并利用跨算子优化库,是可行的。所有针对 GPU 的算法调度转换都应该在 Halide 中手动编写。较新的深度神经网络编译器如 XLA 和 Latte[36],即使考虑了数据大小和跨层优化,也不能轻易实现理想的吞吐量。

基于这些考虑,TC 提出一种可以有效描述算法富有表现力的 DSL。基于 DSL,编译流程将高级表示映射到polyhedral模型中,探索优化空间的调度,并自动生成高度优化的 GPU 代码。

包括:1)高级DSL和表征;2)polyhedral编译;3)自动调整。

注:polyhedral模型是一种数学框架,用于执行大量操作的程序——数量太大而无法明确列举——因此需要紧凑的表示。嵌套循环程序是典型但不是唯一的例子,该模型最常见的用途,是程序优化中的循环嵌套优化。


基于FPGA的专用加速器编译器功能可分为两类,即把神经网络映射到1)硬件块[4][5][18]和2)在硬件上执行的指令[17][19]。如图所示是这种编译器的通用架构:


fpga ConvNet 的编译器框架基于同步数据流(SDF)范式图[44],能够获得可预测的所需片上内存量,并提供静态执行策略。通过分析DNN模型的DAG与平台特定资源约束之间的交互,编译器将计算图转换为SDF硬件IR,其中每个节点代表一个硬件块。编译器将DNN模型平铺成各段,并为每个子图分别生成优化的硬件块。DNNWeavers编译器采用从Caffe生成的数据流图。当给定特定NN模型时,DNNWeaver利用自动资源优化算法,改变 1)每个PU的PE数量,和2)输出切片(slice)来最大化性能。此外,DNNWeaver 提供自定义 ISA,将加速器与不同的 FPGA 平台解耦。







请到「今天看啥」查看全文