https://zhuanlan.zhihu.com/p/643829565
采用decoder-only框架transformer模型的模型参数量、计算量、中间激活值、KV cache。
为了方便分析,先定义好一些数学符号。记transformer模型的层数为
transformer模型由
包含$W_Q$,$W_K$,$W_V$三个权重矩阵和偏置,每个权重矩阵形状是$[h,h]$,偏置形状是$[h,1]$
Self-attention参数量
包含两个线性层。
一般地,
第一个线性层是先将维度从
第二个线性层再将维度从
MLP块的参数量为
self-attention块和MLP块各包含了2个可训练模型参数:缩放参数 γ 和平移参数 β ,形状都是
总的,每个transformer层的参数量为
词向量通常等于隐藏维度$h$,词嵌入矩阵的参数量为$Vh$
l层transformer的可训练模型参数量为$l(12h^2+13h)+Vh$
当h较大时,近似$12lh^2$
实际参数量 | 隐藏维度h | 层数l | 近似值 12lh^2 |
---|---|---|---|
6.7B | 4096 | 32 | 6,442,450,944 |
13.0B | 5120 | 40 | 12,582,912,000 |
32.5B | 6656 | 60 | 31,897,681,920 |
65.2B | 8192 | 80 | 64,424,509,440 |
在训练神经网络的过程中,占用显存的大头主要分为四部分: 模型参数、前向计算过程中产生的中间激活、后向传递计算得到的梯度、优化器状态 。
在一次训练迭代中,每个可训练模型参数都会对应1个梯度,并对应2个优化器状态(Adam优化器梯度的一阶动量和二阶动量)
设模型参数量为
float16数据类型的元素占2个bytes,float32数据类型的元素占4个bytes。
在混合精度训练中,会使用float16的模型参数进行前向传递和后向传递,计算得到float16的梯度;
在优化器更新模型参数时,会使用float32的优化器状态、float32的梯度、float32的模型参数来更新模型参数。
$$ 2+4+2+4+4+4 = 20 bytes
$$
推理阶段模型参数占用的显存大概是