23年2月论文“Full Stack Optimization of Transformer Inference: a Survey“, 来自伯克利分校和Nvidia。
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)模块执行的计算图。
下表是Transformer架构的配置参数。
给出BERT Base、BERT Large和GPT-2(最小)的参数作为示例。
请注意,GPT-2具有与BERT-Base相同的参数。
序列长度可以是任何数字,只要不超过可能的最大序列长度。
下表是Transformer模型中的线性运算。
最后一列是矩阵乘法维度。
𝑚 ×𝑛 ×𝑘 意味着输入尺寸𝑚 ×𝑛 和𝑛 ×𝑘, 输出维度𝑚 ×𝑘。
注意,在多头方案中,act-to-act的矩阵乘法都重复h次。
有几种非线性操作,如Softmax、LayerNorm和GELU,需要特殊的支持或芯片外计算。
与线性运算相比,当使用Transformer网络进行推断时,这些非线性运算在总体运算中所占的比例相对较小。
然而,与矩阵计算相比,在典型硬件上计算这些非线性运算更具挑战性,如果处理不当,它们可能会产生大量开销。
如图概述Softmax、LayerNorm和BatchNorm操作。由于它们依赖于运行时统计信息,LayerNorm和Softmax都需要对输入进行多次传递才能计算非线性运算。在Softmax的情况下,需要第一次通过输入来计算分母。对于LayerNorm,需要对输入进行三次传递:一次用于计算平均值;一个用于计算标准偏差;以及一个用于应用规范化。与LayerNorm和Softmax不同,BatchNorm只使用在训练过程中学习的统计数据,因此它只需要对输入进行一次传递。
Transformer架构最初作为机器翻译任务的编码器-解码器模型引入[217]。
在此设置中,编码器将整个源语言句子作为输入,并将其通过多个Transformer编码器块,提取输入句子的高级特征。
然后,这些提取的特征被一个接一个地馈送到解码器中,解码器负责生成目标语言中的tokens。
这是基于来自编码器的源语言特征以及它之前生成的tokens[217]。
在随后的工作中,引入仅编码器和仅解码器的架构,分别从原始编码器-解码器架构[46,174]中仅取编码器和解码器组件,如图所示。
模型分析
为了评估Transformer中的瓶颈,首先对计算Transformer仅编码器和仅解码器模型所需的
浮点运算(FLOPs)数量
以及这些网络的算术强度进行了建模。算术强度是从内存加载的每个字节可以执行的浮点运算数量。它可以通过将FLOPs的总数除以访问的
字节总数(也称为MOPs或内存操作)
来计算。
这里假设局部存储器足够大,可以将给定运算的两个矩阵完全保存在存储器中,因此计算出的算术强度值作为可实现的数据重用的上限。在计算FLOPs时,还分别计数MAC操作中的乘法和加法。
如图BERT Base和BERT Large编码器以及GPT-2解码器在不同序列长度上的FLOPs。FLOPs随着序列长度的二次缩放,这是由于act-to-act矩阵乘法以及Softmax函数中的二次伸缩。此外,推断BERT-Base编码器和GPT-2解码器(它们具有相同的模型架构)需要相似数量的FLOPs来处理相同的序列长度。
如图BERT Base和BERT Large编码器以及GPT-2解码器在不同序列长度上的MOPs。
由于act-to-act矩阵乘法以及Softmax函数的二次缩放,仅编码器模型的MOPs与序列长度成二次缩放。
此外,GPT-2解码器需要比BERT基本编码器(具有相同的模型架构)多得多的MOPs,在每次token生成加载权重时处理相同的序列长度。
BERT Base和BERT Large编码器以及GPT-2解码器在不同序列长度上的算术强度。
算术强度最初增加,因为较大的矩阵维度允许每个加载的参数执行更多的计算。
然而,在较高的序列长度下,算术强度会降低。
这是因为,对于长序列长度,MHA模块的actt-to-act矩阵乘法和Softmax计算开始占主导地位。
与FFN模块中的投影层相比,这些具有相对较低的算术强度。
下表是序列长度为128、512和4096个tokens的BERT Base编码器的每层FLOPs、内存操作(MOPs)和算术强度。
在低序列长度下,FLOPs和MOPs的主要贡献是MHA和FFN投影。
对于较长的序列长度,act-to-act的矩阵乘法消耗更大比例的FLOPs,并且这些操作与Softmax一起消耗大多数MOPs。
对于每个序列长度,act-to-act矩阵乘法也具有比MHA和FFN中的投影层更低的算术强度。
如表是ResNet50的每层FLOPs、内存操作(MOPs)和算术强度。
卷积消耗FLOPs的主要比例,但BatchNorm、ReLU和其他运算贡献MOPs的很大比例。
下面两个图分别展示BERT Base和GPT-2的延迟分解如何随CPU上的序列长度而变化。
这些细分表明,对于短序列长度(例如128-512),大多数计算在FFN模块的投影层中,而MHA计算的大部分在投影层中。
然而,随着序列长度的增加,act-to-act的矩阵乘法开始占主导地位,因为它们都是按序列长度二次缩放的。
下图显示了BERT Base、BERT Large和GPT-2不同序列长度的归一化延迟。很明显,对于每个序列长度,GPT-2的延迟远长于BERT Base或BERT Large的延迟,尽管BERT Base和GPT-2具有基本相同的模型配置和端到端FLOPs。这主要是由于矩阵向量运算的算术强度较低。与算术强度较低的模型相比,具有较高算术强度的模型在具有相同(甚至可能更多)FLOPs的情况下可以更快地运行。这些观察结果证实了,
解码器推理是一个内存约束问题,而不是计算约束问题。
3 硬件设计
DNN加速器一览
典型的深度学习加速器有几个关键组件,如[27]所述:
-
•用于保持整个网络的权重和激活的片外DRAM,其需要足够大以保持所有模型权重和激活;
-
•较小的片上存储器,此处称为全局缓冲器,其需要足够大以容纳权重和输入的子集,以便馈送处理元件(PE);
-
•PE阵列,每个PE都具有执行MAC操作的能力,并且通常包含一个或多个称为寄存器文件(RF)的小型本地存储器,该存储器可以以比全局缓冲器更低的每次访问能量存储数据;
-
•在PE之间传输数据的内部片上网络(NoC)。
如图所示:全局缓冲器被设计为能够保持足够数量的权重和激活,以便允许数据重用并限制到芯片外DRAM和从芯片外DRAM传输的次数。PE中的本地存储器用于提供本地数据重用,以便尽可能减少全局缓冲器访问。在不重复使用的情况下,MAC操作需要加载三个参数,即正在相乘的两个输入值以及当前部分和(这是输出矩阵中给定位置的部分累积值),然后将输出值存储回存储器。这一点很重要,因为从能量的角度来看,存储器读取和写入的成本要高出几个数量级[87]。例如,对于一种特定的技术,从本地缓冲区读取的成本大约是单个MAC操作的6倍,从外部DRAM读取的成本约为200倍[206]。因此,为了减少执行的昂贵内存访问次数,利用重用机会至关重要。
为了最大限度地提高数据重用性,有两大类数据流被广泛采用,它们被称为时间和空间数据流[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)能够计算所有所需的非线性运算,因此这些运算都不必在芯片外计算。该模型还假设𝑊 -PE阵列的周期延迟,其中𝑊 是PE阵列的宽度,以及SFU每个向量的1-周期延迟。
添加图片注释,不超过 140 字(可选)
从Gemini[70]加速器生成器生成的一个相当典型的CNN加速器开始,该加速器主要针对类似ResNet50的工作负载进行了优化,下面对该加速器及其软件堆栈做更改,有效支持BERT等Transformer工作负载。用于端到端Trans-former推理的几个加速器采用了与Gemini和分析模型类似的结构,并且还包含用于非线性函数的专用后处理单元[107,148,166,209]。
首先生成一个相当典型的CNN加速器,如图所示,使用Gemmini加速器生成器。加速器使用16×16脉动阵列执行矩阵乘法,该阵列实现了权重平稳数据流。当执行卷积时,输出通道和输入通道维度在空间上展开。8位整数权重和输入存储在256kB的本地暂存存储器中,32位部分和,会存储在执行矩阵加法的双端口64kB累加器SRAM中。当DNN层太大而无法放入本地暂存区时,它们会回落到与片上系统(SoC)的CPU和其他加速器共享的外部L2缓存和DRAM上。主机CPU平铺这些层以计算完整输出。
尽管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,因此除非进行进一步的优化,否则基线加速器运行中每个操作所消耗的时间远未达到理论理想。
此外,基线加速器将GELU和Soft-max操作卸载到主机CPU,主机CPU使用浮点单元执行这些操作。
如图所示,浮点加法器或乘法器消耗的能量比整数部分多几个数量级。
在基线CNN加速器中,使用INT8输入执行矩阵乘法,但这些必须在要在CPU上执行的浮点激活的矩阵乘法操作之间进行去量化和重新量化,这进一步增加了能量和延迟开销。
这里(图左)显示Titan RTX和A100 GPU上不同比特精度逻辑的峰值吞吐量之间的比较。
还有(右)45nm技术不同精度对应的能量成本和相对面积成本的比较[87]。
正如人们所看到的,较低的精度提供了指数级更好的能量效率和更高的吞吐量。
最后,通常必须根据运行在专用硬件加速器上的工作负载仔细调整其内存层次结构。
CNN主要执行卷积,卷积具有非常高的算术强度,而Transformers主要执行矩阵乘法,通常使用小矩阵和/或矩形矩阵,算术强度明显较低,并采用不同的最优平铺策略。
例如,MHA模块的低算术强度。
这表明,基线CNN加速器的内存层次结构和内存带宽应该重新调整,以实现更高效的Transformer推理。
Transformer 矩阵乘法(特别是act-to-act)通常具有与CNN中的卷积层非常不同的形状和算术强度。如图所示是在基线CNN加速器上执行BERT基础推理时的矩阵乘法利用率,具有不同的暂存器和累加器大小,可见简单地调整输入/权重暂存器和32位部分累加器的大小,可以显著提高BERT的矩阵乘法运算的性能。更大的累加器可以实现更高的输出重用,这更适合于Transformer中的几个矩阵乘法。Q×K的矩阵乘法尤其具有𝑙 ×𝑙 输出激活矩阵,对于长序列长度,它比𝑙 ×𝑑/h输入Q和K矩阵。因此,增加累积缓冲区大小允许通过这些操作改进输出重用。
鉴于这一观察结果,将基线加速器的共享输入/权重暂存区的大小从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倍。
量化方法可以大致分为均匀量化和非均匀量化,这取决于它们如何映射值。均匀量化将浮点域拆分为均匀间隔的区间,并将每个区间映射为单个固定点值。这可以从一个简单的算术规则中获得:
𝑄(𝑟) = Int(𝑟/𝑠) +𝑍
其中𝑄 是量化操作,𝑟 是浮点值,𝑆 是一个比例因子,并且𝑍 是一个转变因素。另一方面,非均匀量化不要求区间均匀分布。通过为重要区域分配更多的量化bin,通常会提高压缩率,非均匀量化可以比均匀量化更准确地捕捉浮点域中的原始数据分布。然而,在通用计算硬件上有效地部署非均匀量化模型通常更具挑战性。因此,由于简单性和到硬件的有效映射,均匀量化是目前事实上的方法。