PIPEMESH: Achieving Memory-Efficient Computation-Communication Overlap for Training Large Language Models
TL;DR 精炼摘要
论文提出了一种名为PIPEMESH的新方法,以解决商用云上训练大语言模型中计算与通信重叠的效率问题。通过弹性流水线调度、混合分片和流水线感知的选择性重计算,显著提高了吞吐量,减少了显存使用,实现了20.1%至33.8%的性能提升。
摘要
Efficiently training large language models (LLMs) on commodity cloud resources remains challenging due to limitations in network bandwidth and accelerator memory capacity. Existing training systems can be categorized based on their pipeline schedules. Depth-first scheduling, employed by systems like Megatron, prioritizes memory efficiency but restricts the overlap between communication and computation, causing accelerators to remain idle for over 20% of the training time. Conversely, breadth-first scheduling maximizes communication overlap but generates excessive intermediate activations, exceeding memory capacity and slowing computation by more than 34%. To address these limitations, we propose a novel elastic pipeline schedule that enables fine-grained control over the trade-off between communication overlap and memory consumption. Our approach determines the number of micro-batches scheduled together according to the communication time and the memory available. Furthermore, we introduce a mixed sharding strategy and a pipeline-aware selective recomputation technique to reduce memory usage. Experimental results demonstrate that our system eliminates most of the 28% all-accelerator idle time caused by communication, with recomputation accounting for less than 1.9% of the training time. Compared to existing baselines, PIPEMESH improves training throughput on commodity clouds by 20.1% to 33.8%.
思维导图
论文精读
中文精读
1. 论文基本信息
1.1. 标题
PIPEMESH: Achieving Memory-Efficient Computation-Communication Overlap for Training Large Language Models (PIPEMESH:实现大语言模型训练中内存高效的计算与通信重叠)
1.2. 作者
Fanxin Li , Shixiong Zhao, Yuhao Qing, Jianyu Jiang, Xusheng Chen, Heming Cui
- 香港大学 (The University of Hong Kong)
- 作者团队主要来自香港大学计算机系系统研究组,专注于分布式系统与机器学习系统方向。
1.3. 发表信息
- 发表时间 (UTC): 2025-01-01
- 来源: IEEE Transactions on Parallel and Distributed Systems (根据原文页眉 "Member, IEEE" 及引用格式推断,这是一篇高质量的期刊或顶级会议论文,如 TPDS 或相关体系结构会议)。
- 原文链接: [PDF Link Provided in Context] (/files/papers/694664b207f8689679b7cffe/paper.pdf)
1.4. 摘要核心
论文旨在解决在带宽和显存受限的商用云资源上高效训练 LLM 的难题。现有系统要么为了省内存而牺牲通信重叠(如 Megatron),导致 GPU 大量空闲;要么为了重叠通信而消耗过多内存(如 Fold3D),导致内存溢出(OOM)。PIPEMESH 提出了一种弹性流水线调度(Elastic Pipeline Schedule),结合混合分片策略(Mixed Sharding)和流水线感知的选择性重计算(Pipeline-aware Selective Recomputation),实现了吞吐量的显著提升(相比基线提升 20.1% 至 33.8%)。
2. 整体概括
2.1. 研究背景与动机
- 核心问题: 训练大语言模型(LLM)需要海量的计算资源。虽然超级计算机(如配备 NVLink/Infiniband 的集群)性能强大,但对于大多数研究机构和企业,商用云(Commodity Cloud) 是更经济的选择。
- 商用云的痛点:
- 低带宽: 商用云节点间的网络带宽通常较低(例如 AWS 上 8x V100 节点仅 100Gbps,远低于超算的 1.6Tbps),导致分布式训练中的数据并行(DP)通信成为瓶颈。
- 显存受限: 老一代 GPU(如 V100, A10)显存较小,难以容纳大模型的参数和激活值。
- 现有方案的局限:
- 深度优先调度 (DFS, e.g., Megatron): 优先执行完一个微批次(Micro-batch)的前后向传播。优点是显存占用极低;缺点是无法有效并行处理通信和计算,导致 GPU 有超过 20% 的时间在空转等待网络传输。
- 广度优先调度 (BFS, e.g., Fold3D): 试图一次性调度所有微批次的前向传播。优点是最大化了通信重叠窗口;缺点是产生的中间激活值(Activations)会撑爆显存,迫使系统进行昂贵的 CPU 卸载(Offloading),反而降低了速度。
2.2. 核心贡献
-
弹性流水线调度 (Elastic Pipeline Schedule): 提出了一种新的抽象——弹性缓冲队列。不再是固定的 DFS 或 BFS,而是根据当前显存和带宽情况,动态决定一次性调度多少个微批次,从而在“通信重叠”和“显存占用”之间找到最优平衡点。
-
混合分片策略 (Mixed Sharding): 区别于传统的 ZeRO-1/2/3 全局设置,PIPEMESH 根据调度需求,对不同部分的参数灵活应用 ZeRO-2(梯度分片)或 ZeRO-3(参数分片),以节省显存。
-
联合优化算法: 将调度策略、分片策略和重计算策略建模为一个联合优化问题,并利用动态规划算法求解,以最小化训练迭代时间。
3. 预备知识与相关工作
为了理解 PIPEMESH,我们需要掌握大模型训练中的几种并行模式和优化技术。
3.1. 基础概念
3.1.1. 3D 并行 (3D Parallelism)
这是目前训练超大模型的主流范式,结合了三种维度:
- 数据并行 (Data Parallelism, DP): 将数据切分到不同 GPU。每个 GPU 持有完整的模型副本,计算部分数据的梯度,然后通过 AllReduce 或 Reduce-Scatter 同步梯度。DP 的主要瓶颈是通信。
- 流水线并行 (Pipeline Parallelism, PP): 将模型的层(Layers)切分为多个阶段(Stages),分配给不同 GPU。数据被切分为多个微批次 (Micro-batches) 依次流过各个阶段。PP 的主要瓶颈是流水线气泡 (Bubble)(即 GPU 等待数据的空闲时间)。
- 张量并行 (Tensor Parallelism, TP): 将单个层内部的矩阵运算切分到多个 GPU。通常用于节点内加速。
3.1.2. ZeRO 优化 (Zero Redundancy Optimizer)
为了解决 DP 中每个 GPU 都存储完整模型导致的显存浪费,ZeRO 将模型状态切分:
- ZeRO-1: 仅切分优化器状态(Optimizer States)。
- ZeRO-2: 切分优化器状态 + 梯度(Gradients)。通信量不变,显存更省。
- ZeRO-3: 切分优化器状态 + 梯度 + 模型参数(Parameters)。显存最省,但每次计算前需要通过 All-Gather 通信拉取完整参数,通信开销最大。
3.1.3. 激活重计算 (Activation Recomputation)
在前向传播中,通常需要保存每一层的输出(激活值)用于反向传播计算梯度。重计算是指不保存这些激活值,而是在反向传播时重新执行前向计算。这是一种用计算换显存的策略。
3.2. 前人工作对比
-
Megatron (DFS): 采用深度优先调度(1F1B)。显存占用为 ( 为流水线阶段数, 为单个微批次激活大小)。显存友好,但通信难以掩盖。
-
Fold3D (BFS): 采用广度优先调度。显存占用为 ( 为总微批次数量,通常 )。通信重叠好,但显存压力巨大。
下图(原文 Fig. 1)清晰展示了三种调度的区别:
-
(a) Megatron: 红色(空闲时间)较多。
-
(b) Fold3D: 激活值生命周期极长,显存占用高。
-
(c) PIPEMESH: 通过调整缓冲区大小,折中了两者的优缺点。
该图像是一个示意图,展示了不同调度策略下的计算与通信时间分布。图中包括 Megatron、Fold3D 和 PipeMesh 三种策略在不同缓冲区大小下的比较,突出显示了各阶段的生命周期及其对应的迭代时间。
4. 方法论
PIPEMESH 的核心思想是:显存是一种资源,应该被“投资”用来换取通信时间的重叠。 系统包含一个规划器 (Planner) 和一个 执行器 (Executor)。
4.1. 弹性流水线调度 (Elastic Pipeline Schedule)
4.1.1. 弹性缓冲队列抽象
PIPEMESH 将流水线调度抽象为对一个缓冲队列 (Buffer Queue) 的入队(Enqueue)和出队(Dequeue)操作:
- 入队 (Enqueue): 对应微批次的前向传播。
- 出队 (Dequeue): 对应微批次的反向传播。
- 缓冲区大小 (): 决定了有多少个微批次被一组调度。
- 越大 更多微批次一起计算 计算时间更长 能掩盖更久的通信 显存占用更高。
- 越小 退化为 Megatron (DFS)。
4.1.2. 序列定义
规划器生成两个序列:
-
入队序列: ,表示第 次入队操作处理 个微批次。
-
出队序列: ,表示第 次出队操作处理 个微批次。
下图(原文 Fig. 7)展示了 时的调度示例。注意原本需要等待的通信操作(如 All-Gather 和 Reduce-Scatter)是如何被安排在计算间隙中并行的。
该图像是图表,展示了不同调度策略在训练大语言模型过程中的计算和通信重叠情况。上方为Megatron调度,中间为Fold3D调度,下方为PipeMesh调度。图中各个阶段的RS Ops与AG.F Ops的计算与通信操作通过不同颜色区分,反映了每种调度的内存使用效率和空闲时间。
4.2. 混合分片与通信调度 (Mixed Sharding)
为了在有限显存下支持更大的 ,PIPEMESH 创造性地混合使用了 ZeRO-2 和 ZeRO-3。
- 策略:
- ZeRO-1/2: 对于部分参数,保留在显存中(如果显存够用),避免通信。
- ZeRO-3: 对于显存不足的部分,将参数分片。在计算前通过 All-Gather 拉取,计算后立即释放。
- 通信重叠 (Communication Overlap):
-
梯度分片 (Gradient Sharding): 当一组微批次的反向传播结束时,触发 Reduce-Scatter。这个通信过程与下一组微批次的反向传播重叠。
-
参数分片 (Parameter Sharding): 在一组微批次开始计算之前,提前触发 All-Gather。这个通信过程与当前正在进行的计算重叠。
下图(原文 Fig. 10)展示了通信如何被“藏”在计算任务之下:
该图像是示意图,展示了不同的通信策略在大语言模型训练中的应用。图(a)显示了优化器分片的通信结构,图(b)为梯度分片的通信示意,图(c)和图(d)分别展示了参数分片在前向和后向传播中的通信方式。每个部分根据数据传输和计算的需求,说明了如何优化内存和通信效率。
-
4.3. 规划算法与成本模型 (Planner & Cost Model)
这是论文最硬核的部分。规划器的目标是:在显存预算内,找到最优的缓冲区大小 和重计算策略,使训练时间最短。
4.3.1. 迭代时间模型 ()
一次训练迭代的总时间由以下公式给出:
- 符号解释:
- : 总计算时间(包含前向、后向和重计算)。
- : 流水线气泡时间(因流水线依赖导致的等待)。
- : 关键路径上的流水线通信时间(点对点传输)。
- : 关键路径上的数据并行通信时间。这是 PIPEMESH 优化的核心。
4.3.2. 关键路径 DP 通信 ()
PIPEMESH 将 DP 通信拆解为三部分:优化器分片 ()、梯度分片 () 和参数分片 ()。以优化器分片为例:
- 公式解析:
- : 通信一次所需时间。
- : 每个流水线阶段的模型块(Model Chunk)数量。
- : 第一组入队微批次的前向计算总时间(即重叠窗口)。
- 核心函数 : 这是一个“溢出”函数。如果通信时间 小于计算时间 ,则结果为 0(完全重叠,无开销);否则,返回未被掩盖的通信时间。
- 意义: 该公式精确计算了有多少通信时间没能被计算时间“藏住”,从而变成了实际的开销。
4.3.3. 联合优化问题
规划器的任务是求解以下优化问题:
- 符号解释:
- : 缓冲区大小。
- : 需要进行重计算的算子集合。
- : 总显存消耗(模型状态 + 激活值)。
- : 显存预算(Memory Budget)。
4.3.4. 动态规划求解重计算策略
为了求解上述问题中的 ,PIPEMESH 使用动态规划(Dynamic Programming)。
定义状态表 L[k][o] 为:当前处理到第 个算子,且累计激活显存占用为 时,最小的执行时间。
- 公式深度解析:
-
情况 1 (重计算该算子):
L[k-1][o]: 前k-1个算子的最小时间。- : 第 个算子的重计算代价。 是单次计算时间, 是受影响的微批次总数。代价是增加了计算时间。
-
情况 2 (存储该算子激活值):
- : 前面状态的显存占用较少(因为第 个占了 )。
- : 这是最精妙的一项。它表示显存占用从 增加到 所导致的通信时间惩罚。
- 逻辑链条: 显存占用增加 系统被迫减小缓冲区大小 以防 OOM 通信重叠窗口变小 关键路径通信时间 增加。
-
决策: 算法在每一步比较“多做计算”和“多占显存(导致通信变慢)”哪个代价更小,从而选出最优解。
-
5. 实验设置
5.1. 硬件环境
- V100 集群: AWS p3dn.24xlarge,96块 NVIDIA V100 (32GB),节点间带宽 100Gbps。这是模拟商用云低带宽的关键环境。
- A100 集群: AWS p4d.24xlarge,72块 NVIDIA A100 (40GB),节点间带宽 400Gbps。
5.2. 模型与数据集
- 模型:
- GPT-3 58B
- Llama2 55B
- Falcon 66B
- 选择这些尺寸是为了在不使用 ZeRO-3 全分片的情况下也能刚好塞进显存,以便与 Megatron 公平对比。
- 数据集: OpenWebText。
5.3. 评估指标
- Throughput (吞吐量):
- 定义: 每秒每个 GPU 处理的浮点运算次数。
- 单位: TFLOPS (Tera Floating-point Operations Per Second)。
- 公式:
- MFU (Model FLOPs Utilization):
- 定义: 实际吞吐量占 GPU 理论峰值吞吐量的百分比。反映了硬件利用率。
5.4. 对比基线
-
Megatron-LM: 工业界标准,使用 DFS 调度。
-
MegaScale: 基于 Megatron 的改进版,主要优化了通信原语。
-
Fold3D: 使用 BFS 调度,最大化通信重叠,但依赖 CPU 卸载。
6. 实验结果与分析
6.1. 核心结果分析
PIPEMESH 在所有测试场景下均超越了基线模型,特别是在低带宽的 V100 集群上优势明显。
以下是原文 Table IV 的完整数据转录,展示了不同模型下的性能拆解:
| Model | System | q | Time Breakdown (ms) | Memory (GB) | Thrp. (TFLOPS) |
MFU | ||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| T_comp | T_bubble | T_PP_crit | T_DP_crit | Total | Act (M_a) | Grad (M_g) | Param (M_p) | |||||
| GPT-3 58B (A100 Cluster) |
PIPEMESH | 6 | 2121.3 | 114.5 | 245.1 | 140.3 | 2621.2 | 11.5 | 3.0 | 3.9 | 120.6 | 38.7% |
| Megatron | 2 | 2485.4 | 331.5 | 993.6 | 567.2 | 4377.7 | 9.6 | 4.5 | 4.5 | 100.4 | 32.2% | |
| MegaScale | 2 | 2497.0 | 333.2 | 986.4 | 554.0 | 4370.6 | 9.6 | 4.5 | 4.5 | 100.3 | 32.2% | |
| GPT-3 58B (V100 Cluster) |
Fold3D | - | 3431.6 | 159.5 | 247.7 | 134.9 | 3973.7 | 37.0 (CPU) | 3.0 | 3.0 | 89.3 | 28.6% |
| PIPEMESH | 6 | 9217.1 | 296.4 | 757.9 | 505.9 | 10777.3 | 11.4 | 2.3 | 2.7 | 52.1 | 41.7% | |
| Megatron | 2 | 9109.6 | 876.5 | 3923.1 | 922.7 | 14831.9 | 9.9 | 3.4 | 3.4 | 42.1 | 33.7% | |
| MegaScale | 2 | 9104.5 | 876.4 | 3863.8 | 919.0 | 14763.7 | 9.9 | 3.4 | 3.4 | 42.3 | 33.8% | |
(注:表格数据为精简转录,重点展示了 A100 和 V100 上的 GPT-3 58B 结果。Total 时间为估算值或基于吞吐量反推。PIPEMESH 的 显著低于 Megatron。)
分析:
- 在 A100 上,PIPEMESH 吞吐量达到 120.6 TFLOPS,比 Megatron (100.4) 高 20.1%。
- 主要收益来源是 (关键路径 DP 通信) 从 567.2ms 降低到了 140.3ms,降幅达 75.3%。这意味着绝大部分通信都被计算时间掩盖了。
- Fold3D 虽然通信时间也短,但在 V100 上因为 CPU 卸载导致计算时间 () 激增(从约 9200ms 增加到 12225ms,见原文完整表格),反而拖累了整体性能。
6.2. 扩展性分析 (Scalability)
下图(原文 Fig. 12)展示了弱扩展性测试结果(GPU 数量从 48 增加到 192,模型大小随之增加)。
该图像是条形图,展示了不同 GPU 数量下各模型的整体吞吐量(PFLOPs)。蓝色柱表示 PipeMesh,绿色为 Megatron,橙色为 MegaScale,红色为 Fold3D。随着 GPU 数量的增加,PipeMesh 的吞吐量始终高于其他模型。
- 结论: PIPEMESH 在所有规模下都保持了对 Megatron 和 MegaScale 约 25%-27% 的性能优势。这证明了其调度算法在集群规模扩大时依然有效。
6.3. 消融实验 (Ablation Study)
作者研究了缓冲队列大小 对性能的影响(原文 Fig. 14)。
-
结果: 存在一个“甜点”值(在实验中为 12)。
- 太小:通信窗口不足,退化为 Megatron。
- 太大:虽然通信完全重叠,但为了塞进显存,规划器被迫选择重计算大量算子,导致计算时间增加,抵消了收益。
-
验证: PIPEMESH 的算法能够自动找到这个最优的 值。
7. 总结与思考
7.1. 结论总结
PIPEMESH 是一项针对商用云环境优化的出色工作。它打破了 DFS 和 BFS 的二元对立,通过弹性调度实现了“有多少显存,办多少事(重叠多少通信)”。配合混合分片和动态规划重计算,它成功将大量原本阻塞 GPU 的通信时间隐藏到了计算后台,在不升级硬件的情况下显著提升了训练效率。
7.2. 局限性与未来工作
- 计算开销: 虽然用计算换了通信,但重计算确实增加了总计算量。在计算能力(FLOPS)本身就是瓶颈的场景下(例如极高带宽但算力弱的集群),PIPEMESH 的收益会下降。
- 应用范围: 目前主要针对全参数预训练。对于 PEFT(如 LoRA)等微调场景,由于显存压力小且通信模式不同,PIPEMESH 的复杂机制可能是不必要的。
- 静态规划: 目前的规划是在训练前静态完成的。如果训练过程中网络波动剧烈,静态计划可能失效。未来可以探索运行时的动态调整。
7.3. 个人启发
PIPEMESH 的最大启发在于其系统设计的整体观。它没有单独优化通信(如压缩)或显存(如卸载),而是建立了一个包含时间、显存、通信、计算的全局代价模型。特别是那个 I(o', o) 项的引入,将显存消耗直接与通信代价挂钩,这种数学建模的视角非常值得在其他系统设计中借鉴。它告诉我们:在资源受限的系统中,资源的互相转化率(如 1GB 显存能换取多少毫秒的通信掩盖)是优化的核心。
相似论文推荐
基于向量语义检索推荐的相关论文。