你正在谷歌进行机器学习工程师面试。 面试官:我们需要在1000个GPU上训练一个大型语言模型。你将如何确保所有GPU共享它们所学到的内容? 你:使用一个中央参数服务器来聚合和重新分配权重。 面试结束。 这是你错过的内容:
在多GPU训练中,一个主要的运行时瓶颈发生在GPU同步期间。 例如,在通过数据并行进行的多GPU训练中: - 相同的模型分布到不同的GPU上。 - 每个GPU处理整个数据集的不同子集。 查看这个👇
这导致不同设备之间的梯度不同。 因此,在每个GPU设备上更新模型参数之前,我们必须将梯度传达给所有其他设备以进行同步。 接下来,让我们了解两种常见的策略!
算法 1) 全规约 一种明显的方法是将一个设备的梯度发送到所有其他设备以进行同步。 但这会占用大量带宽。 如果每个 GPU 有“N”个元素,并且有“G”个 GPU,则总传输量为 G*(G-1)*N 个元素 👇
我们可以通过将所有元素转移到一个GPU,计算最终值,然后将其发送回所有其他GPU来优化这一点。 这是一个显著的改进。 但现在单个GPU必须接收、计算并将梯度反馈,因此这并不具备可扩展性。
算法 2) 环形归约 阶段 #1) 分享归约 首先,梯度在每个 GPU 上分成 G 个段(G = GPU 的总数)。 检查这个 👇
在一次迭代中,每个GPU将一个段发送给下一个GPU: - GPU1将a₁发送给GPU2,在那里它被加到b₁ - GPU2将b₂发送给GPU3,在那里它被加到c₂ - GPU3将c₃发送给GPU4,在那里它被加到d₃ - GPU4将d₄发送给GPU1,在那里它被加到a₄ 查看这个👇
这个过程再次进行: - GPU1 将 (d₄+a₄) 发送给 GPU2,在那里它被加到 b₄。 - GPU2 将 (a₁+b₁) 发送给 GPU3,在那里它被加到 c₁。 - GPU3 将 (b₂+c₂) 发送给 GPU4,在那里它被加到 d₂。 - GPU4 将 (c₃+d₃) 发送给 GPU1,在那里它被加到 a₃。 查看这个 👇
在最后的迭代中,以下段落被转移到下一个GPU。 这导致每个GPU都有一个完整的段落,我们可以将这些完整的段落传输到所有其他GPU。 查看这个 👇
阶段 #2) 仅共享 现在每个 GPU 都拥有一个完整的段,我们可以将这些完整的段传输到所有其他 GPU。 这个过程与我们上面讨论的类似,因此我们不会详细说明。 迭代 1 如下所示👇
接下来,我们进行第2和第3次迭代。 这些与我们在第一阶段学到的内容类似。 查看这个 👇
就这样! 模型权重在多个GPU之间已同步。 虽然传输的总元素数量与我们在“单GPU主控”方法中相同,但这种环形方法更具可扩展性,因为它不会将整个负载放在一个GPU上。 查看这个 👇
默认情况下,深度学习模型仅使用单个 GPU 进行训练,即使有多个 GPU 可用。 训练模型的理想方法是将训练工作负载分配到多个 GPU 上。 该图展示了四种多 GPU 训练策略👇
362.51K