简而言之,算力利用率指负载在集群上每秒消耗的实际算力除集群的标称算力。对一个典型的GPT-like负载,其主要的浮点算力都由Transformer层和logit层中的矩阵乘(GEMMs)贡献。
例如昇腾上一个典型的千亿大模型盘古中,99.3%以上的浮点算力都由fp16的矩阵乘贡献。考虑一个具有I个transformer层的大模型负载,F表示一个iteration中负载消耗的算力。
注意,F为真实FLOPs统计的lower bound。真实的计算过程中,负载还有少量的vector算力和padding带来的额外算力(占比极少)。
下面的计算公式,B代表Batch Size,s代表sequence length,I是transformer层的数量,h是hidden size,V是vocabulary size。
一个的矩阵乘法需要2mnk个浮点运算(乘加运算算两次)。Transformer层由一个注意力模块(attention)和一个2层前馈网络(FFN)组成。对于注意力模块,主要的贡献者是键(key)、查询(query)和值(value)的转换(
次运算),注意力矩阵计算(
次运算),对值进行注意力计算(
次运算)和注意力后的线性投影(
次运算)。前馈网络将隐藏大小增加到4h,再将其缩小回h。这需要
个浮点运算。
将上面的这些加起来,每个transformer层的正向传递结果为+
个FLOPs。反向传递需要两倍于此的FLOPs,因为我们需要计算相对于输入和权重张量的梯度。
此外,如果我们使用了激活重计算技术,这需要在反向传递之前进行额外的前向传递。因此,每个transformer层的总FLOP数为。
所以,考虑层GPT负载一个iteration中GEMMs的FLOPs算力为:
集群算力利用率的公式为:
其中,C为集群中每块芯片的标称算力,N为集群中芯片的个数,step_time为一个iteration的时间。
算力利用率可以衡量芯片算力的发挥程度,也可以衡量对负载和芯片的亲和优化。对于昇腾或GPU等重算力芯片,我们希望尽量多的算力都在CUBE/TensorCore上,如果vector算力成为瓶颈,较少的算力花了较多的时间,此时step_time增加,算力利用率降低。
所以,算力利用率可以反映实际的算力发挥情况,牵引软硬件栈的优化。同时,算力利用率和吞吐成正比关系,可以纵向反映性能问题。
影响算力利用率的因素是所有非矩阵运算花的时间,包括:AICORE内部的数据搬运,VECTOR计算,卡间不可掩盖的通信时间等。