赞
踩
以参数量13B大模型为例,
其中B是Billion,代表十亿参数,13B就是130亿参数
其中每个参数全精度是fp32,也就是float32,占用32位bit,也就是4byte字节。
那么全精度13B模型占用
训练的显存主要由四部分组成:模型参数、梯度参数、优化器参数、数据的中间计算结果
如果进行全量fp32精度训练,模型参数需占用48.4GB,每个参数对应一个梯度,那么梯度参数同样需占用48.4GB。
优化器参数,是根据梯度来计算的,以Adam优化器来说,其计算和更新如下:
其中,
可以看到,其中
对于数据的中间计算结果,我们来大致计算一下需要多少显存空间。
输入embedding层:
输入参数维度是[batch_size,sequence_length],经embedding层后维度是[batch_size,sequence_length,hidden_size]。该计算仅需一次,不需要像transformer结构有多层
transformer中的计算:
attention计算 :
经QKV矩阵embedding后,QKV三矩阵都是[hidden_size,hidden_size],计算后有3个输出结果维度都是[batch_size,sequence_length,hidden_size]。
softmax及dropout后获得attention_probs,维度[batch_size,num_attention_heads,sequence_length,sequence_length]。
乘V获取结果,维度[batch_size,num_attention_heads,sequence_length,
维度变换获取attention计算结果,维度[batch_size,sequence_length,hidden_size]。
进行add&norm,具体要经过dense、dropout、残差连接、LayerNorm,维度[batch_size,sequence_length,hidden_size]。
FFN前向神经网络:
经过前向神经网络计算后的维度[batch_size,sequence_length,hidden_size],但它计算中有个状态参数量会更大,我们计算占用取这个维度[batch_size,sequence_length,intermediate_size]。
与attention计算结果进行add&norm,维度[batch_size,sequence_length,hidden_size]。
以上1层transformer encoder的计算参数量有:
我们以LLaMA或Baichuan的13B模型为例,它们的参数是:隐藏层维度hidden_size: 5120,最大序列长度model_max_length: 4096,intermediate_size: 13696,num_attention_heads: 40,层数num_hidden_layers: 40。虽然模型有40层,但下一层的计算结果会覆盖上一层的结果,不然40层占用显存太大了,现在的显存都放不下。
以batch_size为1,长度最大计算参数量
显存占用
所以经目前粗略估算,全参数全精度微调,batch_size=1,至少需要显存
混合精度训练时,计算时用半精度(fp16,bf16),参数更新用全精度,所以需要全精度时一半的显存占用,再加上一个模型全精度的参数量,显存占用
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。