序列模型(3)—— LLM的参数量和计算量


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)

      1. 投影矩阵 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} WORd×d,一共 4 d 2 4d^2 4d2

      2. 如果每个矩阵带偏置,则参数量再加 4 d 4d 4d

    • MLP 块总参数量 8 d 2 + 5 d 8d^2+5d 8d2+5d

      1. 从输入层到隐藏层的线性层尺寸 R d × 4 d \mathbb{R}^{d\times 4d} Rd×4d,带偏置,参数量 4 d 2 + 4 d 4d^2+4d 4d2+4d
      2. 从隐藏层到输出层的线性层尺寸 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

      1. 缩放参数 γ \gamma γ,尺寸 R 1 × d \mathbb{R}^{1\times d} R1×d,参数量 d d d
      2. 平移参数 β \beta β,尺寸 R 1 × d \mathbb{R}^{1\times d} R1×d,参数量 d d d

1.3 总结

  • Decoder-Only 模型各模块参数量如下

    模块数量单个参数量总参数量
    Token Embedding1 V d Vd Vd V d Vd Vd
    LM Head1--
    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.2B242048 1 , 207 , 959 , 552 ≈ 1.20 B 1,207,959,552 \approx 1.20\text{B} 1,207,959,5521.20B
    Gato (TransformerXL)1.18B242048 1 , 207 , 959 , 552 ≈ 1.20 B 1,207,959,552 \approx 1.20\text{B} 1,207,959,5521.20B
    Gato (TransformerXL)364M121536 339 , 738 , 624 ≈ 340 M 339,738,624 \approx 340\text{M} 339,738,624340M
    Gato (TransformerXL)79M8768 56 , 623 , 104 ≈ 57 M 56,623,104\approx 57\text{M} 56,623,10457M
    LLaMa6.7B324096 6 , 442 , 450 , 944 ≈ 6.4 B 6,442,450,944 \approx 6.4\text{B} 6,442,450,9446.4B
    LLaMa13.0B405120 12 , 582 , 912 , 000 ≈ 12.6 B 12,582,912,000 \approx 12.6\text{B} 12,582,912,00012.6B
    LLaMa32.5B606656 31 , 897 , 681 , 920 ≈ 31.9 B 31,897,681,920 \approx 31.9\text{B} 31,897,681,92031.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} ARm×n,BRn×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= a1a2am [b1b2bp] 向量内积运算中要进行 n n n 次乘法和 n − 1 n-1 n1 次加法运算,因此矩阵乘法的浮点运算量为 2 m n p − m p 2mnp-mp 2mnpmp
    • 但是 GPU 计算矩阵乘法时一般使用 FMA (fused multiply–add) 进行计算,一次 FMA 运算操作是 a <-- a + (b * c),包括了一次乘法操作和一次加法操作,相当于一次 MACs(Multiply–Accumulate Operations),而 1MACs = 2FLOPs。故通常把以上矩阵乘法运算的浮点计算量表述为 2 m n p 2mnp 2mnp,以下分析中均基于此进行分析
  • 本节分析一次训练迭代过程的计算量,设输入 batch 数据尺寸 x ∈ R b × s × d x\in\mathbb{R}^{b\times s\times d} xRb×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(h QKT)xout=AVWO+x

      1. 计算 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
      2. 计算注意力得分:矩阵运算 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
      3. 汇聚价值信息:矩阵运算 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
      4. 输出投影:矩阵运算 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 

      1. 第一个线性层:矩阵运算 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
      2. 第二个线性层:矩阵运算 ( 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)W1L=z1LW1z1=[(W2)T(a2Lσ(z2))σ(z1)]Tx1z1L=a1Lz1a1=(W2)T(a2Lσ(z2))σ(z1)a1L=z2La1z2=(W2)T(a2Lσ(z2))W2L=z2LW2z2=(a2Lσ(z2))Ta1z2L=a2Lz2a2=a2Lσ(z2)a2L 其中 ⊙ \odot 是矩阵对应位置元素相乘
  • 关注反向传播过程中的矩阵乘法操作,注意到反向传播过程中每个非第一层都有两次矩阵乘法操作(计算 ∂ L ∂ W i , ∂ L ∂ a i \frac{\partial L}{\partial W^i}, \frac{\partial L}{\partial a^i} WiL,aiL),而相应的前向过程中只有一次(计算 z i = W i a i z^i=W^ia^i zi=Wiai)。随着网络层数增加,反向传播计算量会越来越接近正向传播计算量的两倍。进一步的详细说明请参考:浅谈后向传递的计算量大约是前向传递的两倍

2.4 总结

  • Decoder-Only 模型各模块前向传播矩阵乘法计算量如下

    模块数量单个计算量总计算量
    Token Embedding1--
    LM Head1 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 C72bsld2,注意到输入 Token 数据量 D = b s D = bs D=bs,模型参数量由第一节分析为 N ≈ 12 l d 2 N\approx12ld^2 N12ld2,三者间有以下重要关系
    C ≈ 6 N D C\approx 6ND C6ND 这可以理解为:一次训练迭代中,对于每个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 C8ND
  • 进一步考虑 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 62N2D+62N2D=3ND 也就是说,参数量相同的情况下,Encoder-Decoder 架构的模型计算量约为 Decoder-only 模型的一半。大部分在两者间进行对比的文章会使 Encoder-Decoder 类模型具有两倍的参数,使其推理成本接近
  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云端FFF

所有博文免费阅读,求打赏鼓励~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值