Decoder|Decoder Only 模型的参数量和计算量

2024/10/05 Decoder 共 3177 字,约 10 分钟
AI Freedom

本文 Decoder Only 模型的参数量和计算量,主要包括 Transformer结构、参数量方面、显存占用、计算量方面、参数量和计算量的关系、训练时间预估等等。

https://zhuanlan.zhihu.com/p/830885346

Decoder Only 模型的参数量和计算量

Transformer

参数量方面

  • 大模型 = Embedding + 若干层 Transformer Layer
  • 每层 Transformer Layer 主要由 self attention 层 和 MLP 层构成

self attention

计算 self attention 层的参数:

  • WQ、偏置:h×h,1×h
  • WK、偏置:h×h,1×h
  • WV、偏置:h×h,1×h
  • W0、偏置:h×h,1×h

总计: self attention 层参数共,4h2+4h

MLP

计算 MLP 层的参数,以 GPT-3 为例子

  • h – 4h – h
  • 上投影 W1、偏置:h×4h,1×4h
  • 下投影,W2、偏置:4h×h,1×h

  • 总计:MLP 层参数共,8h2+5h

LayerNorm

  • 在 self attention 层和 MLP 层后均有一个 LayerNorm 层,每个LN层均包含两个可训练的参数,因此LN层共有参数 2h×h=4h

Embedding

  • Embedding 层包含的参数: Vh
  • V 词库token大小

综上:

  • 一层 transformer decoder layer 共包含参数:12h2+13h
  • 一个包含l层 decoder layer 的生成模型,共包含参数:l(12h2+13h)+Vh

eg: QWen-1.8B:l=24,h=2048,V=151851,按照上面的公式计算得到,参数量大约为1.92B

显存占用

推理

  • 推理时,仅参数占用显存,每个fp16精度的参数占用2个byte,fp32精度的参数占用4个byte。
  • 因此一个7B的fp16精度模型,大概需要占用 7×2=14GB 的显存

训练

以fp16方式训练时,训练过程中需要保存的数据有:

  • 模型参数:fp16
  • 参数梯度:fp16
  • 优化器状态:fp32一阶动量、fp32二阶动量、fp32模型参数、fp32参数梯度

一个fp16的数据占用2个byte,fp32占用4个byte。因此,对于参数量为 Φ 的模型来说,共需要 (2+2+4×4)Φ=20Φ 的显存空间。

eg:

一个7B的模型,大约需要 20×7×109/10243=130GB 显存空间

计算量方面

前置:对于矩阵 ARm×p,BRp×n,AB相乘的计算量:mnp2

  • 其中,mn 表示结果矩阵包含 mn 个元素
  • p2 表示每个元素需要经过 p 次加法和 p 次乘法计算得到

self attention

self attention 的计算量:假设输入数据的形式为 [b,L] (batch, sequence length)

  • x=softmax(QKTh)VW0+x

  • Q=xWQ,K=xWK,V=xWV

    • eg: Q=xWQ, [b,L,h][h,h]=[b,L,h], 计算量 2bLhh=2bLh2

具体计算量:

  • 计算 QKV: 三次 xb×L×hWQh×h,计算量为 32bLh2=6bLh2
  • 计算 QKT: Qb×nhead×L×hheadKTb×nhead×hhead×L,结果是 bnheadLL,计算量为 2bnheadLLhhead=2bL2h (nheadhhead=h)
  • 计算 SV: Sb×nhead×L×LVb×nhead×L×hhead,结果是 bnheadLhhead = bLh,计算量为 2bnheadLhheadL=2bL2h
  • 结果线性映射 OW0: Ob×L×hW0h×h, 结果是 bLh,计算量为 2bLhh=2bLh2

总计,self attention 层的计算量共为,8bLh2+4bL2h

MLP

MLP层的计算量可以表示为:x=f(xoutW1)W2+xout

  • 计算 xmid=xoutb×L×hW1h×4h,结果是 bL4h,计算量为 2bL4hh=8bLh2
  • 计算 xmidb×L×4hW24h×h,结果是 bLh,计算量为 2bLh4h=8bLh2

总计,MLP 层的计算量共为,16bLh2

Embedding

隐藏向量映射到词表,运算量为 2bLhV

综上:

  • 一层 transformer decoder 进行一次前向计算的计算量:24bLh2+4bL2h
  • 一个包含l层decoder layer的生成模型,对于其中一个batch,进行一次前向计算的计算量是 l(24bLh^2 + 4bL^2h)+2bLhV

参数量和计算量的关系

  • 在前向传播中,输出 token 总数为 bL,模型总参数量为 12h2+13h

  • 可以计算出,每个 token,每个参数需要的浮点数计算次数为

  • 24bLh2+4bL2hbL(12h2+13h)=24h+4L12h+132

即,前向传播一次,每token、每个参数需要进行 2次浮点数运算 FLOPS,反向传播所需计算量是前向传播的2倍,因此前向+反响传播,每token、每个参数需要进行6次浮点数计算 FLOPS

以 GPT3-175B为例子,其参数 174600M,训练数据为300B,则训练所需要的总计算量为 61746001063001093.143×1023flops

训练时间预估

在实际训练中,为了节省中间激活的显存占用,通常会在反向传播时进行一次重新计算,因此会引入一次额外的前向传播,此时,一次完整的前向反向传播,每token每参数共需要进行8次浮点数运算。训练时间估计可以参考如下公式:

T=8×Ntokens×NparametersGPU×GPUflops×GPU

以GPT3-175B为例子,需要的训练时间为

8300109174600106102431210120.452921340s34days

文档信息

Search

    Table of Contents

    目录