总内存=内存模态+ 内存激活+ 内存梯度
这里的Memory_modal是指存储模型所有参数所需的内存。 memory_activations 是在前向传播中计算和存储的中间变量,计算梯度时需要这些变量。因为模型中梯度的数量通常等于中间变量的数量,所以内存_激活=内存_梯度。因此它可以写成:
总内存=内存模态+ 2 * 内存激活
所以当我们计算总体内存需求时,我们只需要找到memory_modal和memory_activations即可。
估算模型的内存
我们以GPT 为例。 GPT 由许多Transformer 块组成(稍后我将使用n_tr_blocks 来表示其数量)。每个变压器块包含以下结构:
multi_headed_attention --layer_normalization --MLP --layer_normalization
每个multi_headed_attention 元素由key、value 和query 组成。它包括n_head注意力头和dim维度。 MLP是包含n_head * dim的大小。这些权重都占用内存,那么:
memory_modal=multi_headed_attention 的内存+ MLP 的内存=value 的内存+ key 的内存+ query 的内存+ MLP 的内存=square_of(n_head * dim) + square_of(n_head * dim) + square_of(n_head * dim) + square_of(n_head * dim)=4*square_of(n_head * dim) 因为我们的模型包含n 个单元。所以最终的记忆就变成了:
内存模态=4*n_tr_blocks*square_of(n_head * 暗淡)
上述估计没有考虑偏差所需的内存,因为这主要是静态的,不依赖于批量大小、输入序列等。
估算中间变量的内存
多头attention通常使用softmax,可以写为:
multi_headed_attention=softmax(查询* 键* 序列长度) * 值
k、q、v 的维度为:
[batch_size、n_head、sequence_length、dim]
multi_headed_attention 操作将产生以下形状:
[批次大小、n_head、序列长度、序列长度]
所以最终的记忆是:
memory_softmax=批量大小* n_head * square_of(sequence_length)
q*k*sequence_length运算乘以值的形状为[batch_size, n_head,equence_length,dim]。 MLP 也具有相同的维度:
MLP 的内存=batch_size * n_head *equence_length *dim 值的内存=batch_size * n_head *sequence_length *dim
我们将以上综合起来,单个变压器的中间变量为:
内存激活=内存软最大值+ 内存值+ 内存_MLP=批量大小* n_head * square_of(序列长度) + 批量大小* n_head * 序列长度* 暗淡+ 批量大小* n_head * 序列长度* 暗淡=批量大小* n_head * 序列长度* (序列长度+ 2*暗淡)
乘以块数,模型的所有memory_activations 为:
n_tr_blocks * (batch_size * n_head *equence_length * (sequence_length + 2*dim))
整合在一起
我们总结一下上面两个公式。如果您想查看结果,请看这里。变压器模型所需的总内存为:
总内存=内存模态+ 2 * 内存激活
模型参数记忆:
4*n_tr_blocks*square_of(n_head * 暗淡)
中间变量存储器:
n_tr_blocks *(批量大小* n_head * 序列长度*(序列长度+ 2*dim))
我们可以使用以下符号更简洁地编写这些公式。
R=n_tr_blocks=转换器层堆栈的数量N=n_head=注意力头的数量D=dim=注意力头的维度B=batch_size=批量大小S=equence_length=输入序列内存模态的长度=4 * R * N^2 * D^2 记忆激活=RBNS(S + 2D)
所以训练模型时的总内存使用量为:
M=(4 * R * N^2 * D^2) + RBNS(S + 2D) 因为内存占用与序列长度密切相关,如果有一个很长的序列长度S D S + 2D —— S,则这样的计算可以改为:
M=(4 * R * N^2 * D^2) + RBNS(S)=4*R*N^2*D^2 + RBNS^2
可以看出,对于较大的序列,M与输入序列长度的平方成正比,与batch size成线性正比。这也证明了序列长度和内存占用有很大的关系。
所以最终的内存使用估计是:
标签:
用户评论
哎呀,Transformer模型这么复杂,估算显存大小还真是头疼啊。不过这篇博文给我提供了不少思路,谢谢作者!
有15位网友表示赞同!
显存大小估算这事儿得具体模型具体分析吧,希望这篇博文能帮到像我这样刚接触Transformer的小白。
有8位网友表示赞同!
Transformer模型显存大小估算,这个标题就让我头大了。不过看看评论,好像大家都有点同感,看来我不是一个人在战斗。
有15位网友表示赞同!
学Transformer模型的时候,显存大小估算总是让我摸不着头脑。这篇博文太及时了,学到了新知识。
有13位网友表示赞同!
Transformer模型显存大小估算,这个标题真是点醒了我。之前一直觉得这是个难题,现在想想也不是那么难。
有6位网友表示赞同!
刚看完这篇博文,感觉估算Transformer模型显存大小也不是那么困难嘛。作者分析得很详细,感谢分享!
有5位网友表示赞同!
Transformer模型显存大小估算,这个话题我一直想了解,今天终于找到了一篇不错的博文。希望对以后的工作有所帮助。
有11位网友表示赞同!
估算Transformer模型的显存大小,这个操作对我来说是新手村任务。这篇博文就像一把钥匙,打开了新世界的大门。
有17位网友表示赞同!
Transformer模型显存大小估算,这真是一个让人头疼的问题。不过看到这篇博文,我觉得自己离解决它又近了一步。
有19位网友表示赞同!
估算Transformer模型显存大小,这个操作听起来好专业。希望这篇博文能让我这个门外汉也稍微了解一下。
有16位网友表示赞同!
Transformer模型显存大小估算,这个标题就让我对这篇博文充满了期待。看完后发现,作者的讲解真的很实用。
有15位网友表示赞同!
估算Transformer模型的显存大小,之前我一直觉得这是个难题。这篇博文让我看到了希望,谢谢作者!
有18位网友表示赞同!
Transformer模型显存大小估算,这个话题真是让人纠结。不过看完这篇博文,我觉得自己有信心解决了。
有5位网友表示赞同!
Transformer模型显存大小估算,这个操作对于做深度学习的人来说很重要。这篇博文给我带来了不少启发。
有11位网友表示赞同!
估算Transformer模型的显存大小,这个操作听起来好复杂。不过作者用通俗易懂的语言解释了,真是太感谢了。
有19位网友表示赞同!
Transformer模型显存大小估算,这个话题真是让我受益匪浅。作者的分析方法很实用,我会好好研究的。
有15位网友表示赞同!
Transformer模型显存大小估算,这篇博文让我对这一领域有了更深入的了解。希望作者能继续分享更多干货。
有6位网友表示赞同!
估算Transformer模型的显存大小,这个操作对我来说是个挑战。不过这篇博文让我看到了希望,谢谢作者!
有19位网友表示赞同!
Transformer模型显存大小估算,这个话题对我来说是第一次接触。这篇博文让我学到了很多,太感谢了!
有12位网友表示赞同!