Transformer推理的全栈优化:综述

23年2月来自伯克利分校和Nvidia的论文“Full Stack Optimization of Transformer Inference: a Survey“。

1 摘要

最先进神经网络架构设计的最新进展已经朝着Transformer模型的方向发展。这些模型在计算机视觉、自然语言处理和语音识别的广泛应用中实现了卓越的准确性。自从最初引入Transformer模型以来,这一趋势在过去几年中一直保持一致。然而,最近的Transformer模型推理所需的计算量和带宽正在以显著的速度增长,这使得它们在延迟敏感应用程序中的部署具有挑战性。因此,人们越来越关注提高Transformer模型的效率,方法从改变架构设计到开发专用的特定域加速器。这项工作调查高效Transformer推理的不同方法,包括:(i)分析和概述现有Transformer架构中的瓶颈及其与以前卷积模型的异同;(ii)Transformer架构对硬件的影响,包括非线性操作(如层归一化、Softmax和GELU)以及线性操作对硬件设计的影响;(iii)用于优化固定Transformer架构的方法;(iv)在为Transformer模型找到正确的映射和操作调度方面的挑战;以及(v)用神经结构搜索(NAS)调整结构来优化Transformer模型的方法。最后,通过在开源、全栈深度神经网络加速器生成器,Gemmini,之上应用综述的优化方法进行案例研究,并展示与Gemmini之前的基准测试结果相比,这些方法的每一种都可以产生改进。此外,上述方法的全栈协同设计方法可以实现高达88.7倍的加速,同时将Transformer推理的性能退化降至最低。

2 transformer模型架构和性能瓶颈

transformer架构高层概览

图示是Transformer编码器块的(左)多头注意(MHA)模块和(右)前馈网络(FFN)模块执行的计算图。

添加图片注释,不超过 140 字(可选)

下表是Transformer架构的配置参数。给出BERT Base、BERT Large和GPT-2(最小)的参数作为示例。请注意,GPT-2具有与BERT-Base相同的参数。序列长度可以是任何数字,只要不超过可能的最大序列长度。

添加图片注释,不超过 140 字(可选)

下表是Transformer模型中的线性运算。最后一列是矩阵乘法维度。𝑚 ×𝑛 ×𝑘 意味着输入尺寸𝑚 ×𝑛 和𝑛 ×𝑘, 输出维度𝑚 ×𝑘。注意,在多头方案中,act-to-act的矩阵乘法都重复h次。

添加图片注释,不超过 140 字(可选)

有几种非线性操作,如Softmax、LayerNorm和GELU,需要特殊的支持或芯片外计算。与线性运算相比,当使用Transformer网络进行推断时,这些非线性运算在总体运算中所占的比例相对较小。然而,与矩阵计算相比,在典型硬件上计算这些非线性运算更具挑战性,如果处理不当,它们可能会产生大量开销。

如图概述Softmax、LayerNorm和BatchNorm操作。由于它们依赖于运行时统计信息,LayerNorm和Softmax都需要对输入进行多次传递才能计算非线性运算。在Softmax的情况下,需要第一次通过输入来计算分母。对于LayerNorm,需要对输入进行三次传递:一次用于计算平均值;一个用于计算标准偏差;以及一个用于应用规范化。与LayerNorm和Softmax不同,BatchNorm只使用在训练过程中学习的统计数据,因此它只需要对输入进行一次传递。

添加图片注释,不超过 140 字(可选)

Transformer架构最初作为机器翻译任务的编码器-解码器模型引入[217]。在此设置中,编码器将整个源语言句子作为输入,并将其通过多个Transformer编码器块,提取输入句子的高级特征。然后,这些提取的特征被一个接一个地馈送到解码器中,解码器负责生成目标语言中的tokens。这是基于来自编码器的源语言特征以及它之前生成的tokens[217]。在随后的工作中,引入仅编码器和仅解码器的架构,分别从原始编码器-解码器架构[46,174]中仅取编码器和解码器组件,如图所示。

添加图片注释,不超过 140 字(可选)

模型分析

为了评估Transformer中的瓶颈,首先对计算Transformer仅编码器和仅解码器模型所需的浮点运算(FLOPs)数量以及这些网络的算术强度进行了建模。算术强度是从内存加载的每个字节可以执行的浮点运算数量。它可以通过将FLOPs的总数除以访问的字节总数(也称为MOPs或内存操作)来计算。

这里假设局部存储器足够大,可以将给定运算的两个矩阵完全保存在存储器中,因此计算出的算术强度值作为可实现的数据重用的上限。在计算FLOPs时,还分别计数MAC操作中的乘法和加法。

如图BERT Base和BERT Large编码器以及GPT-2解码器在不同序列长度上的FLOPs。FLOPs随着序列长度的二次缩放,这是由于act-to-act矩阵乘法以及Softmax函数中的二次伸缩。此外,推断BERT-Base编码器和GPT-2解码器(它们具有相同的模型架构)需要相似数量的FLOPs来处理相同的序列长度。

添加图片注释,不超过 140 字(可选)

如图BERT Base和BERT Large编码器以及GPT-2解码器在不同序列长度上的MOPs。由于act-to-act矩阵乘法以及Softmax函数的二次缩放,仅编码器模型的MOPs与序列长度成二次缩放。此外,GPT-2解码器需要比BERT基本编码器(具有相同的模型架构)多得多的MOPs,在每次token生成加载权重时处理相同的序列长度。

添加图片注释,不超过 140 字(可选)

BERT Base和BERT Large编码器以及GPT-2解码器在不同序列长度上的算术强度。算术强度最初增加,因为较大的矩阵维度允许每个加载的参数执行更多的计算。然而,在较高的序列长度下,算术强度会降低。这是因为,对于长序列长度,MHA模块的actt-to-act矩阵乘法和Softmax计算开始占主导地位。与FFN模块中的投影层相比,这些具有相对较低的算术强度。

添加图片注释,不超过 140 字(可选)

下表是序列长度为128、512和4096个tokens的BERT Base编码器的每层FLOPs、内存操作(MOPs)和算术强度。在低序列长度下,FLOPs和MOPs的主要贡献是MHA和FFN投影。对于较长的序列长度,act-to-act的矩阵乘法消耗更大比例的FLOPs,并且这些操作与Softmax一起消耗大多数MOPs。对于每个序列长度,act-to-act矩阵乘法也具有比MHA和FFN中的投影层更低的算术强度。

添加图片注释,不超过 140 字(可选)

如表是ResNet50的每层FLOPs、内存操作(MOPs)和算术强度。卷积消耗FLOPs的主要比例,但BatchNorm、ReLU和其他运算贡献MOPs的很大比例。

添加图片注释,不超过 140 字(可选)

下面两个图分别展示BERT Base和GPT-2的延迟分解如何随CPU上的序列长度而变化。这些细分表明,对于短序列长度(例如128-512),大多数计算在FFN模块的投影层中,而MHA计算的大部分在投影层中。然而,随着序列长度的增加,act-to-act的矩阵乘法开始占主导地位,因为它们都是按序列长度二次缩放的。

添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)

下图显示了BERT Base、BERT Large和GPT-2不同序列长度的归一化延迟。很明显,对于每个序列长度,GPT-2的延迟远长于BERT Base或BERT Large的延迟,尽管BERT Base和GPT-2具有基本相同的模型配置和端到端FLOPs。这主要是由于矩阵向量运算的算术强度较低。与算术强度较低的模型相比,具有较高算术强度的模型在具有相同(甚至可能更多)FLOPs的情况下可以更快地运行。这些观察结果证实了,解码器推理是一个内存约束问题,而不是计算约束问题。

添加图片注释,不超过 140 字(可选)

3 硬件设计

DNN加速器一览

典型的深度学习加速器有几个关键组件,如[27]所述:

  • •用于保持整个网络的权重和激活的片外DRAM,其需要足够大以保持所有模型权重和激活;
  • •较小的片上存储器,此处称为全局缓冲器,其需要足够大以容纳权重和输入的子集,以便馈送处理元件(PE);
  • •PE阵列,每个PE都具有执行MAC操作的能力,并且通常包含一个或多个称为寄存器文件(RF)的小型本地存储器,该存储器可以以比全局缓冲器更低的每次访问能量存储数据;
  • •在PE之间传输数据的内部片上网络(NoC)。

如图所示:全局缓冲器被设计为能够保持足够数量的权重和激活,以便允许数据重用并限制到芯片外DRAM和从芯片外DRAM传输的次数。PE中的本地存储器用于提供本地数据重用,以便尽可能减少全局缓冲器访问。在不重复使用的情况下,MAC操作需要加载三个参数,即正在相乘的两个输入值以及当前部分和(这是输出矩阵中给定位置的部分累积值),然后将输出值存储回存储器。这一点很重要,因为从能量的角度来看,存储器读取和写入的成本要高出几个数量级[87]。例如,对于一种特定的技术,从本地缓冲区读取的成本大约是单个MAC操作的6倍,从外部DRAM读取的成本约为200倍[206]。因此,为了减少执行的昂贵内存访问次数,利用重用机会至关重要。

添加图片注释,不超过 140 字(可选)

为了最大限度地提高数据重用性,有两大类数据流被广泛采用,它们被称为时间和空间数据流[27,38,206]。时间数据流包含一组中央控制的PE,这些PE从全局缓冲器加载数据,并在将数据写回全局缓冲器之前执行所请求的ALU(算术逻辑单元)操作。这些PE不包含本地存储器,并且PE之间没有通信或数据移动。这种类型的数据流中的数据重用只能通过全局缓冲区中的权重或部分和重用来实现。时间数据流的示例包括SIMD和单指令多线程(SIMT)执行单元。这些类型的单元通常用于CPU和GPU中的矢量处理。在时态体系结构中,全连通层和卷积层都被映射为矩阵-矩阵乘法运算。

在空间数据流中,PE可以通信,数据可以在PE之间移动,以利用数据重用,而无需从全局缓冲区重复读取。PE本身通常包含RF以在本地保持权重或部分和,以提高数据重用,并且可以通过在相邻PE之间传递数据来实现额外的重用。空间数据流通常用于基于FPGA和ASIC的加速器,尤其是卷积网络[38]。这些数据流允许跨多个维度重复使用数据,以大幅减少所需的内存访问。为了最大限度地提高空间数据流中的重用,已经采用了几种不同的重用方案:
•将权重保持在PE的局部RF并通过输入流传输,权重固定数据流最大限度地减少权重矩阵所需的读取次数[72];
•输出固定数据流累积PE中本地RF的输出,最大限度地减少读取和写入部分和的能量[59];
•没有本地重用数据流,每个PE中没有RF,并利用没有RF节省的面积来分配更大的全局缓冲区[34];
•行固定数据流通过在一行PE中保持一行权重固定、流入输入和流出部分和,最大限度地重用部分和和和权重[35]。

DNN加速器适配transformer

在为Transformer设计DNN加速器或改造现有的CNN加速器时,有几个关键考虑因素。

CNNs和Transformers的加速器之间的一个区别是,由于算术强度和矩阵维度方面的差异,这些模型对于存储器层次结构的每个级别都具有不同的最佳大小以及不同的存储器带宽要求。

另一个考虑因素是如何在推理过程中计算非线性函数,这给硬件设计带来了额外的挑战。这些操作要么需要对片上计算的专门支持,要么必须将它们卸载到CPU。用于Transformer推理的几个加速器包含用于非线性函数的专用后处理单元[107,148,166,209]。然而,增加一个额外的单元来支持这些操作也会增加加速器的面积。此外,设计硬件以有效地支持所需的非线性运算(例如,Softmax和LayerNorm)以及在未来的DNN中支持新的非线性运算可能是具有挑战性的。

数据路径设计也需要考虑,这取决于加速器是为MHA模块设计的还是为端到端Transformer推理设计的。专为MHA模块设计的加速器与MHA模块的数据流相匹配,所有操作都“融合”在一起,因此灵活性较低,但通过减少所需的内存访问次数,性能更好[64,79,80,223,237,253]。回想一下,操作融合是指直接使用一个操作(例如,矩阵乘法)的输出值作为下一个操作的输入(例如,Softmax层),而不将中间值写入片外存储器。MHA模块的几个加速器开发了具有独立单元的专用数据路径,用于Q × K、Softmax和注意得分×V等操作,更好地利用算子级融合。相比之下,用于端到端Transformer推理的加速器通常采用与Gemmini[70]类似的结构,其中它们在更通用的矩阵乘法引擎[107,148,166,209]中单独执行单个操作而设计得更灵活。这些加速器还尽可能融合操作以提高性能(例如,在将Softmax直接应用于矩阵乘法的累积输出后,再将其写入)。然而,整个图形学级数据流并不像MHA特定加速器那样在硬件中进行硬编码。

在这两种情况下,都存在非线性功能单元放置的数据流考虑因素。这是因为非线性运算通常具有大量的MOPs,尽管它们的FLOPs数很小,因此可以通过算子融合来提高整体算术强度(如在ResNet50的情况下)。在MHA模块的加速器的情况下,为了利用MHA模块中的算子级融合,必须适当放置Softmax单元,以便在Q×K相乘之后和注意得分×V相乘之前进行计算。例如,[64]将Softmax单元放在Q× K和注意分数×V乘法的专用单元之间,并在单独的硬件模块中计算LayerNorm。放置功能单元支持算子融合提供了更高的效率,但这是以更少的灵活性为代价的,因为架构现在对算子级数据流进行了假设。

在推断DNN基准时,分析建模(Analytic modeling)是识别瓶颈的有用工具,因为它可以快速估计目标硬件平台上的运行行为。在设计时,很难分析基准工作负载的运行行为以及硬件体系结构变化对性能的潜在影响。可以直接在实际硬件(例如CPU)上进行分析。在分析很困难或不可行的情况下,分析建模可以提供估计,快速指导设计决策。

实例研究:Transformer加速器

这里开发一个分析模型,演示它如何有助于理解硬件加速器上Transformer推理的性能分解。分析模型基于Gemmini驱动的架构[70]。其结构以及可调参数如图所示。该模型包括局部存储器、用于计算平铺矩阵-矩阵乘法的PE阵列,并且它依赖于外部存储器来存储所有模型参数。性能估计假设计算时间和内存操作时间可以完全重叠,并且每次操作的总和是这两者中的最大值。请注意,暂存器(scratchpad)中假设双重缓冲,确保计算可以尽可能与内存读/写重叠。该模型结构与典型的DNN加速器相当,值得注意的是,所包含的特殊功能单元(SFU)能够计算所有所需的非线性运算,因此这些运算都不必在芯片外计算。该模型还假设W-PE阵列的周期延迟,其中W是PE阵列的宽度,以及SFU每个向量的1-周期延迟。

添加图片注释,不超过 140 字(可选)

从Gemmini[70]加速器生成器生成的一个相当典型的CNN加速器开始,该加速器主要针对类似ResNet50的工作负载进行了优化,下面对该加速器及其软件堆栈做更改,有效支持BERT等Transformer工作负载。用于端到端Trans-former推理的几个加速器采用了与Gemmini和分析模型类似的结构,并且还包含用于非线性函数的专用后处理单元[107,148,166,209]。

首先生成一个相当典型的CNN加速器,如图所示,使用Gemmini加速器生成器。加速器使用16×16脉动阵列执行矩阵乘法,该阵列实现了权重平稳数据流。当执行卷积时,输出通道和输入通道维度在空间上展开。8位整数权重和输入存储在256kB的本地暂存存储器中,32位部分和,会存储在执行矩阵加法的双端口64kB累加器SRAM中。当DNN层太大而无法放入本地暂存区时,它们会回落到与片上系统(SoC)的CPU和其他加速器共享的外部L2缓存和DRAM上。主机CPU平铺这些层以计算完整输出。

添加图片注释,不超过 140 字(可选)

尽管CNN的大多数FLOPs都用于计算矩阵乘法或卷积,但基准Gemmini生成的加速器也包含用于执行ReLU和最大池化运算的外围电路,以及用于将32位部分和进行缩放为8位输入整数浮点乘法器,这些输入可以馈送到CNN的下一层。对这些操作的本地支持很重要,因为它消除了在DRAM或外部高速缓存(CPU可以在其中执行这些操作)和本地暂存区(Gemmini存储其矩阵操作数的地方)之间来回传输的昂贵需求。

此基线CNN加速器不包括任何特定于Transformer的功能。特别是,不支持非线性规范化操作,如LayerNorm或Softmax。也不支持GELU,一种相对昂贵的非线性激活函数,通常使用昂贵的查找表来实现。相反,这种基线设计是为量化整数CNN推理而设计和优化的加速器典型示例。它在端到端CNN工作负载(如ResNet50[82]、SqueezeNet[93]或MobileNetV2[188])上实现实时或接近实时的性能,但由于需要在CPU上执行GELU、LayerNorm和Softmax等操作,在Transformer工作负载(例如BERT)上的性能受到严重限制。

基线CNN加速器在执行BERT推断时,其功能单元的利用率远低于1%。尽管单个矩阵乘法实现了74%的利用率,但加速器本机不支持的操作(如LayerNorm)会显著降低性能,因为它们必须由CPU执行。事实上,如图显示96%的执行用于非矩阵乘法操作。在序列长度为512的BERT推理过程中,当在(图左)基线CNN加速器上运行时,以及在(图中)加速器上使用I-BERT的Transformer硬件/软件功能扩展后,可以看到在不同操作花费的时间。请注意,有了I-BERT支持,不再需要量化和去量化操作,因为所有操作都以整数格式进行。(图右)还有看到的,更改后在不同序列长度的不同操作花费的时间。对于所有序列长度,总执行时间由matmul支配。在Transformer推理中,超过99%的FLOPs是矩阵乘法的MAC,因此除非进行进一步的优化,否则基线加速器运行中每个操作所消耗的时间远未达到理论理想。

添加图片注释,不超过 140 字(可选)

此外,基线加速器将GELU和Soft-max操作卸载到主机CPU,主机CPU使用浮点单元执行这些操作。如图所示,浮点加法器或乘法器消耗的能量比整数部分多几个数量级。在基线CNN加速器中,使用INT8输入执行矩阵乘法,但这些必须在要在CPU上执行的浮点激活的矩阵乘法操作之间进行去量化和重新量化,这进一步增加了能量和延迟开销。这里(图左)显示Titan RTX和A100 GPU上不同比特精度逻辑的峰值吞吐量之间的比较。还有(右)45nm技术不同精度对应的能量成本和相对面积成本的比较[87]。正如人们所看到的,较低的精度提供了指数级更好的能量效率和更高的吞吐量。

添加图片注释,不超过 140 字(可选)

最后,通常必须根据运行在专用硬件加速器上的工作负载仔细调整其内存层次结构。CNN主要执行卷积,卷积具有非常高的算术强度,而Transformers主要执行矩阵乘法,通常使用小矩阵和/或矩形矩阵,算术强度明显较低,并采用不同的最优平铺策略。例如,MHA模块的低算术强度。这表明,基线CNN加速器的内存层次结构和内存带宽应该重新调整,以实现更高效的Transformer推理。

Transformer 矩阵乘法(特别是act-to-act)通常具有与CNN中的卷积层非常不同的形状和算术强度。如图所示是在基线CNN加速器上执行BERT基础推理时的矩阵乘法利用率,具有不同的暂存器和累加器大小,可见简单地调整输入/权重暂存器和32位部分累加器的大小,可以显著提高BERT的矩阵乘法运算的性能。更大的累加器可以实现更高的输出重用,这更适合于Transformer中的几个矩阵乘法。Q×K的矩阵乘法尤其具有𝑙 ×𝑙 输出激活矩阵,对于长序列长度,它比𝑙 ×𝑑/h输入Q和K矩阵。因此,增加累积缓冲区大小允许通过这些操作改进输出重用。

添加图片注释,不超过 140 字(可选)

鉴于这一观察结果,将基线加速器的共享输入/权重暂存区的大小从256kB减少到64kB,并将部分和的累加器大小从64kB增加到256kB。这不涉及SRAM总容量的增加,也几乎不涉及加速器总面积的变化。然而,这些变化使总矩阵乘法延迟减少了36%。

矩阵乘法matmul是Transformer工作负载中占主导地位的内核,但即使在基线CNN加速器上最大限度地提高了矩阵乘法matmul的性能,它仍然无法实现1%以上的利用率。这是由于CPU卸载的非线性操作开销。实际上只有1%的时间花在了matmul上。其余部分用于浮点非线性激活、归一化或量化和去量化操作,因为它们被卸载到CPU。

为了减轻运行时量化和去量化的开销,将基线Transformer工作负载从仅量化矩阵的简单BERT实现切换到称为I-BERT[111]的仅整数BERT变型。I-BERT的主要思想是用整数多项式近似代替GELU和Softmax等浮点非线性运算,这样它们在专用硬件加速器中实现既更快又更便宜。
为了合并I-BERT,在基线CNN加速器中添加了I-BERT的GELU、LayerNorm和Softmax变型的新整数实现。累加器中的32位矩阵乘法matmul结果被馈送到新添加的“归一化单元”中,该单元计算和、平方和、最大值以及LayerNorm和Softmax使用的其他折扣。需要多次通过累加器读取来计算这些操作中的所有减少。例如,在使用总和计算方差之前,首先计算总和。然后,最后一次读取累加器中的矩阵乘法matmul结果,将其输入一组16个激活单元,这些激活单元并行计算I-BERT的GELU、LayerNorm或Softmax变型。

有了这些新功能,整体端到端BERT推理性能比基线加速器的初始性能提高了39.6倍。计算瓶颈再次改到矩阵而不是归一化或激活函数;并且这种趋势在不同的序列长度上持续存在。量化和去量化不再是必要的,因为非线性浮点运算被I-BERT的整数多项式近似所取代。还要注意,GELU操作现在可以与前面的矩阵乘法matmul简单地融合,使它们成为一个流水线操作。当与ASAP7 PDK[45]合成时,新的硬件单元仅使加速器的总面积消耗增加了14%,而GELU、LayerNorm和Softmax操作仅使BERT推理的功耗增加了9.3%。

总之,在理想情况下,非线性运算不一定会增加Transformer加速器的总FLOPs、面积或功耗。然而,在实践中可能并非如此,尤其是当计算被卸载到CPU时,会导致不小的延迟影响。这可以使用LayerNorm、Softmax和GELU的I-BERT实现来解决,只会将Transformer加速器的面积增加5-15%,并使总延迟增加8%。

4 模型优化

量化

DNN模型通常使用高精度浮点计算进行训练。然而,高精度的算术对于推理来说往往是不必要的。量化是一种通过用低位表示参数和/或激活来压缩DNN模型的过程,通常(但不一定)是定点表示,如8位整数(INT8),而不是32位或16位浮点(FP32或FP16)。

量化为有效的DNN推理提供了多种好处。降低精度的一个明显优点是减少了内存消耗。例如,将模型权重从FP32量化为INT8会导致模型大小减小4倍。这导致在不修改DNN加速器的情况下减少片外存储和带宽。此外,量化激活还允许减少存储器流量和中间部分结果的存储。考虑到精度差异,还可以通过存储更多数量的参数(因为每个参数现在消耗更少的存储空间)来允许更大的局部重用,或者通过在保持相同数量的局部数据重用的同时使用更小的内部缓冲区来重新构造存储器层次结构。

量化模型权重和活动的第二个优点是减少了ALU和相应PE的大小、延迟和能耗。一般来说,浮点ALU在面积、延迟和能耗方面往往不如整数ALU高效。这是因为在执行单个乘法运算时,浮点PE需要乘以尾数、相加指数,并对指数进行左移以获得最终结果,而定点PE只需要乘法单元。出于这个原因,现代GPU和TPU通常包含INT8处理这个路径[43100],这可以显著受益于量化。例如,与FP32对应物相比,执行INT8添加可以提高~30倍的能效和~120倍的面积效率。

量化的另一个关键应用是在纯整数硬件上进行模型部署。一些用于低成本和节能嵌入式设备的边缘处理器,如ARM Cortex-M内核[12]和GAP-8[66],不包括专用浮点单元。在这些处理器上部署模型时,不仅必须量化模型权重和激活,而且所有计算都必须仅使用整数运算。否则,部署是不可能的,或者由于需要在芯片外处理非整数运算而导致相当大的开销。这将导致向通用主机处理器传输数据的额外延迟和能耗。这种使用整数算术计算出整个推理的量化技术被称为仅整数量化[97,110,111,132,141]。仅整数量化在Gemmini上将端到端推理延迟减少了39.6倍。

量化方法可以大致分为均匀量化和非均匀量化,这取决于它们如何映射值。均匀量化将浮点域拆分为均匀间隔的区间,并将每个区间映射为单个固定点值。这可以从一个简单的算术规则中获得:

Q®=Int(r/s)+Z

其中Q是量化操作,r是浮点值,s是一个比例因子,并且Z是一个转变因素。另一方面,非均匀量化不要求区间均匀分布。通过为重要区域分配更多的量化bin,通常会提高压缩率,非均匀量化可以比均匀量化更准确地捕捉浮点域中的原始数据分布。然而,在通用计算硬件上有效地部署非均匀量化模型通常更具挑战性。因此,由于简单性和到硬件的有效映射,均匀量化是目前事实上的方法。

虽然较低的比特量化可以带来更好的压缩率,但过于激进地降低精度会显著降低模型的精度。因此,至关重要的是,通过降低精度来实现性能增益与主要模型精度之间的平衡。缓解这一问题的一个有希望策略是混合精度量化。从先前的工作[55,195,224,229]中可知,模型中的不同层对量化表现出不同的敏感性,并且将更高的比特精度分配给更敏感的层是至关重要的。具有混合精度的量化transformer著名工作,包括使用Hessian信息(即曲率)作为灵敏度代理的Q-BERT[195],以及应用强化学习(RL)来学习每层适当的比特精度的HAT[222]。

量化预训练Transformer模型的另一个挑战是激活中存在异常值[117]。均匀量化试图将从最小可能值到最大可能值的范围划分为多个区间,这可能会导致显著的性能下降。这是因为更多的值被映射到相同的量化值(即,分辨率下降),这是由于扩展了每个量化bin间隔的异常值。虽然非均匀量化可以解决异常值问题[246],但也提出了一种均匀量化方案[51],该方案为是异常值的激活分配更大的比特精度。此外,最近引入的FP8精度[156]在设置指数位精度方面提供了额外的自由度,已被发现是量化模型的合适解决方案,该模型的整数量化由于异常值的存在而导致精度降低[121]。

稀疏

稀疏(也称为剪枝)是通过去除冗余/不敏感参数使DNN模型稀疏的过程。虽然拥有一个密集的模型可能是成功训练模型所必需的,但在模型训练完成后,也可以在没有任何质量下降的情况下删除许多参数。

从广义上讲,裁剪可以分为两个分支:非结构化裁剪和结构化裁剪。非结构化裁剪允许参数和特征映射的任意稀疏化模式。理论上,它可以在不降低精度的情况下产生显著的计算节省[136]。然而,在硬件中有效地利用非结构化修剪可能具有挑战性。为了有效地存储数据而不存储空(即零)参数,压缩内存格式是必要的。此外,必须调整计算单元,使其能够直接对压缩数据进行操作。否则,必须在计算之前解压缩参数,然后在计算之后重新压缩参数,从而导致额外的开销。由于这些原因,商业化的DNN加速器可能无法有效地利用非结构化稀疏模式。

结构化裁剪通过严格删除结构化的参数集来规避这些限制。例如,在Transformer中,线性层中的行和列、注意头[155],甚至整个层[63,186]都可以进行结构修剪。最近的研究进一步将不同架构组件的结构化修剪整合到一个框架中(例如,将MHA模块的注意头和FFN模块中的滤波器一起裁剪)[88, 123, 145, 233]。

这种结构化的裁剪方法会立即产生比原来更小的密集的矩阵乘法matmuls,从而不需要压缩内存格式或特殊的硬件支持来获得内存减少和延迟改进。然而,压缩率可能不如非结构化裁剪好。研究表明,最先进的非结构化修剪方法[120]可以修剪BERT[52]中高达90%的参数,而在MNLI基准上没有任何性能下降[226],而最先进的结构化修剪方法[233]只能通过修剪高达70%的参数来实现相同的性能。

虽然上述修剪方法属于权重修剪,但激活的修剪(即动态修剪)也可以应用于在运行时动态检测和清除不重要的激活。在Transformer推理中,激活裁剪的一个流行分支是token裁剪[74,108,113,150,223],它检测并从其余推理中删除每个Transformer层中不太重要的token。其基本原理是,并非所有token(例如,NLP任务中的单词)对于理解输入序列的含义都是必要的。通过减少Transformer需要处理的序列长度,这些方法已经证明在所需的计算总数中减少了高达30 - 50%,而不会导致NLP基准中的准确性明显下降[181,220]。然而,加速这种动态稀疏模式可能是一个挑战,因为它需要检测逻辑来动态确定非零的位置。因此,在很多情况下,动态稀疏性需要同时设计算法和硬件。

无论使用何种裁剪方法,主要关注的是确定哪些权重应该保留,哪些应该删除,以便在不牺牲其性能的情况下提高神经网络的效率。常用的transformer裁剪方法包括:

  • 幅度修剪[68]是一种使用每个权重的绝对值作为其重要性的代理的技术。它在训练过程中以最小的幅度修剪权重。这种方法背后的基本原理是,较小的权重对模型的最终结果贡献较小。
  • 运动裁剪[124,189]是一种考虑了微调过程中权重变化的技术,随着微调过程的进行,对远离零的权重赋予更大的重要分数。对于使用预训练和微调方案(例如BERT b[52])训练的模型,该技术已被发现比幅度裁剪更有效,因为随着微调过程的进行,它更好地捕获了权重的重要性。
  • 一阶裁剪[155]使用相对于流入权重或一组权重的损失的梯度作为评估模型准确性重要性的代理。这种方法认为梯度是参数归零对损失影响的一个指标。该方案得到了进一步改进[88],其中使用权重大小和梯度的乘积作为重要性的代表,因为它可能更准确地估计权重归零的影响。
  • 二阶裁剪[120,123,245]使用相对于损失的权重或一组权重的Hessian矩阵作为代理重要性度量。与一阶信息相比,二阶信息通常被认为是去除权重效果的更准确的指标。然而,由于Hessian矩阵的大小很大,它随着权重的数量呈二次增长,因此有必要采用适当的可扩展近似,通常使用随机化数值线性代数算法[57,242]。

裁剪的主要优点之一是减少内存占用。通过结构化裁剪,内存效率的提高是显而易见的,它直接减少了矩阵乘法的大小和/或数量。相反,非结构化裁剪通常需要使用稀疏编码(也称为稀疏存储格式)来压缩和存储稀疏数据。这些方法用元数据来编码矩阵中非零条目的位置,从而使用更少的内存[27,47]。稀疏编码可以减少片外内存消耗和相应的所需内存流量。它们还可以减少芯片上所需的存储大小,从而允许更小的缓冲区,或者增加重用。这是因为,尽管可以在缓冲区中存储相同数量的数据,但编码的数据对应于全尺寸输入张量的更大比例。

由于消除了不必要的计算,裁剪还可以减少能耗和延迟。这是通过结构化修剪相对简单地实现的,但是非结构化裁剪需要特殊的技术来识别和绕过涉及零NULL元素的计算[8,9,35,164,248,251]。这可能涉及识别和跳过单个元素或整个空向量。一些检测和跳过方法只是通过不执行涉及NULL元素的操作来节省能量。也就是说,PE不必用于NULL计算,在这种情况下,它可以避免能耗。其他方法还通过为跳过的PE分配不同的有效计算来减少延迟,而不是让它们为无效的计算闲置周期。此外,为了使用非结构化稀疏规则维持PE利用率,可能还需要执行负载平衡。由于PE之间的零分布可能不平衡,因此一些PE可能需要比其他PE更长的执行时间,从而导致其他PE的空闲等待期。一些研究使用负载平衡来加速具有非结构化稀疏性的神经网络[81,119,147]。

Transformer特有的优化方法

一些工作旨在优化MHA模块中的注意机制。回想一下,在MHA模块中执行矩阵乘法所花费的时间随着长序列的序列长度呈二次增长。因此,对于长序列,计算注意成为整个运行时的主要部分。更有效地计算注意网络的一种常见方法是token裁剪。这包括删除不重要的token,减少有效的序列长度。有效地识别和删除不重要的token的需求导致了几种硬件软件协同设计方法。在SpAtten[223]中,token根据从输入句子中的其他token获得的关注量进行排名,并且收到较少关注的token被删掉。这种方法基于一个简单的原理,即一个词被关注的越多,它在推理过程中就越重要。为了提高效率,采用了top-k硬件引擎,根据注意得分过滤掉低重要性的token。DTA-Trans[237]进一步引入了两轮方案,第一轮确定应该修剪哪些token,第二轮进一步确定分配给每个剩余token的精度。

另一种加速注意的方法是利用注意分数激活的动态稀疏模式[79, 80, 131, 147, 172, 194, 204, 253]。假设Q和K token的许多组合在语义上没有意义是合理的,因此与此组合相关的注意分数将接近于零。通过利用这种稀疏性,可以保持推理精度,同时通过避免相关的act-to-act矩阵乘法(即Q× K或注意分数×V)来降低计算成本。然而,这需要专门的硬件逻辑来实时检测和加速这些动态稀疏模式。例如,ELSA[80]提出了一种近似K和Q向量之间的角度相似性的数据路径,从而可以预测它们的点积是否可能为零。这种方法允许提前相对于给定的查询向量裁剪不太重要的K向量。Sanger框架[147]建议在计算注意分数之前对Q和K进行量化,因为这将使结果注意分数中不重要的条目归零,如果这些值没有量化,这些条目将接近于零。类似地,DOTA[172]提出用Q和K值的低秩(因此更小)投影矩阵乘法来近似要归零的注意分条目。LeOPArd[131]使用位串行计算进行Q×K乘法,以便在未达到预先确定的阈值时提前终止计算。

值得注意的是,硬件支持对于加速注意机制至关重要,因为它支持诸如top-k[223,237]、角度近似[80]、聚类[204]和多精度计算[13,147,172,253] 等操作,这些操作对于检测注意分数的动态稀疏模式是必要的。此外,需要专门的硬件支持来利用跳连接计算的动态稀疏性(主要是非结构化的)。例如,Sanger[147]通过拆分和打包使用负载再平衡,并配备了自定义数据路径,该路径既支持采样的稠密矩阵乘法matmuls,也支持稀疏矩阵乘法matmuls。

Transformer架构包含多个非线性函数,这对高效硬件设计构成了多重挑战。

一种流行的解决方案是函数近似[107, 111, 132, 203, 223],它寻求近似非线性函数的确切值,获得良好的计算效率高的近似。例如,Keller[107]使用Softermax[203]函数,用基数为2的近似值,将Softmax操作指数计算中使用的基数从e转换为2,从而简化了硬件实现。Softermax[203]还集成在线归一化[157],从而将数次数从3减少到2。I-BERT[111]提供了一种更一般的近似算法,用二阶多项式近似非线性运算。这不仅简化了操作,而且还允许仅使用整数运算来执行操作。SpAtten[223]采用了类似的方法,使用五阶泰勒近似来计算Softmax,如[160]所述。I-ViT[132]进一步扩展了这一思想,使用硬件友好的位移位操作来有效地计算视觉Transformer推理的非线性运算。虽然主要的焦点是接近Softmax的指数运算,但其他方法[19, 209, 225]也利用了log sum-exp技巧来避免除法运算,这是另一种在硬件中实现起来很复杂的运算。

另一种广泛采用的方法是查找表,它为给定的输入范围存储预先计算的输出值。如果给定了输入,则输出存储在查找表中的相应值,从而消除对函数求值的需要。使用查找表来加速非线性函数绝不是一个新概念,其根源早于Transformer或DNN架构的出现[50, 212]。因此,最近的方法更侧重于减少查找表的大小,节省面积和延迟。例如, [79]将指数运算分解为两个较小精度指数运算的乘法,从而允许一个较大的查找表被两个较小的查找表所取代。NN-LUT[244]使用单隐层网络近似非线性操作,并将网络的数值近似存储在查找表中,从而避免了执行网络的需要。

生成推理的Transformer解码可能会导致显著的推理延迟。由于大语言模型的最新进展,对生成任务的兴趣越来越大[2, 22, 44, 213],因此优化解码过程的延迟至关重要。减少推理延迟的一个途径是通过提前退出跳过不必要的计算。该方法通过在中间层终止推理并使用中间隐藏状态进行预测,而不是等到最后一层,动态地调整每个token生成的解码器深度。虽然作为编码器模型的一种技术[192,234],但CALM[191]直到最近才将这种方法扩展到解码器模型。解码任务中的一个主要挑战是,与编码任务不同,由于注意机制,一个token的生成依赖于所有先前token的激活。如果先前的token提前退出,那么就没有必要关注跳过的层。为了解决这个问题,CALM提出“状态传播”,它在退出之前将最后一层的激活复制到所有跳过的层。这对生成质量的影响很小。

最近的另一种尝试是协作使用不同尺寸的多个模型[31,112]。潜在的动机是,大多数简单的单词生成可以卸载到一个更快、更小尺寸、更不准确的模型上。偶尔,当小模型无法准确预测一个单词时,它会将控制切换到更大的模型以进行更准确的预测。这种方法不仅可以减少大模型的执行频率,而且还可以实现非自回归(即token级并行)执行,因为它可以消耗小模型生成的所有token而且并行处理它们,从而更有效地利用硬件。Big Little Decoder[112]在不影响生成质量的情况下,在各种模型和生成任务中显示出约2倍的推理延迟减少。

需要注意的是,这些优化方法的很大一部分依赖于底层硬件支持。因此,在选择使用哪种优化技术时,必须采用硬件和软件堆栈的整体视图,并考虑底层硬件的特征。特别是,加速器是否支持相同数据路径中的MHA和FFN模块,而不是为每个模块包含单独的数据路径,会对可以执行的优化产生重大影响。

具有统一数据路径的加速器倾向于追求更通用的优化,这些优化既可以应用于MHA和FFN模块,也可以至少应用于那些不需要更改数据路径(这样就不能再计算其他模块)的优化。例如,一些同时支持MHA和FFN模块的加速器对权重矩阵采用一般的静态裁剪方法[65,166,209],但并不打算利用特定注意的剪枝方法,如动态稀疏性。但是,如果MHA和FFN模块在单独的数据路径中计算,或者PE可以重新配置,则可以分别对它们进行更特殊的优化。例如,FABNet[64]利用静态稀疏模式,这种模式只能为MHA和FFN模块采用单独的数据路径来应用于FFN模块。FTRANS[127]还对MHA和FFN模块应用了不同的优化方法,通过合并可重构的PE,这些PE可以处理两种工作负载,而无需两个单独的数据路径。但是,与使用通用的统一数据路径相比,使用单独的数据路径或可重构PE可能会产生额外的开销。因此,需要在面积开销和使用更积极的优化所获得的性能增益之间进行权衡。

5 Transformer映射到硬件

什么是映射?

映射或调度被定义为在特定目标硬件架构上执行一组操作的硬件指令序列。在脉动阵列加速器(如GEMMINI)的情况下,此类硬件指令可能包括特定数据流下的密集矩阵乘法,以及在片外DRAM和本地sram之间移动数据的加载/存储。映射将列出数据和内存指令的完整序列,其最终目标是生成可在硬件上执行的源代码或编译后的二进制文件。对于某些操作,可能存在多个有效映射,其中有效性指的是保证执行每个映射的正确性。具体来说,应用于相同问题的不同映射决策集可能会产生有效但不同的映射。我们将映射决策的总空间及其结果映射称为映射空间。

当根据延迟、带宽和能耗进行测量时,两个不同的有效映射可能在端到端性能方面表现出差异,这并不奇怪。因此,映射或调度框架的目标通常是为给定的软件操作和期望的性能度量获得最优的、有效的映射。对于某些操作,没有必要寻找一个好的映射,这可能是因为问题微不足道(因为映射空间很小),也可能是因为操作本身不是性能瓶颈,不需要进行明智的调度。然而,在DNN(包括Transformer)的核心计算算子的情况下,映射问题既具有挑战性,因为映射空间很大,又有回报,因为整体模型执行速度的潜在收益。

如下两个图分别举例说明了CNN和Transformer的关键算子及其可能的映射。

如图映射示例所示,嵌套循环的每一层必须是:(1)指定用DRAM或本地加速存储器中的数据执行;(2)如果加速器包含空间并行化的计算资源,则分配给空间(即并行)或时间(即顺序)执行;(3)指定作为一个循环执行或平铺到多个子循环(如果是,与哪个平铺因素)。特别是,对于Gemmini的情况,空间映射涉及分配在PE的n × n脉动数组网格上执行哪些循环级别的决定。

添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)

什么是关键映射的决策?

映射分为两个步骤。首先,将图在图级转换为一组张量操作。这可能涉及到融合连续操作,稀疏张量,并决定适当的量化策略。然后,将每个生成的张量操作进行调度,以便将其转换为适当大小的硬件指令。

图级调度涉及改变计算图结构的决策,而不仅仅是图中单个节点表示的张量操作的执行调度。典型的变化包括:

  • 层融合或操作融合是指将多个层(例如,一个矩阵乘法之后是一个归一化层)组合成一个张量操作,并在加速器上调度和运行。这减少了层间通信,因为一层的结果可以作为输入保留在芯片上,而不需要写入并稍后从主存中读取,牺牲层内通信为代价。层融合可能不会像CNN架构那样提供那么多的延迟改进,因为静态融合的机会不像使用BatchNorm层融合卷积那么简单。对于Transformer,可以在同一个核中组合多个操作,但这可能会增加层内通信,使这种方法变得不可行的程度。此外,这还可能取决于目标硬件平台。
  • 当基于激活映射做出裁剪决策时,就会发生张量的动态稀疏化。常用的动态稀疏化方法包括LSH(locality-sensitive hashing),将可能很小的点积归零。这可以显着减少运算中所需的算术运算的数量。这种优化在很大程度上依赖于数据,因为它们需要访问激活,因此不能总是先验地估计[103]。因此,存在相对较少的关于稀疏性感知映射的结果,并且这些结果主要涵盖给定稀疏性数量的操作级映射。
  • 当剪枝决策与激活无关并且静态确定时,就会发生张量的静态稀疏化,有各种用于静态稀疏化的方法。一般来说,结构化稀疏性导致高加速,但它也经常导致严重的精度下降,而非结构化稀疏性即使在极端稀疏性水平下也能够保持精度,但很难加速。然而,后者将变得越来越重要,因为它减少了内存流量,而内存流量正在成为功耗的主要瓶颈。

算子调度步骤将张量操作分解为一组在给定架构上运行的任务。这包括几个不同的步骤,每个步骤都向程序员提出一个决策问题。这些包括:将算子划分为多个tiles,适应内存层次结构的不同层;tiles的尺寸是一个选择。确定计算的数据流,即执行tile的顺序以及在处理器中保持静止或移动的张量。这可以被编码为循环排序问题,其中最内层的循环对应于保持静止的张量轴。决定哪些轴要并行化,哪些轴要连续运行,称之为时空映射。决定如何交错通信和计算,以尽量减少延迟。例如,双缓冲可以将暂存器分成两半,其中一半由处理器用于计算,而另一半则装载来自内存的数据。将算术指令映射到硬件指令。对于某些体系结构,这可能非常简单,只需将适当大小的矩阵乘法matmul操作(通过平铺实现)替换为对适当的ISA(指令集结构)指令的调用。对于其他人来说,它可能涉及在不同的矢量指令之间进行选择,这可能会影响对哪个轴进行矢量化的决定,以及由此产生的时空映射。

映射空间中点的选择严重影响性能,影响程度可达几个数量级。出于这个原因,硬件映射器的目标是在这个空间中选择一个点,以最小化给定硬件目标上的一些成本,如能量、能量-延迟积(EDP,energy-delay product)、延迟等。然而,映射空间的大小使探索变得困难。例如,仅考虑平铺、时空映射和循环排序(数据流),BERT注意层的可能映射数量可能超过10^12个。因此,映射的设计和选择在理论和实践中都受到了极大的关注。

此外,根据硬件架构的不同,最优映射可能会有很大的不同,对于一组硬件参数工作良好的映射通常在其他硬件参数上表现不佳[103]。这大大增加了在协同设计上下文中进行映射的难度,因为必须为每一对神经网络和硬件体系结构进行计算。

寻找性能映射

为了处理搜索空间的大小,许多加速器-觉察映射技术[84、92、102、129、163、239]和成熟的编译器框架[3、32、33、114、161、167、185]已经被开发出来。

为了处理搜索空间的大小,映射算法关注于映射空间的子空间,仅决定如何执行将网络映射到体系结构所需的步骤子集。

大多数现有的ML编译器框架(如XLA[185]、TensorRT[161]、TVM[33]、Glow[184]和CuDNN[41])的目标是图级优化,如算子融合、资源分配、图分区、图重写等。已经开发了大量的操作融合技术[10,247,252]来优化映射,以便在DNN层之间实现更多的数据重用。其中,[42, 168]已经提出了一些transformer特定的操作融合技术。特别是,[42]分解了Softmax层,并将分解层的GPU核与MHA块中的前一层和后一层动态融合。相关文献[168]表明,融合LayerNorm层和由小矩阵乘法组成大矩阵乘法,有利于GPU上的性能转换。在[104]中,引入了DNN加速器的优化数据流,有效地融合MHA中的关键矩阵乘法层和Softmax层。为了解Gemmini 加速器的操作融合权衡,进行一个案例研究。
在空间中选择一个好的点是实现ML加速器高效率和利用率的关键。在给定的子空间范围内,映射器通常可以根据其决策方式分为三大类:暴力搜索、基于反馈的搜索、约束优化。下表总结了利用不同技术导航映射空间的现有映射器。

添加图片注释,不超过 140 字(可选)

暴力方法[29, 48, 163, 239]需要各种采样策略,这些策略要么详尽地探索,要么随机地从映射空间中抽取大量的点。为了降低穷举搜索成本,这类映射器通常依赖于开发人员的启发式方法来精简映射空间,并使用轻量级性能模型来比较所有有效映射,以便在合理的时间内找到最佳映射。这种方法的缺点是双重的:暴力搜索不仅会非常昂贵,特别是对于更复杂的目标工作负载和硬件架构;但是,对于任何目标工作负载或加速器架构更改,这个代价高昂的过程也会重复,而不会利用任何先前的知识。

反馈驱动的方法使用ML算法或其他统计方法[7, 33, 99, 179]来提高成本模型的准确性,或者直接使用黑盒子调优来搜索解决方案。尽管可以潜在地准确地学习调度空间,由于学习模型所需评估调度的成本以及基于算法的学习成本,这些方法计算成本非常高。因此,通常适用于现有的硬件或分析模型,其中大规模测量是可行的。

约束优化方法与穷举搜索和基于学习的算法形成对比,其将调度问题表述为一个数值优化问题,在给定一组约束和目标函数下确定变量分配。流行的技术,如混合整数规划(MIP),已经证明在解决大规模和复杂问题方面的适用性。特别是,polyhedral优化利用基于约束优化的方法进行自动矢量化和循环平铺[5, 6, 15, 21, 75, 116, 165]。这些polyhedral优化侧重于测试一个转换的可行性,并提供指导迭代搜索的信息。另一方面,[92, 129]利用机器学习工作负载和硬件的规律将映射制定为优化问题,然后可以通过现成的求解器直接解决。

映射的性能模型

性能模型可以为映射器提供针对不同映射的性能反馈,而无需在实际硬件上执行映射或在开发中的加速器上运行模拟。它们可以显著降低映射器的评估成本,并用作优化映射的性能代理。不同的性能模型提供不同级别的保真度、运行时成本、目标工作负载范围和各种映射算法的兼容性。性能模型的选择取决于映射器和目标工作负载。

对于Transformer,映射器可以使用特定于域的多项式[92]和解析模型[122, 146, 153, 163]来提供映射之间的快速比较。这些模型利用张量代数工作负载中的已知迭代空间边界,以及静态可分析的数据访问模式来估计性能。用数学形式表示的多项式模型也可以直接用作基于优化的映射器的目标。另一类流行的性能模型涉及数据驱动的机器学习模型[33, 84, 106]。这些模型不是解析地构建性能模型来表示映射决策和性能之间的已知关系,而是使用统计技术来迭代地将模型拟合到随时间收集的映射性能数据。它们通常需要大量的数据来学习和提供准确的预测。经过训练后,它们可以很容易地与基于ML的映射器集成[84, 199]。

先前模型的主要缺点是,生成的映射可能无法在实际加速器上执行最佳(甚至很好),因为模型可能无法准确捕获硬件中的实现差异。基于真实硬件实现的精确周期软件模型可以实现更高的保真度[187, 218],使用Firesim[105]等平台的FPGA仿真也可以实现这一目标,该平台可用于对开发中的硬件进行建模。然而,这样的平台需要的不仅仅是一组问题维度和映射描述;需要一连串明确的指示。

生成这个指令流需要考虑大量的边缘情况。例如,一个简单的矩阵乘法matmul的平铺操作——在Timeloop中可以用一行tiles大小来表示[163]——既需要插入指令,指定在不同内存层次之间的内存移动,也需要在矩阵维度不能被tiles大小整除时出现的边缘情况下生成代码。此外,协同设计过程要求该过程是可自动化的。换句话说,每个映射必须能够自动翻译为代码。

因此,代码生成[33, 126, 180]工具被用于实际实现到硬件(或模拟器)的映射。这些工具中的许多不仅集成了硬件后端规范,而且还集成了映射决策算法,这些算法通常针对硬件目标进行了调优。这些工具也可以用于神经架构搜索(NAS),以便获得给定硬件架构的准确性能数字,指导自动DNN架构设计。然而,这些工具很难适应映射空间和硬件目标都不同的协同设计框架。

为了解决这个问题,开发了Halide[179]、TVM[33]、Rise/Elevate[78]和Exo[95]等用户可调度语言。这些工具将要执行的计算的描述和映射空间中的一个点作为输入。它们通常由一组重写规则定义,表示某些转换,例如拆分和重新排列循环、用ISA指令替换适当的循环以及融合循环。这些语言还允许用户指定和定制硬件指令集,并将这些点表示为一系列重写规则,无缝地将找到的计划表转换为可执行代码[158, 249]。

Transformer和CNN映射

寻找良好映射策略的先前工作主要集中在将CNN映射到加速器或通用硬件上。与CNN一样,Transformer的绝大多数周期都花在MHA和FFN模块的矩阵乘法上。

本质上,现有的CNN映射器可以很容易地扩展到调度Transformer矩阵乘法。然而,Transformer块包括LayerNorm和Softmax操作,在某些现实场景中,这些操作在计算上是非琐碎的([42, 168]也观察到了这一点)。反过来,这些操作的存在对调度前后的矩阵乘法施加了约束。这就导致了Transformer总体调度优化这样复杂得多的问题。

目标空间硬件架构是GEMMINI脉动发生器[70]。假设BERT和ResNet50模型都是8位整数量子化的。假设输入序列长度为512,这是BERTBase和BERT-Large模型的典型假设。

如图展示了BERT(左)和ResNet50(右)的映射空间比较。对于BERT MHA模块,图中的结果对应于执行每个Q、K和V投影的矩阵乘法的映射。对于FFN,采用投影中的矩阵乘法,它参与将隐藏维度扩展到四倍。从ResNet50中,选择不同核大小和形状的卷积操作,跨越1×1, 3×3和7×7卷积核。具体来说,在ResNet50的conv1层中使用输出通道大小为64、步幅为2的7×7核卷积,在最终卷积层conv5_x中使用输出通道大小为512、步幅为2048的3×3核卷积和输出通道大小为512、2048的1×1核卷积。这四种特定的卷积在通道和核大小上有所不同,并且合理地表示了ResNet50中发现的卷积。

添加图片注释,不超过 140 字(可选)

两种分布都没有明显偏向较低或较高的相对EDP。总的来说,BERT矩阵乘法matmuls和ResNet50卷积的映射空间在大小上相似,在分布形状上没有显著差异。这表明,对于BERT调度的暴力或随机搜索与ResNet50操作符的情况一样具有挑战性。

从映射空间分析中,看到BERT和ResNet50映射空间具有相似的随机采样映射的潜在能量-延迟积(EDP)范围。考虑到每个架构操作符之间的差异,自身的EDP值分布也在很大程度上相似,因为对于BERT和ResNet50操作符来说,具有较低EDP值的Pareto-最优,映射的部分很小。

作为另一种可视化方法,下图比较同一组100K随机映射的经验累积分布函数(CDFs)。在这里,仔细研究接近最优映射的区域附近cdf的差异。观察到,对于3 × 3,512卷积,对应于第10百分位的相对EDP值为7.44,对于1 × 1,2048卷积核,对应于第10百分位的相对EDP值为12.06。MHA和FFN预测的BERT矩阵乘法的十分位数值分别为9.42和9.84。

添加图片注释,不超过 140 字(可选)

结果表明,BERT 矩阵乘法近似最优映射的百分比与ResNet卷积核近似最优映射的百分比相近。这表明寻找最优映射的搜索问题对于BERT矩阵乘法来说是一个挑战。另外,还研究了相对EDP值小于最小值3倍的映射百分比。这个百分比表示可以安全地标记为接近最优映射数量的粗略上限,百分比的差异表示为不同的算子搜索最优映射的相对困难。发现在EDP范围内,核3 × 3, 512映射为1.58%,内核1 × 1, 2048映射为2.62%。在BERT的情况下,FFN矩阵乘法在此范围内1.48%的映射,MHA投影矩阵乘法显示有相对EDP小于3的1.70%映射 。

总体而言,对随机采样有效映射的EDP分布的分析表明,尽管BERT矩阵乘法与卷积相比具有较少的平铺和重新排序循环级别,但与CNN一样具有挑战性。图级和算子级调度对CNN推理的端到端性能和效率有重要影响,适当调度的重要性同样适用于Transformer矩阵操作。

作为对映射空间特征的附加分析,进一步强制MAC总数固定。这使得Transformer和ResNet50算子的映射结果分布之间的比较更加公平。继续假设Transformer输入序列长度为512,前馈网络FFN扩展比为隐藏维度大小的4倍。为了保持MAC数量相等,计算隐藏维度大小,它将产生与输出通道维度为64的ResNet50 conv1层7×7核相同的MAC总数。对于MHA查询投影中的矩阵乘法,对应的隐藏维度大小为240。同样,对于FFN块投影中的矩阵乘法,对应的隐藏维度大小为120。为了阐明合成BERT层与实际ResNet50卷积之间的比较,在下图中绘制相应的对映射分布。即使在强制用相同数量的MAC之后,看到BERT数学和ResNet50卷积之间的相对EDP值范围是相似的。这个发现进一步强调了在Transformer模型矩阵乘法调度问题有多复杂。

添加图片注释,不超过 140 字(可选)

虽然发现transformer中的矩阵乘法已经是非常重要的目标,可以获得在DNN加速器上执行的有效执行时间表,但由于存在几个非线性操作,包括在不同矩阵操作之间插入的LayerNorm和Softmax,问题变得更加复杂。在追求更激进的优化时,一个诱人的策略是将相对高算术强度的矩阵乘法与随后的低算术强度的规范化操作(如LayerNorm和Softmax)融合在一起。这在处理量化工作负载时尤其具有吸引力,因为部分和等待归一化的位宽通常比最终的归一化输出高得多。熟悉CNN类加速器的架构师可能会发现这特别直观,因为卷积通常与ReLU或最大池操作融合在一起。

类似地,对于Transformer 编码器,可以将规范化操作的执行与之前的矩阵乘法重叠,但这只有在额外的硬件支持和对矩阵乘法执行计划的适当约束下才能实现。为了实现非线性操作的全延迟隐藏,必须最大化矩阵乘法的任何输出维度的平铺因子大小,以便行/列立即准备好并存储在Gemmini累加器暂存器上,以便计算平均值和标准差。这种替代调度方法称为融合优化调度。

另一方面,在内存受限的边缘设备中,该策略(有点不直观)会适得其反。在Transformer中发现的规范化操作通常需要在产生任何规范化输出元素之前将数据的长向量驻留在片上本地存储器中。此外,当将矩阵乘法与这些规范化操作融合时,通常需要笨拙的矩阵乘法tile形状。这些奇怪的tile形状通常在任何一个维度上都要大得多,而不是正方形,这种扭曲的tile形状往往会产生更差的算术强度。这大大降低了矩阵乘法的性能,并且可能会增加总内存流量,甚至考虑到在未启用融合时必须向外部内存发送和从外部内存发送的非规范化部分和的高比特宽度。
如图更深入地研究了BERT矩阵乘法融合优化调度的性能影响。考虑隐藏维数为768和12个注意的BERT-Base编码器。默认情况下,假设序列长度为512。作为目标硬件,采用16×16重量平稳脉动阵列Gemmini和定制硬件单元,用于I-BERT实现非线性操作(激活,归一化等)。每对相邻的矩阵乘法和LayerNorm/Softmax操作的总延迟通过Timeloop估计[163]。重叠计算的机会包括:(1)MHA Qx K 乘法和随后的Softmax; (2) MHA 投影及后续LayerNorm; (3) FFN 投影及后续LayerNorm。

添加图片注释,不超过 140 字(可选)

比较两种调度策略。在第一种策略中,用GEMMINI 默认的基于启发式的调度器,该调度器会在本地SRAM级别上为三个矩阵乘法维度的每个贪婪最大化循环tile因子。在这种方法中,不尝试将矩阵乘法计算与下面的非线性操作重叠,这意味着其是独立调度的,就像执行一样。这种方法称为非融合调度。第二种策略是前面提到的融合优化调度。

两个发现:

首先,在MHA中,无论累加器大小如何,将每个注意的QxK矩阵乘法与Softmax融合可以减少延迟。特别是,我们看到,与matmul相比,Softmax延迟是显著的,占总周期的78%左右,隐藏这个延迟显着减少了总延迟。同时,由于额外的调度约束,Q × K matmul的延迟相对没有变化,这主要是因为matmul的内部维度很小(BERT-Base的 / = 64)。另一方面,融合优化调度的映射约束显著损害了投影矩阵乘法与以下LayerNorm融合后的执行延迟,导致延迟比未融合调度差83%。然而,一旦累加器的大小增加一倍,对多线程调度的性能影响就会减轻。累加器SRAM大小增加到256kB,允许将更多的部分和存储在缓冲区中,而不是溢出到DRAM中,从而将总延迟减少4%。

另一方面,如下图显示FFN 投影matmul和LayerNorm重叠的结果。即使使用更大的累加器大小和两个序列长度,观察到融合优化调度使总延迟恶化了27%。结合先前的研究结果,融合优化调度的延迟改善取决于累加器SRAM大小和序列长度。此外,在BERT-Base尺度下,将MHA的Qx K矩阵乘法与随后的Softmax重叠一致是有利的,但将FFN 投影矩阵乘法与LayerNorm连接是不利的。这与之前针对Transformer的GPU核融合研究形成对比[42, 168],并且它强调,Transformer矩阵乘法的调度在针对不同风格的定制硬件设计(包括Gemmini加速器)时,变得更加复杂。

添加图片注释,不超过 140 字(可选)

6 使用NAS调整Transformer架构

神经架构搜索NAS

通常,DNN架构的设计和训练是为了实现给定任务的最大精度,而不必考虑目标硬件或推理延迟、内存和功耗要求。然而,通常存在几种不同的深度神经网络架构变型,导致相同的精度,但具有更好的硬件性能。这方面有丰富的文献。这里值得注意的作品包括MobileBERT[205],这是最早的尝试之一,它采用瓶颈结构设计了更薄的Transformer版本,以及Lite Transformer[232]。它提出了长-短范围注意,其中一组head被卷积操作取代,以更有效地捕获短距离上下文。SqueezeBERT[94]是另一项将分组卷积合并到Transformer架构中以减小模型大小和延迟的工作。这种方法不仅限于NLP,在计算机视觉(CV)[24, 36, 130, 152]和语音识别[23, 76, 109]中也提出了类似的模型,仅举几例。

通常很难找到这些DNN架构,因为即使不考虑底层硬件平台,搜索空间也会呈指数级增长。即使对于那些在DNN体系结构设计方面具有专业知识的人来说,体系结构更改对准确性和运行时性能的影响也很难预测。因此,已经提出了自动化NAS方法来适应给定约束的DNN体系结构。然而,需要注意的是,在找到候选体系结构之前,NAS方法通常需要大量的计算和试验。例如,在一个早期的NAS工作[255]中,找到一个优化的CNN需要22400个GPU小时。此外,NAS方法还不是完全自动化的,它们通常需要手动调优搜索空间。

从广义上讲,NAS框架由三个主要部分组成:搜索空间、搜索方法、评价方法[18, 61]。搜索空间由一组有效的操作(例如,卷积、池化、激活等)及其连接性组成,这些操作定义了有效的DNN架构,从中可以得到候选模型。对于好的深度神经网络设计,通常需要先验知识和人类直觉来限制搜索空间和提高搜索效率。搜索方法定义了如何探索搜索空间。穷尽搜索显然是棘手的。因此,拥有快速探索搜索空间和采样候选体系结构的方法至关重要。评估方法是一种评估候选体系结构在未见数据上表现的方法。最幼稚的方法是在整个训练过程完成后评估所有候选体系结构。然而,这会产生很大的开销,并且通常使用更有效的估计性能的方法作为最终精度的代理。如图显示了这些不同的组件。关于NAS更全面的调查,请参考文献[18, 61, 183, 193]。

添加图片注释,不超过 140 字(可选)

如图所示是不同NAS搜索方法的比较。(a)基于强化学习的方法采用一个控制器,该控制器根据策略对体系结构进行采样,该策略通过采样体系结构的评估结果作为奖励来加强。(b)基于进化搜索的方法,初始化种群,根据评估结果对其进行采样,然后通过改变剩余的体系结构来生成下一轮种群。©基于梯度的方法(例如,连续松弛),与模型参数一起训练权重,这些参数在每个操作选择。在训练之后,权重被收敛到有利于特定操作而不是其他,这样近似采样结构。

添加图片注释,不超过 140 字(可选)

硬件-觉察的NAS

硬件-觉察NAS不仅旨在优化DNN的准确性,还旨在优化目标硬件平台上的各种性能指标(如延迟、能耗或内存使用)。这里的一个关键问题是如何将这些指标整合到学习中。通常很难快速测量候选模型的延迟或能耗。因此,大多数文献只考虑FLOPs或参数总数。然而,FLOPs不一定与延迟或能量相关。因此,已经引入了多个硬件觉察的NAS框架来直接考虑延迟,或者使用近似度量来度量(例如,度量各个层的延迟并将它们累加以近似总延迟,而不是度量端到端运行时)。有关支持硬件的NAS技术及其算法细节更详尽的调查,请参阅[18]。

最直接的方法是直接测量硬件性能,并将其作为NAS框架的额外优化目标[138,210]。例如,MNasNet[210]将现有基于RL的NAS框架扩展到多目标优化设置。它旨在最大限度地提高准确性,同时将目标平台上的延迟限制在一定的目标延迟以内。它不是解决多目标优化问题,而是通过加权乘积将两个目标(准确性和延迟)合并为一个目标。这个修改后的目标将作为更新控制器的奖励。通过直接优化目标平台上的延迟,MNasNet发现DNN架构比MobileNetV2[188]和NASNet[255]快2倍,在Pixel手机上具有相当的ImageNet分类精度。

另一个值得注意的工作是MCUNet[138],其目标是为资源受限的微控制器搜索DNN。与GPU或移动设备不同,微型物联网设备的微控制器缺乏大内存和存储空间。因此,设计一个适合他们紧张内存预算的模型是至关重要的。MCUNet将其基于超级网络的NAS框架[17,77]与TinyEngine结合在一起,TinyEngine是作者作为项目一部分开发的轻量级推理引擎。通过这种方式,MCUNet对每个进化步骤的子网络进行采样,并将其提供给TinyEngine以优化内存调度并测量最佳内存使用情况。

然而,由于可用设备的数量有限,直接测量硬件性能可能很慢,并且不可并行化[238]。此外,不可能预先测量搜索空间中所有可能的DNN的硬件性能[228]。为了克服这个问题,一些硬件觉察的NAS方法结合了操作智能查找表[219, 228, 238]。查找表不是存储端到端的硬件性能,而是只包含预先测量的单个操作性能数字,这些操作可以汇总以估计给定DNN的整体性能。例如,在FBNet[228]中,从查找表中估计的延迟数在其基于梯度的NAS框架中用作正则化项,以惩罚在目标硬件设备上缓慢的操作。最后,一些硬件感知的NAS框架依赖于轻量级预测模型,该模型可以快速预测给定DNN的硬件性能数字。例如,ProxylessNAS[26]训练了一个模型,该模型将DNN配置(例如,操作类型、输入和输出形状以及内核大小等其他操作属性)作为输入,并在目标硬件平台上输出估计的延迟。

Transformer专用的NAS

NAS的早期工作主要集中在CNN模型上,主要用于计算机视觉应用。然而,在Transformer体系结构被引入并成熟到不仅可以为NLP任务而且可以为其他任务实现最先进的结果之后,一些工作开始探索NAS方法以找到更有效的替代方案。随着Transformer体系结构的引入和成熟,它允许在各种任务上获得最先进的结果,许多最近的工作已经开始探索NAS方法的使用,以找到更有效的替代方案。由于Transformer架构最初是为NLP任务开发的,因此最早的用于Transformer的NAS工作主要是在这个领域。

Evolved Transformer[200]是最早尝试应用NAS来搜索更好的Transformer架构的方法之一,它是通过进化搜索算法实现的。受NASNet[255]的启发,Evolved Transformer采用逐单元搜索空间来搜索两个单元结构。这些单元结构中的每一个都可以堆叠多次,形成编码器-解码器Transformer架构的编码器和解码器。单元结构包含多个块的堆栈,每个块都有自己的超参数,如操作类型、规范化类型和可以搜索的维度。这里的主要挑战是NLP任务需要更长的时间来训练和评估(例如,流行的WMT 2014 En-De翻译基准包含超过300万对句子)。此外,与之前的工作[140, 142, 149, 182, 210]不同,CNN发现,CIFAR-10是更大的ImageNet的合理代理,这些NLP任务通常没有很好的小代理任务。为了解决这个问题,Evolved Transformer建议提前停止那些少量步骤内未能达到hurdle fitness的架构,动态地将资源分配给更有前途的架构。

由于在NLP任务上训练transformer的计算成本很大,权重共享和基于超级网络的NAS已经成为流行的选择。HAT[222]将一次性的[25]方案扩展到Transformer架构,训练单个超级网络,从该超级网络中可以采样具有不同深度,头部数量和维度的子网络。此外,HAT是硬件-觉察的,因为它使用多层延迟预测模型直接优化延迟和准确性。HAT共享一劳永逸的好处,它允许通过进化搜索对子网络进行采样,并立即部署到目标硬件设备,而无需重新训练。

NAS- bert[235]是另一个基于超级网络的TransformerNAS,扩展了Single Path One-Shot方法[77]。与其不同的是,NAS-BERT提出了一种NAS方法,该方法可以应用于纯编码器BERT的预训练阶段,对下游任务不可知。为了避免在大超级网络中直接执行架构搜索的高昂成本和繁重的预训练任务,NAS-BERT采用了两种新技术:(1)分块训练,将整个超级网络分成多个连续Transformer层的块,然后分别进行训练;(2)渐进式收缩,根据验证损失动态修剪前景不佳的子网络。

Primer[201]为自动回归语言建模寻找一种更有效的仅解码器Transformer。与大多数NAS方法将模型视为从NAS搜索空间中选择的多个操作进行连接不同,Primer将其视为一个有效的Tensorflow (TF)程序,该程序由细粒度的TF基本操作(如加法、指数、卷积等)组成。使用进化搜索,它的目标是搜索一个TF程序,该程序定义了一个可以多次堆叠的解码器块,形成一个自回归的语言模型。希望在设计搜索空间时最小化归纳偏差,因为可能的操作集及其连接性不再由人类专家预先确定。为了减少自回归预训练的繁重计算成本,Primer引入了evolved Transformer的hurdle思想[200]。此外,它使用相对较小的LM1B数据集作为代理任务来发现模型架构,然后将其转移到更大的目标任务,如PG-19[176]和C4[178]。

Transformer架构最初是为NLP任务开发的,现在已经适应了CV领域的使用。这些模型被称为视觉Transformer(ViT)[56, 144, 215],已被证明在各种CV应用中优于流行的CNN架构,从而推动了NAS技术的发展,自动设计更好的ViT架构。然而,由于架构上的相似性,这些工作与针对NLP那些transformer的NAS方法有很多共同之处。例如,Autoformer[230]和viti-resNAS[135]是Single Path One-Shot[77]对ViT搜索空间的扩展,包括深度、隐藏维度和每个Transformer层的头数量。Burgerformer[236]进一步考虑了微观设计,即操作、激活和规范化的类型。NASViT扩展了BigNAS[243]和alphaet[221],将sandwich sampling规则应用于超级网络的训练。GLiT[30]提出了一种搜索混合卷积-注意结构的分层NAS方案。在NAS的第一阶段确定每层的卷积和多头注意的数量,在第二阶段确定维度等详细的超参数。

上面介绍的用于Transformer体系结构(包括NLP和CV应用程序)的大多数NAS方法的一个显著特征,是它们使用基于超级网络的权重共享方法,下表对此进行了总结。这大概是由于训练Transformer架构要负担巨大计算成本。使用基于超级网络的NAS可以限制可以发现的体系结构范围,因为它对搜索空间施加了很大的约束,这可能会阻止发现独特或创新的体系结构。因此,有必要探索更好的方法来平衡NAS技术的灵活性和效率。

添加图片注释,不超过 140 字(可选)

在Transformer上运行NAS和协同设计

到目前为止,已经讨论了NAS的一般概念、在硬件感知场景中的应用,以及在Transformer体系结构中的扩展。这里进行一个案例研究,演示将NAS应用于gemmini上Transformer推理的性能收益,其目标不仅是优化准确性,还包括优化延迟和能源等硬件成本。

作为基线体系结构,用6层Transformer体系结构,所有其他模型配置与BERT-Base或GPT-2保持相同。考虑语言建模任务,在WikiText-2[154]基准上训练一个随机初始化的模型,其中使用了语言建模训练目标的37k训练样例和4k验证样例。为了评估模型性能,测量验证示例的困惑度(perplexity),排除空字符串,其中分数越低表示性能越好。使用Adam优化器和线性学习率调度对独立基线模型进行50个epoch的训练,峰值学习率在{5, 2, 1, 0.5}× 10^−5范围内。将训练样例连接起来,达到最大序列长度512,并用批量大小为16进行批处理。

对于NAS,采用bigNAS风格[243]策略来训练超级网络,然后用进化算法从全训练的超级网络中搜索子网络。NAS搜索空间由层数 、头数、隐藏维数和FFN维数各种组合组成(详见表)。对于超级网络训练,用与独立训练相同的训练超参数,除了在每个训练迭代中,对四个子网络进行采样:最大可能; 最小的: 尽可能小的; 还有两个随机抽样的子网。然后使用sandwich sampling执行模型参数更新,该规则涉及对这四个子网络的反向路径收集的梯度取平均值。

添加图片注释,不超过 140 字(可选)

体系结构参数如下表所示。该体系结构说明了多样化搜索空间的重要性,因为每层中的注意头的数量从6到12不等,并且全连接层尺寸从768到2560不等。在每层的基础上改变这些参数,与为每层固定这些参数相比,可以发现更多的Pareto最优架构。

添加图片注释,不超过 140 字(可选)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值