目录
- 3D 并行的设计动机
- 三维并行策略
- Megatron-LM 的 3D 并行实现
- 通信拓扑与效率分析
- 3D 并行的工程实践
- 3D 并行的边界与失效模式
摘要
3D 并行将数据并行(Data Parallelism)、张量并行(Tensor Parallelism)和流水线并行(Pipeline Parallelism)组合使用,在超大规模 GPU 集群上高效训练万亿级参数模型。本文从 3D 并行的设计动机出发,分析三种并行策略的协同方式、通信拓扑和扩展效率。
1. 3D 并行的设计动机
训练千亿级参数模型时,单一并行策略无法满足需求。数据并行显存不够,张量并行 GPU 数量受限,流水线并行气泡比高。3D 并行通过组合三种策略,在超大规模 GPU 集群上实现高效训练。
1.1 为什么需要 3D 并行
| 策略 | 显存节省 | 通信量 | GPU 数量限制 | 气泡比 |
|---|---|---|---|---|
| 数据并行 | 0% | 2 × Model | 无限制 | 0% |
| 张量并行 | 1/N | 2 × 激活 | 8 | 0% |
| 流水线并行 | 1/N | 2 × 层输出 | 32 | 10-20% |
| 3D 并行 | 1/(TP×PP) | 最优 | 无限制 | 最优 |
1.2 3D 并行的核心思想
3D 并行的核心思想是将 GPU 集群划分为三维网格,每种并行策略负责一个维度:
- 数据并行(DP 维度):拆分训练数据,同步梯度
- 张量并行(TP 维度):拆分层内权重
- 流水线并行(PP 维度):拆分层间顺序
1.3 3D 并行的历史演进
单 GPU → 数据并行 → 模型并行 → 张量并行 → 流水线并行 → 3D 并行(Megatron-LM, 2019)→ 3D 并行优化(2023)。
1.4 3D 并行的产业应用
| 模型 | 参数量 | DP | TP | PP | 总 GPU |
|---|---|---|---|---|---|
| GPT-3 175B | 175B | 64 | 8 | 16 | 10,000 |
| BLOOM 176B | 176B | 8 | 4 | 8 | 384 |
| Megatron-Turing | 530B | 16 | 8 | 16 | 2,240 |
| PaLM 540B | 540B | 8 | 4 | 16 | 6,144 |
1.5 3D 并行的局限性
3D 并行的局限性包括:通信拓扑复杂(三种通信模式交织)、GPU 利用率降低(流水线气泡比)以及实现复杂度高(需要协调三种并行策略)。
2. 三维并行策略
2.1 三维的划分
Total GPU = DP × TP × PP \text{Total GPU} = \text{DP} \times \text{TP} \times \text{PP}Total GPU=DP×TP×PP
| 总 GPU 数 | DP | TP | PP | 适用模型 |
|---|---|---|---|---|
| 32 | 2 | 4 | 4 | 30B |
| 128 | 4 | 8 | 4 | 70B |
| 512 | 8 | 8 | 8 | 175B |
| 2048 | 16 | 8 | 16 | 530B |
2.2 数据并行维度
数据并行(DP)将训练数据拆分到多个 GPU 组,每组计算不同数据,通过 All-Reduce 同步梯度。
2.3 张量并行维度
张量并行(TP)在每组内层内拆分权重矩阵,通过 All-Gather 和 Reduce-Scatter 通信。
2.4 流水线并行维度
流水线并行(PP)在每组间层间拆分模型,通过 P2P Send/Recv 通信。
3. Megatron-LM 的 3D 并行实现
3.1 通信组配置
defsetup_3d_parallel_groups(world_size,dp_size,tp_size,pp_size):"""配置 3D 并行通信组"""# 总 GPU 数assertworld_size==dp_size*tp_size*pp_size# 张量并行组tp_groups=[]foriinrange(dp_size*pp_size):start=i*tp_size tp_group=dist.new_group(range(start,start+tp_size))tp_groups.append(tp_group)# 流水线并行组pp_groups=[]foriinrange(dp_size*tp_size):pp_group=dist.new_group(range(i,world_size,dp_size*tp_size))pp_groups.append(pp_group)# 数据并行组dp_groups=[]foriinrange(tp_size*pp_size):dp_group=dist.new_group(range(i,world_size,tp_size*pp_size))dp_groups.append(dp_group)returntp_groups,pp_groups,dp_groups3.2 Megatron-LM 的 3D 并行训练
classMegatron3DParallelModel(nn.Module):"""Megatron-LM 3D 并行模型"""def__init__(self,d_model,tp_size,pp_size):super().__init__()self.tp_size=tp_size self.pp_size=pp_size# 张量并行层self.tp_layers=nn.ModuleList([TensorParallelLinear(d_model,d_model,tp_size)for_inrange(pp_size)])# 流水线并行阶段self.pp_stages=nn.ModuleList([TransformerLayer(d_model)for_inrange(pp_size)])defforward(self,x):# 数据并行:每个 DP 组处理不同的数据# 张量并行:每个 TP 组计算部分层# 流水线并行:每个 PP 阶段计算部分层forstageinself.pp_stages:x=stage(x)returnx4. 通信拓扑与效率分析
4.1 通信量分析
| 并行策略 | 通信量 | 通信模式 | 通信频率 |
|---|---|---|---|
| 数据并行 | 2 × Model | All-Reduce | 每步一次 |
| 张量并行 | 2 × 激活 | All-Gather | 每层两次 |
| 流水线并行 | 2 × 层输出 | P2P Send/Recv | 每阶段一次 |
4.2 通信拓扑
4.3 扩展效率
| 总 GPU 数 | 理论加速 | 实际加速 | 扩展效率 |
|---|---|---|---|
| 32 | 32x | 28x | 87.5% |
| 128 | 128x | 105x | 82.0% |
| 512 | 512x | 380x | 74.2% |
| 2048 | 2048x | 1350x | 65.9% |
5. 3D 并行的工程实践
5.1 3D 并行配置
# 3D 并行配置dp_size=8# 数据并行大小tp_size=8# 张量并行大小pp_size=8# 流水线并行大小total_gpu=dp_size*tp_size*pp_size# 512 GPU# 初始化模型model=Megatron3DParallelModel(d_model=12288,tp_size=tp_size,pp_size=pp_size)# 配置通信组tp_groups,pp_groups,dp_groups=setup_3d_parallel_groups(total_gpu,dp_size,tp_size,pp_size)5.2 3D 并行参数选择
| 模型规模 | 推荐 DP | 推荐 TP | 推荐 PP | 总 GPU |
|---|---|---|---|---|
| 30B | 4 | 4 | 4 | 64 |
| 70B | 8 | 8 | 4 | 256 |
| 175B | 16 | 8 | 8 | 1024 |
| 530B | 16 | 8 | 16 | 2048 |
5.3 3D 并行性能优化
| 优化策略 | 描述 | 效果 |
|---|---|---|
| 通信重叠 | 通信与计算重叠 | 减少 20% 训练时间 |
| 梯度累积 | 模拟大 batch | 提高 GPU 利用率 |
| 混合精度 | BF16 训练 | 减少 50% 显存 |
| 梯度检查点 | 减少前向激活显存 | 节省 30% 显存 |
6. 3D 并行的边界与失效模式
6.1 通信瓶颈
| 问题 | 表现 | 解决方案 |
|---|---|---|
| 跨节点通信慢 | 数据并行效率低 | 使用更高速网络 |
| 节点内通信冲突 | 张量并行和流水线并行竞争带宽 | 优化通信调度 |
| 通信负载不均 | 某些 GPU 通信量大 | 平衡通信负载 |
6.2 负载不均衡
| 问题 | 表现 | 解决方案 |
|---|---|---|
| 流水线负载不均 | 某些 GPU 计算量大 | 均衡层分配 |
| 张量并行负载不均 | 某些 GPU 通信量大 | 优化切分策略 |
| 数据并行负载不均 | 某些 GPU 数据多 | 均匀数据分配 |
6.3 3D 并行的优缺点总结
| 优点 | 缺点 |
|---|---|
| 支持万亿级模型 | 通信拓扑复杂 |
| 高扩展效率 | GPU 利用率降低 |
| 灵活的组合 | 实现复杂度高 |
7. 3D 并行的实践指南
7.1 配置建议
| 模型规模 | 推荐 DP | 推荐 TP | 推荐 PP |
|---|---|---|---|
| 13B-30B | 2-4 | 4 | 4 |
| 70B-100B | 4-8 | 8 | 4 |
| 175B-300B | 8-16 | 8 | 8 |
| 500B+ | 16 | 8 | 16 |
7.2 性能监控
| 指标 | 描述 | 告警阈值 |
|---|---|---|
| GPU 利用率 | 各 GPU 计算利用率 | <70% |
| 通信时间占比 | 通信占总时间比例 | >30% |
| 扩展效率 | 实际加速/理论加速 | <70% |
| 显存使用 | 各 GPU 显存使用率 | >90% |
8. 3D 并行的通信优化
8.1 通信拓扑
3D 并行中,三种并行策略的通信拓扑不同:
| 并行策略 | 通信模式 | 带宽 | 延迟 | 通信频率 |
|---|---|---|---|---|
| 数据并行 | All-Reduce | 50 GB/s (InfiniBand) | 10 us | 每步一次 |
| 张量并行 | All-Gather | 600 GB/s (NVLink) | 1 us | 每层两次 |
| 流水线并行 | P2P Send/Recv | 600 GB/s (NVLink) | 1 us | 每阶段一次 |
8.2 通信重叠
defoverlapped_3d_parallel_training(model,batch,optimizer):"""通信重叠的 3D 并行训练"""# 前向传播(流水线并行)forstageinmodel.pp_stages:# 张量并行前向(通信与计算重叠)forlayerinstage.tp_layers:# 异步 All-Gatherhandle=dist.all_gather_async(...)# 在通信期间执行其他计算other_result=intermediate_computation()# 等待通信完成handle.wait()# 继续计算output=layer(output)# 反向传播loss.backward()# 数据并行梯度同步(与下一个 batch 的计算重叠)handle=dist.all_reduce_async(gradients)# 在通信期间准备下一个 batchnext_batch=prefetch_next_batch()# 等待通信完成handle.wait()# 更新参数optimizer.step()8.3 通信压缩
3D 并行中,数据并行的通信量最大,可以通过梯度压缩减少通信量:
| 压缩方法 | 压缩率 | 精度损失 | 适用场景 |
|---|---|---|---|
| 梯度量化 | 4x | 低 | 通用场景 |
| 梯度稀疏化 | 10x | 中 | 高带宽场景 |
| Top-K 稀疏化 | 5x | 低 | 推荐场景 |
9. 3D 并行的负载均衡
9.1 流水线负载均衡
流水线并行中,各阶段的负载均衡对效率影响显著:
defbalance_pipeline_stages(layers,pp_size):"""均衡流水线阶段负载"""# 计算每层的计算量layer_costs=[compute_layer_cost(layer)forlayerinlayers]# 使用贪心算法分配层stages=[[]for_inrange(pp_size)]stage_costs=[0]*pp_sizeforlayer,costinzip(layers,layer_costs):# 找到当前负载最小的阶段min_stage=min(range(pp_size),key=lambdai:stage_costs[i])stages[min_stage].append(layer)stage_costs[min_stage]+=costreturnstages9.2 张量并行负载均衡
张量并行中,各 GPU 的计算量需要均衡:
| 切分方式 | 负载均衡 | 通信量 | 适用场景 |
|---|---|---|---|
| 均匀切分 | 好 | 小 | 通用 |
| 非均匀切分 | 差 | 大 | 异构设备 |
| 动态切分 | 好 | 大 | 负载变化 |
9.3 数据并行负载均衡
数据并行中,各 GPU 的数据量需要均衡:
| 采样方式 | 负载均衡 | 数据分布 | 适用场景 |
|---|---|---|---|
| 均匀采样 | 好 | 固定 | 通用 |
| 动态采样 | 好 | 变化 | 数据不均匀 |
| 分层采样 | 好 | 分层 | 类别不平衡 |
10. 3D 并行的实际训练数据
10.1 不同配置的性能对比
| 模型 | DP | TP | PP | 总 GPU | 吞吐量 | 扩展效率 |
|---|---|---|---|---|---|---|
| GPT-3 175B | 64 | 8 | 16 | 10,000 | 100 TFLOPS | 65% |
| BLOOM 176B | 8 | 4 | 8 | 384 | 90 TFLOPS | 75% |
| Megatron-Turing | 16 | 8 | 16 | 2,240 | 120 TFLOPS | 70% |
| PaLM 540B | 8 | 4 | 16 | 6,144 | 110 TFLOPS | 68% |
10.2 3D 并行 vs 2D 并行
| 对比维度 | 2D 并行(TP+PP) | 3D 并行(DP+TP+PP) |
|---|---|---|
| GPU 数量限制 | 64 | 无限制 |
| 扩展效率 | 高 | 中 |
| 显存节省 | 1/(TP×PP) | 1/(TP×PP) |
| 通信复杂度 | 中 | 高 |
10.3 3D 并行的显存分布
| 并行策略 | 参数显存 | 激活显存 | 梯度显存 | 优化器显存 |
|---|---|---|---|---|
| 数据并行 | 完整 | 完整 | 完整 | 完整 |
| 张量并行 | 1/TP | 完整 | 1/TP | 1/TP |
| 流水线并行 | 1/PP | 1/PP | 1/PP | 1/PP |
| 3D 并行 | 1/(TP×PP) | 1/PP | 1/(TP×PP) | 1/(TP×PP) |
11. 3D 并行的监控与调试
11.1 常见问题
| 问题 | 表现 | 解决方案 |
|---|---|---|
| 通信超时 | 训练卡住 | NCCL_DEBUG=INFO |
| 显存不足 | OOM 错误 | 减小微批次数量 |
| 梯度爆炸 | loss 变成 NaN | 梯度裁剪 |
| 负载不均衡 | 某些 GPU 利用率低 | 均衡层分配 |
11.2 监控指标
| 指标 | 描述 | 告警阈值 |
|---|---|---|
| GPU 利用率 | 各 GPU 计算利用率 | <70% |
| 通信时间占比 | 通信占总时间比例 | >30% |
| 扩展效率 | 实际加速/理论加速 | <70% |
| 显存使用 | 各 GPU 显存使用率 | >90% |
11.3 性能分析工具
defprofile_3d_parallel(model,batch,profiler):"""3D 并行性能分析"""withprofiler.record_function("forward"):forstageinmodel.pp_stages:withprofiler.record_function(f"pp_stage_{stage.id}"):forlayerinstage.tp_layers:withprofiler.record_function(f"tp_layer_{layer.id}"):output=layer(output)# 打印统计信息foreventinprofiler.events():ifevent.duration>0.1:# 打印耗时超过 100ms 的事件print(f"{event.name}:{event.duration:.2f}ms")12. 3D 并行的扩展
12.1 序列并行
序列并行(Sequence Parallelism)将序列维度拆分到多个 GPU,与 3D 并行组合,形成 4D 并行:
| 并行策略 | 拆分维度 | 通信量 | 适用场景 |
|---|---|---|---|
| 数据并行 | 数据 | 2 × Model | 通用 |
| 张量并行 | 隐藏维度 | 2 × 激活 | 层内 |
| 流水线并行 | 层 | 2 × 层输出 | 层间 |
| 序列并行 | 序列 | 2 × 激活 | 注意力 |
12.2 上下文并行
上下文并行(Context Parallelism)将长序列的上下文拆分到多个 GPU,支持超长序列训练。
12.3 专家并行
专家并行(Expert Parallelism)将 MoE 模型的不同专家分配到不同 GPU,与 3D 并行组合。
总结(最终版)
3D 并行将数据并行、张量并行和流水线并行组合使用,在超大规模 GPU 集群上高效训练万亿级参数模型。数据并行拆分训练数据,张量并行拆分层内权重,流水线并行拆分层间顺序。3D 并行通过优化通信拓扑和负载均衡,实现接近线性的扩展效率。在 10,000 GPU 规模下,3D 并行的扩展效率可达 65%。通信优化(通信重叠、通信压缩)和负载均衡(流水线均衡、数据均衡)是提升 3D 并行效率的关键手段。
总结
3D 并行将数据并行、张量并行和流水线并行组合使用,在超大规模 GPU 集群上高效训练万亿级参数模型。数据并行拆分训练数据,张量并行拆分层内权重,流水线并行拆分层间顺序。3D 并行通过优化通信拓扑和负载均衡,实现接近线性的扩展效率。
13. 3D 并行在工业界的实际案例
13.1 GPT-3 175B 训练
GPT-3 175B 使用 3D 并行在 10,000 V100 GPU 上训练 34 天。配置:DP=64, TP=8, PP=16, 总 GPU=10,000。
| 维度 | 配置 | 说明 |
|---|---|---|
| 数据并行 | 64 | 64 个数据并行组 |
| 张量并行 | 8 | 每节点 8 GPU |
| 流水线并行 | 16 | 16 个流水线阶段 |
| 总 GPU | 10,000 | 64 × 8 × 16 + 额外 |
13.2 BLOOM 176B 训练
BLOOM 176B 使用 3D 并行在 384 A100 GPU 上训练 21 天。配置:DP=8, TP=4, PP=8, 总 GPU=384。
13.3 Megatron-Turing 530B 训练
Megatron-Turing 530B 使用 3D 并行在 2,240 A100 GPU 上训练 14 天。配置:DP=16, TP=8, PP=16, 总 GPU=2,240。
总结
3D 并行将数据并行、张量并行和流水线并行组合使用,在超大规模 GPU 集群上高效训练万亿级参数模型。数据并行拆分训练数据,张量并行拆分层内权重,流水线并行拆分层间顺序。3D 并行通过优化通信拓扑和负载均衡,实现接近线性的扩展效率。
外部引用
- Megatron-LM 3D 并行:https://arxiv.org/abs/1909.08053
- 3D 并行实践指南:https://arxiv.org/abs/1909.08053
- 分布式训练扩展效率:https://arxiv.org/abs/2303.04226
- 通信拓扑优化:https://arxiv.org/abs/1909.08053
- 3D 并行显存分析:https://arxiv.org/abs/1909.08053
- 3D 并行通信优化:https://arxiv.org/abs/1909.08053
- 分布式训练综述:https://arxiv.org/abs/2303.04226
- Megatron-LM 通信组:https://github.com/NVIDIA/Megatron-LM
- 3D 并行配置指南:https://arxiv.org/abs/1909.08053
- 大规模分布式训练:https://arxiv.org/abs/2303.04226