跳转至

集群拓扑感知的并行策略设计

更新日期:2026-04-14


一、集群硬件拓扑

1.1 典型 GPU 集群层次

flowchart LR
    gpu["GPU<br/>HBM 5-8 TB/s"]
    nvlink["NVLink<br/>900 GB/s"]
    nvswitch["NVSwitch<br/>(节点内 8 GPU)"]
    ib["InfiniBand<br/>200/400/800 Gb/s<br/>(节点间)"]
    eth["Ethernet<br/>100 Gb/s<br/>(数据中心间)"]

    gpu --- nvlink --- nvswitch --- ib --- eth

    classDef stage fill:#fff,stroke:#cc785c,color:#1a1a1a;
    class gpu,nvlink,nvswitch,ib,eth stage
层级 带宽 延迟 适合通信
HBM 3-8 TB/s ns layer 内(attention / matmul)
NVLink 900 GB/s μs TP(tensor parallel)
NVSwitch 节点内 all-to-all μs TP / EP all-to-all
InfiniBand 200-800 Gb/s μs-ms DP / PP / 跨节点
Ethernet 100 Gb/s ms 数据中心间 / pre-training distributed checkpoint

1.2 各层级带宽对比

带宽数字是理论峰值。实际有效带宽通常是理论的 70-85%,且受拓扑结构影响(fat-tree vs rail-optimized)。

1.3 两种主流网络拓扑

Rail-optimized 拓扑示例(NVIDIA DGX SuperPOD)

共 8 条 rail,每条 rail 将所有节点上相同编号的 GPU 直连: 这种拓扑下的通信特征: - 同 rail 通信快(直连) - 跨 rail 通信慢(需要经过节点内 NVSwitch) - TP 必须限制在节点内(跨 rail 的 AllReduce 太慢) - PP 可以使用 rail-aware placement 来优化


二、并行策略设计方法论

2.1 设计流程

flowchart LR
    s1["1. 模型规模<br/>+ 显存估算"]
    s2["2. 选 TP<br/>(节点内, ≤8)"]
    s3["3. 选 PP<br/>(跨节点, 减 bubble)"]
    s4["4. 算 DP<br/>(剩余 GPU)"]
    s5["5. MoE 加 EP<br/>(expert parallel)"]
    s6["6. 长 context 加 CP<br/>(context parallel)"]
    s7["7. profile + 调优"]

    s1 --> s2 --> s3 --> s4 --> s5 --> s6 --> s7

    classDef stage fill:#fff,stroke:#cc785c,color:#1a1a1a;
    class s1,s2,s3,s4,s5,s6,s7 stage

设计原则:

  • TP ≤ 节点内 GPU 数(NVLink 带宽够,跨节点会拖慢)
  • PP 用于减少单 GPU 显存 + inter-stage bubble = (P-1)/M(micro-batch 数 M 越大越好)
  • DP 是剩下的并行度,理论无上限但 communication overhead 增加
  • EP / CP 是特殊场景的 fallback

2.2 显存估算公式

def estimate_memory_per_gpu(
    N_params,      # 模型参数量 (B)
    seq_len,       # 序列长度
    batch_size,    # micro batch size per GPU
    tp, pp,        # 并行度
    dtype_bytes=2, # BF16 = 2 bytes
    optimizer='adamw',
    activation_checkpoint=True,
):
    # 1. 模型权重
    weights = N_params * dtype_bytes / tp / pp  # GB

    # 2. 优化器状态
    if optimizer == 'adamw':
        # AdamW: m (fp32) + v (fp32) + master weights (fp32) = 12 bytes/param
        opt_states = N_params * 12 / tp / pp  # GB
    elif optimizer == 'muon_adamw':
        # Muon: buf (bf16) = 2 bytes/param for 2D
        # AdamW: 12 bytes/param for rest
        opt_states = N_params * 8 / tp / pp  # 粗估

    # 3. 梯度
    gradients = N_params * dtype_bytes / tp / pp  # GB

    # 4. 激活内存 (最大的变量!)
    if activation_checkpoint:
        # 只存 checkpoint 点的激活, sqrt(layers) 个
        n_layers_per_pp = total_layers / pp
        activations = batch_size  seq_len  d_model  dtype_bytes  sqrt(n_layers_per_pp) / tp
    else:
        activations = batch_size  seq_len  d_model  dtype_bytes  n_layers_per_pp * 10 / tp
        # 10 ≈ 每层需要存的中间张量数

    # 5. KV Cache (仅推理, 训练不需要)

    # 6. 通信 buffer
    comm_buffer = 1  # GB, 粗估

    total = weights + opt_states + gradients + activations + comm_buffer
    return total  # GB

2.3 实际配置示例

场景 模型 集群 TP PP DP EP CP Global BS MFU
中等规模 Dense 13B 32×H100 4 1 8 - 1 4M tokens 52%
大规模 Dense 70B 128×H100 8 2 8 - 1 4M tokens 48%
超大 Dense 405B 16K×H100 8 16 128 - 1 16M tokens 43%
MoE 671B(37B act) 2K×H800 1 16 2 64 1 30M tokens 40%
长上下文 70B, 128K 256×H100 8 4 2 - 4 256K×8 35%
VLM 训练 70B + ViT-L 64×H100 8 1 8 - 1 2M tokens 42%

三、常见错误与调优

3.1 配置错误导致的性能问题

3.2 快速调优 Checklist

按顺序检查以下项目: 1. TP 是否在节点内?

  1. 是否开启了 --overlap-grad-reduce--overlap-param-gather

  2. micro-batch-size 是否足够大?(H100: 至少 2-4 per GPU)

  3. activation checkpointing 是否开启?(减少内存,代价是 ~30% 额外计算)

  4. Flash Attention 是否开启?

  5. 是否使用了 fused kernels?(FusedLayerNorm, FusedSoftmax)

  6. DataLoader 是否是瓶颈?(用 --num-workers 检查)

  7. 网络拓扑是否匹配并行策略?(NCCL_TOPO_DUMP_FILE 检查)


四、NCCL 调试

# 常用 NCCL 环境变量
env_vars = {
    'NCCL_DEBUG': 'INFO',           # 打印 NCCL 通信日志
    'NCCL_TOPO_DUMP_FILE': '/tmp/nccl_topo.xml',  # 导出拓扑
    'NCCL_IB_DISABLE': '0',         # 确保 IB 启用
    'NCCL_NET_GDR_LEVEL': '5',      # GPU Direct RDMA 级别
    'NCCL_SOCKET_IFNAME': 'eth0',   # 指定网卡
    'NCCL_P2P_LEVEL': 'NVL',        # NVLink P2P 级别
}

# 诊断慢通信:
# 1. NCCL_DEBUG=INFO → 看通信算法选择 (Ring/Tree/Direct)
# 2. NCCL_TOPO_DUMP_FILE → 确认 NCCL 检测到的拓扑是否正确
# 3. nccl-tests → 跑 all_reduce_perf 测实际带宽
# 4. 对比理论带宽 vs 实际带宽 → 差距大说明有问题

五、多数据中心训练

2025-2026 新兴方向:跨数据中心训练。Megatron Core v0.11.0 开始支持。


参考文献


上级 · C. 分布式训练基础设施