总内存=内存模态+ 内存激活+ 内存梯度

这里的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 * 暗淡)

如何估算Transformer模型的显存大小

上述估计没有考虑偏差所需的内存,因为这主要是静态的,不依赖于批量大小、输入序列等。

估算中间变量的内存

多头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)

如何估算Transformer模型的显存大小

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 * 暗淡)

如何估算Transformer模型的显存大小

中间变量存储器:

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位网友表示赞同!

标签: