@YuvrajS9886: 在数据并行之后,我们转向模型并行,从流水线并行开始。论文:GPipe:使用微批处理轻松扩展…

X AI KOLs Timeline 论文

摘要

本线程解释了GPipe,这是一篇关于使用微批处理和激活检查点技术跨多个GPU扩展大模型的流水线并行论文。

在数据并行之后,我们转向模型并行,从流水线并行开始。 论文:GPipe:使用微批处理轻松扩展流水线并行 是什么? 当模型无法再容纳在单个设备(GPU)上时,我们必须将模型本身分割到多个GPU上进行训练,这称为模型并行。 现在我们可以通过多种方式实现,比如拆分模型的层或拆分张量本身! 在这篇论文中,作者提出了跨N个GPU高效执行流水线并行的有效方法。 为什么? 由于层被拆分到多个GPU上,操作将是顺序执行的,这会导致速度非常慢,因为如果前一层没有完成其“工作”,我们就无法继续,这意味着其他GPU必须等待——非常糟糕。 怎么做? 作者提出了两种技术来实现这一点: 1)微批处理:将每个节点上的小批量数据拆分为M个微批,这意味着我们不会一次性将整个小批量传递给任何GPU(因为这会花费一些时间,而其他GPU将等待数据),而是处理该微批并快速将输出传递给下一个节点,同时当前节点可以处理下一个微批,如此在所有节点上持续进行。 2)检查点:利用激活检查点的概念,通过牺牲计算换取内存——丢弃模型特定层中的激活,只保存最终输出,并在反向传播需要时重新计算这些激活。 作者使用这种方法在分区处保存最终激活——当数据从一个GPU移动到另一个GPU时,因为它作为下一层的输入。 此外,这里还可以采用流水线概念,这是计算和通信之间的权衡。当最后一层完成特定计算时,它可以通过一个单独的线程发送输出进行reduce scatter,如果我们还结合了数据并行! 峰值激活内存需求从O(N*L*k)降低到O(N + N*L*k / M * K),其中K个节点,L层,M个微批,N个小批量,以及可变量k。 几点说明: 1)增加M有帮助 2)可以适用于慢速节点间链路,如PCIe 干杯
查看原文
查看缓存全文

缓存时间: 2026/07/06 18:18

在数据并行之后,我们转向模型并行,从流水线并行开始

论文:GPipe:利用微批次流水线并行轻松扩展

是什么? 当模型无法再容纳在单个设备(GPU)上时,我们必须将模型本身拆分到多个 GPU 上进行训练,这称为模型并行。我们可以通过多种方式实现,例如拆分模型的层或拆分张量本身!

在这篇论文中,作者提出了在 N 个 GPU 上有效执行流水线并行的方法。

为什么? 由于层被拆分到多个 GPU 上,操作将是顺序的,这会导致速度非常慢,因为如果前面的层尚未完成其“工作”,我们就无法继续,这意味着其余 GPU 必须等待——非常糟糕。

怎么做? 作者提出了两种技术来实现这一目标:

  1. 微批次:将每个节点上的小批量数据拆分成 M 个微批次,这意味着我们不会一次性将整个小批量传递给任何 GPU(因为这会花费一些时间,其他 GPU 将等待数据),而是处理该微批次,并快速将输出传递到下一个节点,而当前节点可以处理下一个微批次,依此类推,所有节点都如此。

  2. 检查点:利用激活检查点概念,用计算换取内存——丢弃模型中特定层的激活值,只保存最终输出,并在反向传播需要时重新计算这些激活值。

作者利用这一技术在分区处保存最终激活值——当数据从一个 GPU 移动到另一个 GPU 时,因为它将作为下一层的输入。

此外,这里还可以引入流水线概念,在计算和通信之间进行权衡。当最后一层完成特定计算后,可以通过一个单独的线程发送输出以进行 reduce scatter 操作,前提是我们同时结合数据并行!

峰值激活内存需求从 O(NLk) 降低到 O(N + NLk / M * K),其中 K 为节点数,L 为层数,M 为微批量数,N 为小批量数,k 为变量。

几点说明:

  1. 增加 M 有助于提升性能

  2. 可以在节点间慢速链路(如 PCIe)上工作

干杯

很好的要点!我很快也会读那篇论文

谢谢

相似文章

PyTorch分布式:加速数据并行训练的实践经验

Papers with Code Trending

本文详细介绍了PyTorch分布式数据并行模块的设计与优化,重点阐述了梯度分桶(gradient bucketing)和计算-通信重叠等技术,这些技术使系统在使用256个GPU时实现了接近线性的可扩展性。