跳转到内容

并行策略与性能优化:把 GPU 榨干

大模型训练的所有工程,本质上是在回答一个问题:模型、数据、计算,至少有一个要被切开,切哪几刀、怎么切?

三种经典切法,按「切的对象」划分:

并行方式切什么类比通信特征
数据并行 (DP)数据复印 100 份作业,每人做一页,最后汇总每步一次梯度 all-reduce
张量并行 (TP)单层内部的矩阵乘一道大题四人接力,各自算一块每层 2 次 all-reduce,最密
流水线并行 (PP)模型按层切段工厂流水线,每人负责一道工序相邻 stage 点对点传激活值

直觉规则:切的刀数越多,单卡负担越轻,但卡之间聊天越频繁。性能优化的全部艺术,就是在「算得快」和「聊得多」之间找到甜点。

混合精度 AdamW 训练,每参数的静态开销:

  • BF16 权重副本 2B + BF16 梯度 2B + FP32 主权重 4B + 优化器状态 8B ≈ 16 字节

70B 模型就是 1.12TB——单卡 80GB 的 H100 连权重都放不下。这是所有并行策略的第一推动力。

三种并行 + ZeRO:组合出整个配方

Section titled “三种并行 + ZeRO:组合出整个配方”

DP 的进化:ZeRO/FSDP。朴素 DP 每张卡存完整模型,浪费。ZeRO 把冗余的东西切给整个 DP 组:

  • ZeRO-1:切优化器状态(省 4/16,≈2× 于 DP)
  • ZeRO-2:再切梯度(再省 2/16)
  • ZeRO-3 / FSDP:参数也切(几乎全切,只剩通信时的临时副本)

PyTorch FSDP 就是 ZeRO-3 的官方实现。扩容逻辑很简单:卡数翻倍,每卡静态显存减半(通信量略增)。

TP:快而贵。Megatron-LM 把 attention 的 QKV 投影按列切、输出投影按行切,MLP 同理。每层前向后向各 2 次 all-reduce——通信极其密集,必须绑在 NVLink 域内(节点内或 NVL72 机柜内),跨节点就是灾难。

PP:慢而省。GPipe 按层切段,micro-batch 流水。气泡占比 ≈ (p−1)/(m+p−1):8 个 micro-batch 过 4 段,约 27% 时间空转。1F1B(one-forward-one-backward)先用稳显存,交错式 1F1B 把每段再切成 v 份把气泡除以 v。

并行策略探索器:切分你的模型

集群规模: 32 GPU权重+优化器状态: 35.0 GB激活值(重计算后): 0.0 GB每卡内存估算: 35.0 / 80 GB
权重+优化器状态
35.0
激活值(重计算后)
0.0
剩余
45.0

✅ 装得下,还有空间给激活与临时缓冲。

提示:TP 越大通信越密(每层两次 all-reduce),一般绑在 NVLink 域内;PP 增加流水线气泡;DP+ZeRO 是扩容最廉价的轴。

粗粒度估算:混合精度 AdamW(16 bytes/param),激活按 selective recompute + 序列并行经验公式;实际以 profilers 为准。

现代配方(以 DeepSeek-V3 为例):671B 模型用 16 路 PP × 64 路 EP(专家并行)× DP,完全不用 TP——MLA 注意力本身省显存,MoE 的 all-to-all 走 IB 比 TP 的 all-reduce 更划算。EP 里再用 EPLB 做专家负载均衡,DualPipe 让通信与计算重叠。这说明三维并行不是教条,是工具箱。

静态状态之外,激活值(前向时各层中间结果,反向要用)随 batch×seq×层数膨胀。三招:

  1. 激活重计算(gradient checkpointing):只存每层输入,反向时重算中间结果。全量重计算 ≈ 多一次前向(+33% FLOPs);选择性重计算只重算 attention 核心、MLP 激活照存,用远小于 33% 的额外计算换大部分显存——Megatron-Core 的默认
  2. 序列并行(SP):把 LayerNorm/dropout 这类逐 token 的激活沿序列维切开,与 TP 互补(korthikanti2023)
  3. 上下文并行(CP)/ Ring Attention:超长上下文按 block 分布在多卡,KV block 沿设备环轮转,通信与计算重叠

算得快:FlashAttention 与 kernel 融合

Section titled “算得快:FlashAttention 与 kernel 融合”
  • FlashAttention(dao2022):不把 N×N 注意力矩阵物化到 HBM,分块在 SRAM 里算,显存从 O(N²) 降到 O(N),精确注意力下还更快。FA2 改进了 warpgroup 间的工作划分,逼近硬件上限;FA3 在 Hopper 上用 TMA、warp specialization、FP8 继续榨
  • 算子融合:RMSNorm、旋转位置编码、损失计算融合成单 kernel,减少 kernel launch 与显存往返;torch.compile 自动做一批
  • MoE 的 all-to-all 优化:DeepEP 把 dispatch/combine 的通信做成独立 kernel,与计算 SM 共享, expert 并行不再拖垮 MFU

MFU(Model FLOPs Utilization)= 实际吞吐 ÷ 硬件峰值。算式:训练 FLOPs ≈ 6·N·D(N 参数量,D tokens),除以「峰值 FLOPS × 时间」。

业界水位:普通团队 30%~40%,Megatron-LM 论文在 3072 张 A100 上做到 52.8%,字节 MegaScale 在 12288 卡上做到 55%+。MLPerf Training v5.0 上,2496 张 GB200 跑出 1.8 PFLOPS 应用吞吐、90% 扩展效率——万卡之后还能不能线性,就是网络与调度功力的判决书。

排查顺序(经验之谈):先看 dataloader 是否喂不饱(GPU 等数据)→ 再看通信占比(MFU 低的头号嫌疑)→ 再看 kernel 是否小碎(fusor/compiler)→ 最后才怀疑硬件。

手工调 TP×PP×DP×ZeRO 本质是组合爆炸里的搜索。Alpa 率先把「算子内并行(类 TP)× 算子间并行(类 PP)」做成编译问题:用动态规划在层次化策略空间里搜索,GPT-3 规模上追平甚至超过专家配方。后续工作(Galvatron、Oases、pipline-compiler 一系)在 MoE、异构集群上继续推进。2026 年的共识:自动工具适合当基线,最后的 5%~10% 仍靠人根据硬件拓扑手调。

Zero Bubble Pipeline Parallelism 把 backward 拆成 B(算激活梯度)和 W(算参数梯度)两类任务重新排布,用 W 填气泡,逼近零气泡且显存不增。再进一步就是 DeepSeek 的 DualPipe:双向流水线让相邻 stage 的前向/反向交错,通信几乎全隐藏。气泡问题从 GPipe 的 ~27% 一路压到个位数百分比——流水线调度的红利还没吃完。

agentic RL 把问题又翻新了一遍:rollout(采样轨迹)是带宽/延迟 bound、训练是 FLOPs bound,两者资源画像完全不同。解耦架构(RollArt、AgentRL)把两阶段拆开用异构硬件,靠有界队列和版本管理吸收速率差;async pipeline 里权重过期的尺度直接决定收敛。如果你在搭 agentic RL 基础设施,这里的每一个百分点都是真金白银——这和传统预训练的优化目标(纯吞吐)已经不是同一个游戏。

🔬 开放研究问题

该领域的关键问题与研究方向:

  1. 自动并行搜索能否在 MoE + 异构集群上稳定超过人类专家?还差哪些传感器信息(实时的拓扑、抖动、故障率)?
  2. Zero Bubble 之后,流水线气泡的理论下界在哪里?显存-气泡-通信的三方 tradeoff 有没有 Pareto 前沿的可操作刻画?
  3. 超长上下文训练(100K+)下,Ring Attention / CP 与序列并行的边界在哪里?显存墙会不会先撞在 position encoding 上?
  4. agentic RL 的 rollout-train 解耦里,异步性的容忍尺度(staleness budget)能否从经验超参变成可推导的量?

本文引用论文

  • Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism — Mohammad Shoeybi et al. (2019)

    提出张量并行(TP):把 self-attention 和 MLP 的矩阵乘按列/行切分到多张 GPU,层内并行、层间保持全精度激活,单卡只需承载 1/N 的权重与梯度。显式、可控、通信模式规则,与现代流水线、数据并行组合成 3D 并行范式,是大模型并行训练的奠基工作。

  • GPipe: Efficient Training of Giant Neural Networks using Pipeline Parallelism — Yanping Huang et al. (2019)

    把模型按层切成多个 stage 流水执行,用 micro-batch 把流水线气泡摊薄(气泡占比约 (p-1)/(m+p-1)),并配合激活重计算控制显存。流水线并行的开山之作,后续 1F1B、交错式调度、零气泡都是在它的气泡模型上做文章。

  • ZeRO: Memory Optimizations Toward Training Trillion Parameter Models — Samyam Rajbhandari et al. (2020)

    不再让每个数据并行副本都完整持有优化器状态:ZeRO-1/2/3 分别把优化器状态、梯度、参数切分到 DP 组内各卡,用通信换显存,使单卡显存随卡数近似线性下降。ZeRO-3 的完全分片思想就是后来 PyTorch FSDP 的源头,让单机装不下的模型训练成为可能。

  • Efficient Large-Scale Language Model Training on GPU Clusters Using Megatron-LM — Deepak Narayanan et al. (2021)

    Megatron-LM 系统论文:把 TP、流水线 1F1B、数据并行组合成完整配方,给出 3D 并行的放置原则(TP 绑在 NVLink 域内、PP 跨节点、DP 兜底)、交错式 1F1B 调度与流水线气泡分析,并在 3072 张 A100 上以 52.8% 峰值利用率训练 GPT-3 量级模型,定义了大集群训练的效率基线。

  • Reducing Activation Recomputation in Large Transformer Models — Vijay Anand Korthikanti et al. (2023)

    Megatron-Core 的显存工程论文:把激活值分成「必存」与「可重算」两类,提出选择性重计算(只重算 attention 核心、MLP 激活整段存)加序列并行,用远小于全量重计算的额外 FLOPs 拿到大部分显存收益;还系统分析了 transformer 各层激活的构成公式,是大模型训练显存规划的参考标准。

  • Ring Attention with Blockwise Transformers for Near-Infinite Context — Hao Liu et al. (2023)

    把超长上下文切成 block 分布到多台设备上做分块注意力:每卡只保存自己那段 KV block,block 沿设备环逐个轮转复用,通信与计算重叠进行。在集群显存总和允许的范围内上下文长度可近乎无限扩展,是上下文并行(context parallelism)的奠基工作。

  • Zero Bubble Pipeline Parallelism — Penghui Qi et al. (2024)

    把 backward 拆成「计算激活梯度(B)」和「计算参数梯度(W)」两步重新调度,让 W 的计算去填流水线气泡,实现接近零气泡的流水线并行,且在同等显存预算下吞吐优于 1F1B。证明流水线调度仍有结构性红利可挖。

  • Alpa: Automating Inter- and Intra-Operator Parallelism for Distributed Deep Learning — Lianmin Zheng et al. (2022)

    第一个自动联合搜索算子内并行(类张量并行)与算子间并行(类流水线并行)的系统:把庞大的并行策略空间做层次化划分,用动态规划求解最优切分。在 GPT-3 规模模型上追平甚至超过专家手工调制的 3D 并行配置,把「人肉调并行」变成了一个编译器问题。

  • FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness — Tri Dao et al. (2022)

    FlashAttention 通过 IO-aware 的分块计算,在不牺牲精度的前提下,将注意力计算的内存 从 O(N²) 降至 O(N),速度提升 2-4 倍。它改变了长上下文训练的可行性边界, 是现代高效 LLM 训练和推理不可或缺的底层优化。

  • FlashAttention-2: Faster Attention with Better Parallelism and Work Partitioning — Tri Dao (2023)

    用更激进的 warp 级并行和 work partition 把 FlashAttention 再翻倍。今天 vLLM / SGLang / Megatron 训练后端基本都升级到 FA-2。

  • FlashAttention-3: Fast and Accurate Attention with Asympotic IO Complexity — Jay Shah et al. (2024)

    利用 H100 的异步 TMA 与 FP8,把 attention 推到 1.2 PFLOPs,并保持数值精度。是 Hopper 架构上长上下文 + FP8 训练的关键依赖。

  • DeepSeek-V3 Technical Report — DeepSeek-AI (2024)

    671B 参数(37B 激活)MoE,14.8T token 训练;首次大规模在生产 LLM 上跑通 FP8 训练 + Multi-Token Prediction,并把训练成本压到 $5.6M。震动整个行业。