使用不同 GPU 进行 Transformer 的多 GPU 训练

xeb*_*xeb 6 machine-learning huggingface-transformers

我想使用 Huggingface\xe2\x80\x99s Transformers 微调 GPT-2 模型。最好是中号型号,但如果可能的话大号。目前,我有一块内存为 11GB 的 RTX 2080 Ti,我可以很好地训练小模型。

\n\n

我的问题是:如果我将旧的 Tesla K80 (24GB) 添加到我的机器并分发训练,我会遇到任何问题吗?我找不到有关在训练期间使用不同容量 GPU 的信息以及我可能遇到的问题。

\n\n

我的模型大小限制本质上是所有可用 GPU 内存的总和吗?(35GB?)

\n\n

我\xe2\x80\x99m 对在AWS 中执行此操作不感兴趣。

\n

Ber*_*abi 2

你已经解决了你的问题。那太棒了。我想指出一种不同的方法并解决几个问题。

我的模型大小限制本质上是所有可用 GPU 内存的总和吗?(35GB?)

这取决于您使用的训练技术。标准数据并行性将模型、梯度和优化器状态复制到每个 GPU。因此每个 GPU 必须有足够的内存来容纳所有这些。数据分布在多个 GPU 上。然而,瓶颈通常是优化器状态和模型而不是数据。

最先进的培训方法是ZeRO。不仅数据集,模型参数、梯度和优化器状态也被分割到 GPU 上。这使您可以训练大型模型而不会出现 OOM。请参阅下面论文中的精美插图。基线是我提到的标准情况。他们逐渐在 GPU 上分割优化器状态、梯度和模型参数,并比较每个 GPU 的内存使用情况。

在此输入图像描述

该论文的作者创建了一个名为 DeepSpeed 的库,并且很容易将其与 Huggingface 集成。这样我就能将模型大小从 2.6 亿增加到 110 亿:)

如果你想详细了解它是如何工作的,这里是论文: https://arxiv.org/pdf/1910.02054.pdf

有关将 DeepSpeed 与 Huggingface 集成的更多信息,请访问: https ://huggingface.co/docs/transformers/main_classes/deepspeed

PS:有一种模型并行技术,其中每个 GPU 训练模型的不同层,但它失去了流行度并且没有被积极使用。