@YuvrajS9886: 在数据并行之后,我们转向模型并行,从流水线并行开始。论文:GPipe:使用微批处理轻松扩展…
摘要
本线程解释了GPipe,这是一篇关于使用微批处理和激活检查点技术跨多个GPU扩展大模型的流水线并行论文。
查看缓存全文
缓存时间: 2026/07/06 18:18
在数据并行之后,我们转向模型并行,从流水线并行开始
论文:GPipe:利用微批次流水线并行轻松扩展
是什么? 当模型无法再容纳在单个设备(GPU)上时,我们必须将模型本身拆分到多个 GPU 上进行训练,这称为模型并行。我们可以通过多种方式实现,例如拆分模型的层或拆分张量本身!
在这篇论文中,作者提出了在 N 个 GPU 上有效执行流水线并行的方法。
为什么? 由于层被拆分到多个 GPU 上,操作将是顺序的,这会导致速度非常慢,因为如果前面的层尚未完成其“工作”,我们就无法继续,这意味着其余 GPU 必须等待——非常糟糕。
怎么做? 作者提出了两种技术来实现这一目标:
-
微批次:将每个节点上的小批量数据拆分成 M 个微批次,这意味着我们不会一次性将整个小批量传递给任何 GPU(因为这会花费一些时间,其他 GPU 将等待数据),而是处理该微批次,并快速将输出传递到下一个节点,而当前节点可以处理下一个微批次,依此类推,所有节点都如此。
-
检查点:利用激活检查点概念,用计算换取内存——丢弃模型中特定层的激活值,只保存最终输出,并在反向传播需要时重新计算这些激活值。
作者利用这一技术在分区处保存最终激活值——当数据从一个 GPU 移动到另一个 GPU 时,因为它将作为下一层的输入。
此外,这里还可以引入流水线概念,在计算和通信之间进行权衡。当最后一层完成特定计算后,可以通过一个单独的线程发送输出以进行 reduce scatter 操作,前提是我们同时结合数据并行!
峰值激活内存需求从 O(NLk) 降低到 O(N + NLk / M * K),其中 K 为节点数,L 为层数,M 为微批量数,N 为小批量数,k 为变量。
几点说明:
-
增加 M 有助于提升性能
-
可以在节点间慢速链路(如 PCIe)上工作
干杯
很好的要点!我很快也会读那篇论文
谢谢
相似文章
@yukangchen_: 很高兴分享我们的新博客:利用并行化扩展视频训练 https://research.nvidia.com/labs/eai/blogs/scali…
这篇来自NVIDIA Research的博客讨论了序列并行化如何扩展长视频训练系统,既支持理解任务也支持生成任务,解决了在多GPU上适配超长视频序列的挑战。
llama.cpp 中的流水线并行可能浪费你的显存
测试表明,llama.cpp 默认的流水线并行浪费显存且无速度提升;通过编译时设置 GGML_SCHED_MAX_COPIES=1 可节省大量显存,同时保持相同推理速度。
@levidiamode: Day 138/365 of GPU Programming 今年我最喜欢的讲座之一是斯坦福大学的CS336第7讲关于GPU…
一位学习者分享了对斯坦福大学CS336第7讲关于GPU并行性的热情,该讲座涵盖了基本操作,并将其连接到多GPU设置以及张量并行、数据并行和流水线并行等技术。
PyTorch分布式:加速数据并行训练的实践经验
本文详细介绍了PyTorch分布式数据并行模块的设计与优化,重点阐述了梯度分桶(gradient bucketing)和计算-通信重叠等技术,这些技术使系统在使用256个GPU时实现了接近线性的可扩展性。
打破气泡:具有有界权重不一致性的异步流水线并行训练
介绍 PACI,一种无气泡的异步流水线并行训练方法,通过局部梯度累积来约束前向/后向权重不一致性,在保持稳定性和内存使用不变的情况下,实现更高的吞吐量和更快的达到目标精度时间。