论文阅读(第二部分):Full Stack Optimization of Transformer Inference: a Survey
原文链接:https://arxiv.org/pdf/2302.14017.pdf
模型分析
-
1.3.1 负载分析
端到端的浮点运算:
floating-point operations (FLOPs)
- 它可以通过将FLOPs总数除以访问的字节总数(也称为MOPs,或内存操作)来计算。
A r i t h m e t i c I n t e n s i t y = F L O P s M O P s Arithmetic Intensity=\frac{FLOPs}{MOPs} ArithmeticIntensity=MOPsFLOPs
FLOPs and MOPs scale super-linearly for all models, especially in the long sequence length regime, due to the quadratic complexity with respect to sequence length in the act-to-act matmuls
End-to-end Arithmetic Intensity: - 它可以通过将FLOPs总数除以访问的字节总数(也称为MOPs,或内存操作)来计算。
**Arithmetic Intensity(算术强度)
**是指在深度神经网络中,对每个字节的数据执行的操作数量。它是一个重要的性能指标,**用于衡量计算和内存带宽之间的关系。算术强度的计算方式是通过将操作数量除以内存带宽来得到。**如果算术强度超过了特定阈值,那么该操作就是计算受限的,可以相应地进行优化。相反,如果算术强度低于阈值,那么该操作就是内存受限的,对处理器进行参数调整以更有效地利用处理器是无效的。
在深度神经网络中,算术强度的高低对于性能优化至关重要。例如,大型层相对于内存访问的计算量更大,这会导致较高的算术强度。另一方面,激活函数、池化和批量归一化等操作几乎总是内存受限的。
算术强度的计算方式是通过将操作数量除以内存带宽来得到。如果算术强度超过了特定阈值,那么该操作就是计算受限的,可以相应地进行优化。相反,如果算术强度低于阈值,那么该操作就是内存受限的。
在实际应用中,通过使用性能分析工具来获取浮点运算次数和内存访问次数,可以计算出算术强度。例如,PyTorch分析器中包含了计算浮点运算次数的功能,可以用来计算每个模块或PyTorch操作符的浮点运算次数。
- 对于BERT-Base和BERT-Large,算术强度最初随着序列长度的增加而增加,直到512,然后随着序列长度的增加而降低。
- the FFN module that has higher arithmetic intensity than the MHA module
- 图中的非线性算子叫做other
**Latency Breakdown
**是指计算机系统中的延迟分析。在计算机科学中,延迟是指从发出请求到收到响应之间的时间。延迟分解是对延迟进行详细分析,以确定造成延迟的各种因素。这有助于识别和解决系统中的性能瓶颈。
In comparison to encoder-only BERT inference, decoder-only GPT-2 inference exhibits significantly lower arithmetic intensity
decoder 仅由矩阵-向量算子组成,因此限制了数据重用的机会
- 对于一个矩阵-向量算子:当数据不能在每个token之间共享时,对每个参数加载执行一次乘法和一次加法,这导致在执行参数加载时执行两个操作。
- 注意到GPT-2相比于BERT-Base在长序列增长时具有更低的FLOPs,但是由于它的低算数密度,使得它的推理更具挑战性。与只有编码器的BERT模型相比,这使得它的性能内存带宽受限。
Per-Layer FLOPs, MOPs, and Arithmetic Intensity:
-
these operations have lower arithmetic intensity compared to the projection layers in the FFN and MHA modules这也解释了为什么只有encoder的模型面对长序列的时候算数密度下降
-
相对于投影层,act-to-act matmul的算术密度较低,因为这两个操作中的 d h \frac{d}{h} hd维度相对于投影层的维度(𝑑和 d F F N d_{FFN} dFFN)和𝑙来说是小的
-
当序列逐渐边长,小维度矩阵带来更低的算术密度。由于矩阵中的每个元素需要执行更少的算子,导致减少重用。更少的算数密度随着大的激活数量而急剧增加,激活需要必须为act-t-act的数学运算加载和存储。
-
each head has its own activation (attention score) in the multi-head scheme
-
非线性算子整体上具有较小的FLOPs但是如果处理不合适也会带来较大的性能影响
图:在GPT-2上每一层的decoder分析 -
which demonstrates the significantly reduced arithmetic intensity across all layers, compared to the encoder-only model, resulting from a large number of memory operations.由于大量的存储操作大大降低了算数密度
-
memory operations
:The two operations allowed in memory are *reading* a value and *writing* a value.
Comparision with ResNet50:
图:a breakdown of the FLOPs, MOPs, and arithmetic intensity for ResNet50
- ResNet50 without any operator fusion consumes 3.07 times fewer FLOPs and 1.28 times fewer MOPs导致更小的端到端的算术密度,这事因为很少的非线性操作FLOPs消耗但是有比较大的MOPs消耗类似于BERT-Base encoder。
- 在推理过程中,不同于transformer中的非线性操作,ResNet50中的可以和之前的matmuls进行融合*。*特别是:the ReLU operations can be applied directly to the accumulated outputs, and the BatchNorm operations can actually be folded into the prior convolutions
- 融合ReLU消除了该操作所需的MOPs,折叠BatchNorm消除了该操作所需的flop和MOPs
operation fusion refers to a methodology in which the output values from one operation (e.g., a matmul or convolution) are directly used as input to the subsequent operation(e.g., a ReLU or BatchNorm)
-
不能讲输出值一次写入off-chip 内存,算子融合减轻了不必要的内存加载和存储对于非线性算子
-
注意,在理想情况下,算法强度提供了对不同模型和操作可能重用多少数据的粗略估计。
-
1.3.2 Profilling
Latency breakdown:
End-to-end Latency:
图:normalized latency for different sequence lengths for BERT-Base, BERT-Large, and GPT-2
A model with higher arithmetic intensity can run faster with the same (or possibly even more) FLOPs than a model with lower arithmetic intensity.
These observations confirm our findings that decoder inference is a memory-bound problem and not a compute-bound problem
summary:
- 由于act - to - act矩阵的二次复杂性,所有Transformer模型的FLOP和归一化延迟都与序列长度呈超线性比例。然而,这种趋势在序列长度较小的情况下不太明显,其中对整体计算起主要贡献的是随序列长度线性伸缩的FFN,而不是MHA模块
- 对于只有编码器的模型,算术强度最初随着序列长度的增加而增加。然而,对于较大的序列,它会减少,因为MHA模块(特别是具有较低算术强度的act-to-act matmuls)成为总计算的主要贡献者
- 仅解码器模型的算术强度明显低于仅编码器模型,导致相同序列长度的端到端延迟明显更长。这是由于解码器模型涉及有限数据重用的矩阵向量操作,使它们受内存带宽限制而不是计算限制
- Matmuls在仅有编码器和仅有解码器的模型中都消耗了99 %以上的FLOPs,非线性操作在总体FLOPs中占比较小。然而,非线性操作具有极低的算术强度,特别是对于大序列长度,由于它们需要加载和存储大量的激活。