- 本文说明以下重要结论
设模型参数量为 N N N,训练数据量(Token)为 D D D,LLM训练中计算量(FLOPs) C ≈ 6 N D C\approx 6ND C≈6ND
- 参考:
文章目录
0. 符号约定
-
本文遵循以下符号约定
参数 符号 说明 Decoder 层数 l l l Token 嵌入维度 d d d Attention 层嵌入维度 d d d MLP 隐藏层维度 4 d 4d 4d 通常设置为嵌入维度4倍 Attention head 数量 n n n 要求其整除 d d d 词表尺寸 V V V batch_size b b b 模型输入长度 s s s 训练 batch data x \pmb{x} x 张量尺寸 R b × s × d \mathbb{R}^{b\times s\times d} Rb×s×d 模型参数量 N N N 训练数据量(Token) D D D 训练计算量(FLOPs) C C C -
本文主要考察 GPT2/GPT3 等标准 Decoder-only 模型
1. LLM 的参数量分析
1.1 Embedding & LM Head
- Token Embedding 嵌入层本质是一个不带偏置的线性层,总参数量为 V d Vd Vd
- 用于自回归预测的多分类头线性层参数通常和嵌入层共享,不占用额外参数
1.2 Transformer Decoder Block
-
一个 Transformer Decoder Block 的总参数量最多 12 d 2 + 13 d 12d^2+13d 12d2+13d
-
Self-attention 层总参数量 4 d 2 ( + 4 d ) 4d^2 \space (+4d) 4d2 (+4d):
-
投影矩阵 W Q , W K , W V , W O \pmb{W}_Q, \pmb{W}_K, \pmb{W}_V, \pmb{W}_O WQ,WK,WV,WO,尺寸均为 R d × d \mathbb{R}^{d\times d} Rd×d,参数量共 4 d 2 4d^2 4d2
参数量和注意力头数量无关, n > 1 n>1 n>1 的情况下每个注意力头有自己的投影矩阵 W Q ( i ) , W K ( i ) , W V ( i ) \pmb{W}_Q^{(i)}, \pmb{W}_K^{(i)}, \pmb{W}_V^{(i)} WQ(i),WK(i),WV(i),尺寸均为 R d × d n \mathbb{R}^{d\times \frac{d}{n}} Rd×nd,参数量共 3 × n × d × d n = 3 d 2 3\times n\times d\times \frac{d}{n} = 3d^2 3×n×d×nd=3d2,再加上汇总各个注意力头信息的 W O ∈ R d × d \pmb{W}_O\in\mathbb{R}^{d\times d} WO∈Rd×d,一共 4 d 2 4d^2 4d2
-
如果每个矩阵带偏置,则参数量再加 4 d 4d 4d
-
-
MLP 块总参数量 8 d 2 + 5 d 8d^2+5d 8d2+5d:
- 从输入层到隐藏层的线性层尺寸 R d × 4 d \mathbb{R}^{d\times 4d} Rd×4d,带偏置,参数量 4 d 2 + 4 d 4d^2+4d 4d2+4d
- 从隐藏层到输出层的线性层尺寸 R 4 d × d \mathbb{R}^{4d\times d} R4d×d,带偏置,参数量 4 d 2 + d 4d^2+d 4d2+d
-
LayerNorm 层共两个,总参数量 2 × 2 d = 4 d 2\times 2d=4d 2×2d=4d
- 缩放参数 γ \gamma γ,尺寸 R 1 × d \mathbb{R}^{1\times d} R1×d,参数量 d d d
- 平移参数 β \beta β,尺寸 R 1 × d \mathbb{R}^{1\times d} R1×d,参数量 d d d
-
1.3 总结
-
Decoder-Only 模型各模块参数量如下
模块 数量 单个参数量 总参数量 Token Embedding 1 V d Vd Vd V d Vd Vd LM Head 1 - - Self-attention l l l 4 d 2 ( + 4 d ) 4d^2 \space (+4d) 4d2 (+4d) 4 l d 2 ( + 4 l d ) 4ld^2 \space (+4ld) 4ld2 (+4ld) MLP FFN l l l 8 d 2 + 5 d 8d^2+5d 8d2+5d 8 l d 2 + 5 l d 8ld^2+5ld 8ld2+5ld LayerNorm 2 l 2l 2l 2 d 2d 2d 4 l d 4ld 4ld 总参量 12 l d 2 + 13 l d + V d 12ld^2+13ld + Vd 12ld2+13ld+Vd,通常不考虑嵌入层参数 V d Vd Vd,再忽略一次项后模型总参数量近似为 12 l d 2 12ld^2 12ld2
-
考察一些常见模型的参数量估算结果
模型 实际参数量 Transofmer Block 层数 l l l 隐层维度 d d d 12 l d 2 12ld^2 12ld2 DB1 (TransformerXL) 1.2B 24 2048 1 , 207 , 959 , 552 ≈ 1.20 B 1,207,959,552 \approx 1.20\text{B} 1,207,959,552≈1.20B Gato (TransformerXL) 1.18B 24 2048 1 , 207 , 959 , 552 ≈ 1.20 B 1,207,959,552 \approx 1.20\text{B} 1,207,959,552≈1.20B Gato (TransformerXL) 364M 12 1536 339 , 738 , 624 ≈ 340 M 339,738,624 \approx 340\text{M} 339,738,624≈340M Gato (TransformerXL) 79M 8 768 56 , 623 , 104 ≈ 57 M 56,623,104\approx 57\text{M} 56,623,104≈57M LLaMa 6.7B 32 4096 6 , 442 , 450 , 944 ≈ 6.4 B 6,442,450,944 \approx 6.4\text{B} 6,442,450,944≈6.4B LLaMa 13.0B 40 5120 12 , 582 , 912 , 000 ≈ 12.6 B 12,582,912,000 \approx 12.6\text{B} 12,582,912,000≈12.6B LLaMa 32.5B 60 6656 31 , 897 , 681 , 920 ≈ 31.9 B 31,897,681,920 \approx 31.9\text{B} 31,897,681,920≈31.9B
2 计算量估计(FLOPs)
- LLM 中的主要运算是矩阵乘法,故考察 LLM 计算量时,通常只关注矩阵乘法运算对应的浮点计算量
- 设有矩阵
A
∈
R
m
×
n
,
B
∈
R
n
×
p
\pmb{A}\in\mathbb{R}^{m\times n},\pmb{B}\in\mathbb{R}^{n\times p}
A∈Rm×n,B∈Rn×p,矩阵乘法
A
B
\pmb{AB}
AB 可以看作
m
×
p
m\times p
m×p 次 尺寸为
n
n
n 的向量内积运算
A m × n B n × p = [ a 1 ∗ a 2 ∗ ⋮ a m ∗ ] [ b ∗ 1 b ∗ 2 ⋯ b ∗ p ] \pmb{A}_{m\times n}\pmb{B}_{n\times p}= \begin{bmatrix} a_{1*} \\ a_{2*} \\ \vdots \\ a_{m*} \end{bmatrix} \begin{bmatrix} b_{*1}& b_{*2}& \cdots & b_{*p} \\ \end{bmatrix} Am×nBn×p= a1∗a2∗⋮am∗ [b∗1b∗2⋯b∗p] 向量内积运算中要进行 n n n 次乘法和 n − 1 n-1 n−1 次加法运算,因此矩阵乘法的浮点运算量为 2 m n p − m p 2mnp-mp 2mnp−mp - 但是 GPU 计算矩阵乘法时一般使用 FMA (fused multiply–add) 进行计算,一次 FMA 运算操作是 a <-- a + (b * c),包括了一次乘法操作和一次加法操作,相当于一次 MACs(Multiply–Accumulate Operations),而 1MACs = 2FLOPs。故通常把以上矩阵乘法运算的浮点计算量表述为 2 m n p 2mnp 2mnp,以下分析中均基于此进行分析
- 设有矩阵
A
∈
R
m
×
n
,
B
∈
R
n
×
p
\pmb{A}\in\mathbb{R}^{m\times n},\pmb{B}\in\mathbb{R}^{n\times p}
A∈Rm×n,B∈Rn×p,矩阵乘法
A
B
\pmb{AB}
AB 可以看作
m
×
p
m\times p
m×p 次 尺寸为
n
n
n 的向量内积运算
- 本节分析一次训练迭代过程的计算量,设输入 batch 数据尺寸 x ∈ R b × s × d x\in\mathbb{R}^{b\times s\times d} x∈Rb×s×d
2.1 Embedding & LM Head
- Token Embedding 可以直接查 lookup table 不进行矩阵运算;
- 预测多分类头将尺寸为 d d d 的隐藏向量映射为词表大小,矩阵运算尺寸为 [ b × s × d ] × [ d × V ] → [ b × s × V ] [b\times s\times d]\times [d\times V]\to[b\times s\times V] [b×s×d]×[d×V]→[b×s×V],总计算量 2 b s d V 2bsdV 2bsdV。
2.2 Transformer Decoder Block
- 一个 Transformer Decoder Block 的总计算量最多
24
b
s
d
2
+
4
b
s
2
d
24bsd^2 + 4bs^2d
24bsd2+4bs2d
-
Self-attention 层计算过程如下
Q = x W Q , K = x W K , V = x W V A = softmax ( Q K T h ) x o u t = A ⋅ V ⋅ W O + x \begin{array}{l} \pmb{Q}=\pmb{x}\pmb{W}_{Q}, \quad \pmb{K}=\pmb{x}\pmb{W}_{K}, \quad \pmb{V}=\pmb{x}\pmb{W}_{V}\\\\ \pmb{A} = \operatorname{softmax}\left(\frac{\pmb{Q} \pmb{K}^{T} }{\sqrt{h}}\right) \\\\ \pmb{x}_{out} = \pmb{A}·\pmb{V}·\pmb{W}_O + \pmb{x} \end{array} Q=xWQ,K=xWK,V=xWVA=softmax(hQKT)xout=A⋅V⋅WO+x- 计算 Q , K , V Q,K,V Q,K,V:矩阵运算 x W xW xW 尺寸为 [ b × s × d ] × [ d × d ] [b\times s\times d] \times [d\times d] [b×s×d]×[d×d],总计算量 3 × 2 b s d 2 = 6 b s d 2 3\times 2bsd^2 = 6bsd^2 3×2bsd2=6bsd2
- 计算注意力得分:矩阵运算 Q K T Q K^{T} QKT 尺寸为 [ b × n × s × d n ] × [ b × n × d n × s ] → [ b × n × s × s ] [b\times n\times s\times \frac{d}{n}] \times [b \times n \times \frac{d}{n} \times s] \to [b\times n\times s\times s] [b×n×s×nd]×[b×n×nd×s]→[b×n×s×s],总计算量 b n × 2 s 2 d n = 2 b s 2 d bn\times 2s^2\frac{d}{n}=2bs^2d bn×2s2nd=2bs2d
- 汇聚价值信息:矩阵运算 A V AV AV 尺寸为 [ b × n × s × s ] × [ b × n × s × d n ] → [ b × n × s × d n ] [b\times n\times s\times s]\times [b \times n \times s \times \frac{d}{n}] \to[b \times n \times s \times \frac{d}{n}] [b×n×s×s]×[b×n×s×nd]→[b×n×s×nd],总计算量 b n × 2 s 2 d n = 2 b s 2 d bn\times 2s^2\frac{d}{n}=2bs^2d bn×2s2nd=2bs2d
- 输出投影:矩阵运算 V s W O V_sW_O VsWO 尺寸为 [ b , s , d ] × [ d , d ] → [ b , s , d ] [b,s,d]\times [d,d]\to[b,s,d] [b,s,d]×[d,d]→[b,s,d],总计算量 2 b s d 2 2bsd^2 2bsd2
-
MLP 块计算过程如下
x = f gelu ( x out W 1 ) W 2 + x out \pmb{x}=f_{\text {gelu }}\left(\pmb{x}_{\text {out }} \pmb{W}_{1}\right) \pmb{W}_{2}+\pmb{x}_{\text {out }} x=fgelu (xout W1)W2+xout - 第一个线性层:矩阵运算 x out W 1 x_{\text {out }} W_{1} xout W1 尺寸为 [ b × s × d ] × [ d × 4 d ] → [ d × s × 4 d ] [b\times s \times d]\times [d\times 4d] \to[d\times s\times 4d] [b×s×d]×[d×4d]→[d×s×4d],总计算量 8 b s d 2 8bsd^2 8bsd2
- 第二个线性层:矩阵运算 ( x out W 1 ) W 2 (x_{\text {out }} W_{1}) W_{2} (xout W1)W2 尺寸为 [ b × s × 4 d ] × [ 4 d × d ] → [ d × s × d ] [b\times s \times 4d]\times [4d\times d] \to[d\times s\times d] [b×s×4d]×[4d×d]→[d×s×d],总计算量 8 b s d 2 8bsd^2 8bsd2
-
2.3 反向传播的计算量
- 以上分析了正向传播过程中的计算量,本节进一步说明反向传播计算量约为正向传播的两倍。考虑简单的 MLP 模型,不考虑偏置,设激活函数为
σ
\sigma
σ,输入为
x
1
x^1
x1,前向传播和对应的反向传播计算过程如下
1 z 1 = W 1 x 1 ∂ L ∂ W 1 = ∂ L ∂ z 1 ∂ z 1 ∂ W 1 = [ ( W 2 ) T ( ∂ L ∂ a 2 ⊙ σ ′ ( z 2 ) ) ⊙ σ ′ ( z 1 ) ] T x 1 2 a 1 = σ ( z 1 ) ∂ L ∂ z 1 = ∂ L ∂ a 1 ∂ a 1 ∂ z 1 = ( W 2 ) T ( ∂ L ∂ a 2 ⊙ σ ′ ( z 2 ) ) ⊙ σ ′ ( z 1 ) ∂ L ∂ a 1 = ∂ L ∂ z 2 ∂ z 2 ∂ a 1 = ( W 2 ) T ( ∂ L ∂ a 2 ⊙ σ ′ ( z 2 ) ) 3 z 2 = W 2 a 1 ∂ L ∂ W 2 = ∂ L ∂ z 2 ∂ z 2 ∂ W 2 = ( ∂ L ∂ a 2 ⊙ σ ′ ( z 2 ) ) T a 1 4 a 2 = σ ( z 2 ) ∂ L ∂ z 2 = ∂ L ∂ a 2 ∂ a 2 ∂ z 2 = ∂ L ∂ a 2 ⊙ σ ′ ( z 2 ) 5 L = l o s s ( a 2 , y ) ∂ L ∂ a 2 \begin{aligned} &1&z^1 = W^1x^1 &&&\frac{\partial L}{\partial W^1} = \frac{\partial L}{\partial z^1}\frac{\partial z^1}{\partial W^1} = \left[(W^2)^T\left(\frac{\partial L}{\partial a^2}\odot\sigma'(z^2)\right)\odot\sigma'(z^1)\right]^T x^1\\ &2&a^1 = \sigma(z^1) &&&\frac{\partial L}{\partial z^1} = \frac{\partial L}{\partial a^1}\frac{\partial a^1}{\partial z^1} = (W^2)^T\left(\frac{\partial L}{\partial a^2}\odot\sigma'(z^2)\right)\odot\sigma'(z^1)\\ &&\\ && &&& \frac{\partial L}{\partial a^1} = \frac{\partial L}{\partial z^2}\frac{\partial z^2}{\partial a^1} = (W^2)^T\left(\frac{\partial L}{\partial a^2}\odot\sigma'(z^2)\right) \\ &3&z^2 = W^2a^1 &&&\frac{\partial L}{\partial W^2} = \frac{\partial L}{\partial z^2}\frac{\partial z^2}{\partial W^2} = \left(\frac{\partial L}{\partial a^2}\odot\sigma'(z^2)\right)^Ta^1 \\ &4&a^2 = \sigma(z^2) &&&\frac{\partial L}{\partial z^2} = \frac{\partial L}{\partial a^2}\frac{\partial a^2}{\partial z^2} = \frac{\partial L}{\partial a^2}\odot\sigma'(z^2) \\ &&\\ &5&L = loss(a^2,y) &&&\frac{\partial L}{\partial a^2} \end{aligned} 12345z1=W1x1a1=σ(z1)z2=W2a1a2=σ(z2)L=loss(a2,y)∂W1∂L=∂z1∂L∂W1∂z1=[(W2)T(∂a2∂L⊙σ′(z2))⊙σ′(z1)]Tx1∂z1∂L=∂a1∂L∂z1∂a1=(W2)T(∂a2∂L⊙σ′(z2))⊙σ′(z1)∂a1∂L=∂z2∂L∂a1∂z2=(W2)T(∂a2∂L⊙σ′(z2))∂W2∂L=∂z2∂L∂W2∂z2=(∂a2∂L⊙σ′(z2))Ta1∂z2∂L=∂a2∂L∂z2∂a2=∂a2∂L⊙σ′(z2)∂a2∂L 其中 ⊙ \odot ⊙ 是矩阵对应位置元素相乘 - 关注反向传播过程中的矩阵乘法操作,注意到反向传播过程中每个非第一层都有两次矩阵乘法操作(计算 ∂ L ∂ W i , ∂ L ∂ a i \frac{\partial L}{\partial W^i}, \frac{\partial L}{\partial a^i} ∂Wi∂L,∂ai∂L),而相应的前向过程中只有一次(计算 z i = W i a i z^i=W^ia^i zi=Wiai)。随着网络层数增加,反向传播计算量会越来越接近正向传播计算量的两倍。进一步的详细说明请参考:浅谈后向传递的计算量大约是前向传递的两倍
2.4 总结
-
Decoder-Only 模型各模块前向传播的矩阵乘法计算量如下
模块 数量 单个计算量 总计算量 Token Embedding 1 - - LM Head 1 2 b s d V 2bsdV 2bsdV 2 b s d V 2bsdV 2bsdV Self-attention l l l 8 b s d 2 + 4 b s 2 d 8bsd^2 + 4bs^2d 8bsd2+4bs2d 8 b s l d 2 + 4 b s 2 l d 8bsld^2 + 4bs^2ld 8bsld2+4bs2ld MLP FFN l l l 16 b s d 2 16bsd^2 16bsd2 16 b s l d 2 16bsld^2 16bsld2 一次前向传播的总计算量为 24 b s l d 2 + 4 b s 2 l d + 2 b s d V 24bsld^2 + 4bs^2ld + 2bsdV 24bsld2+4bs2ld+2bsdV。通常不考虑嵌入层计算量 2 b s d V 2bsdV 2bsdV,当 d > > s d>>s d>>s 时计算量近似为 24 b s l d 2 24bsld^2 24bsld2
-
进一步考虑反向传播的计算量,一次训练迭代的总计算量(FLOPs)近似为 C ≈ 72 b s l d 2 C \approx 72bsld^2 C≈72bsld2,注意到输入 Token 数据量 D = b s D = bs D=bs,模型参数量由第一节分析为 N ≈ 12 l d 2 N\approx12ld^2 N≈12ld2,三者间有以下重要关系
C ≈ 6 N D C\approx 6ND C≈6ND 这可以理解为:一次训练迭代中,对于每个token,每个模型参数,需要进行约 6 次浮点数运算可以用此结论正确估计 GPT3-175B 的计算量
如图所示,GPT3-175B 参数量 174600M,训练数据量为 300B Token,总计算量为 3.14E+23,利用以上关系估计为
6 × 174600 × 1 0 6 × 300 × 1 0 9 = 3.143 × 1 0 23 FLOPs 6\times 174600\times 10^6 \times 300 \times 10^9 = 3.143\times 10^{23} \text{ FLOPs} 6×174600×106×300×109=3.143×1023 FLOPs
2.5 补充
- 有了计算量,就可以结合硬件平台评估自己的训练速度是否正常。A100显卡不做任何优化的情况下,tflop/s 应该达到90的底线,正常约为120,用 flash attention 2 优化的可达 200+。另外也可以预估训练时间
训练时间 ≈ 6 N D GPU数 × GPU峰值FLPOS × GPU利用率 \text { 训练时间 } \approx \frac{6 ND}{\text{GPU数 } \times \text{GPU峰值FLPOS } \times \text{GPU利用率}} 训练时间 ≈GPU数 ×GPU峰值FLPOS ×GPU利用率6ND 数据加载、优化器更新、多卡通信和记录日志得都会影响 GPU 利用率,一般在 [ 0.3 , 0.55 ] [0.3,0.55] [0.3,0.55] 之间。 - 注意到前向过程计算的所有激活值
a
a
a 通常都会保存下来用于反向传播的梯度计算(如2.3节中的第3步),这会导致大量显存占用,对于 LLM 训练不利。一种改进方案是使用激活重计算技术来减少中间激活显存,它在反向传播过程中进行一次额外的前向传递来临时计算激活值,这时有
C ≈ 8 N D C\approx 8ND C≈8ND - 进一步考虑 Encoder-Decoder 模型的计算量。由于这类 LLM 中输入只会过encoder,输出只会过decoder,假设二者分别占一半的参数量和数据量,则参数量相同的情况下,其整体计算量约为
6 ⋅ N 2 ⋅ D 2 + 6 ⋅ N 2 ⋅ D 2 = 3 N D 6·\frac{N}{2}·\frac{D}{2} + 6·\frac{N}{2}·\frac{D}{2} = 3ND 6⋅2N⋅2D+6⋅2N⋅2D=3ND 也就是说,参数量相同的情况下,Encoder-Decoder 架构的模型计算量约为 Decoder-only 模型的一半。大部分在两者间进行对比的文章会使 Encoder-Decoder 类模型具有两倍的参数,使其推理成本接近