先记住一句话

分布式性能不是 GPU 数量相加,而是“每卡有效计算 − 暴露的通信 − 不均衡 − bubble”;先画拓扑和 tensor 流,再选择并行维度。

画 GPU/node topology列 tensor collective估 α+bytes/β选 DP/TP/PP/shardbucket/overlap量 scaling + stragglers
Within GPUHBM
fast
Within nodeNVLink / PCIe
slower
Across nodesNIC / fabric
collectives
Parallel dimensionsDP / TP / PP
同一 collective 跨越哪一级拓扑,常比名义 GPU 数更决定扩展效率。

1. 互联层次

卡内 HBM 最快;单机 GPU 之间可能经过 NVLink/NVSwitch 或 PCIe;跨机常经过 NIC 与 InfiniBand/RoCE。GPU、CPU NUMA node 与 NIC 的亲和性会改变路径,错误绑核/绑卡可能让流量绕远。理论 link rate 也不等于 collective 的应用有效带宽。

2. 延迟—带宽模型

T_comm ≈ α × message_rounds + bytes / effective_bandwidth

小消息由启动/同步延迟 α 主导,大消息由 bandwidth 主导。把许多小 gradient 合成 bucket 可摊薄 latency,但 bucket 太大会推迟第一次通信,减少与 backward overlap。

3. Collective 在搬什么

Collective语义常见用途
Broadcast一个 rank 发给所有 rank参数/配置分发
AllReduce聚合后每个 rank 得到结果DDP 梯度同步
ReduceScatter聚合并把结果分片sharded gradients
AllGather收集所有 rank 分片sharded parameters/activations
AllToAll每 rank 向每 rank 发不同分片MoE token dispatch

4. Ring 与 tree 直觉

ring 把大 tensor 分块沿环传递,链路利用率高、步骤随 rank 增加;tree 用对数层级聚合/广播,对较小消息延迟更好。NCCL 会根据拓扑、消息大小和环境选择协议/算法;手动覆盖前先用 profiler 和 NCCL tests 证明默认选择不合适。

5. 并行策略

  • Data parallel:模型复制、batch 分片、梯度 AllReduce;简单但每卡需放模型/optimizer。
  • Tensor parallel:单层矩阵沿维度分片,每层有 collectives;适合超大层,通信频繁。
  • Pipeline parallel:层分 stage,microbatches 流过;有 activation transfer 与 bubble。
  • Expert parallel:experts 分卡、tokens AllToAll;负载均衡和 network 极关键。
  • Sequence/context parallel:长序列维分片,改变 attention/normalization 通信。

6. 通信重叠

DDP 可在某个 gradient bucket ready 时异步 AllReduce,同时继续计算更早层 backward。重叠只隐藏与独立计算并发的部分;若 compute 和 communication 争用同一 memory fabric、stream dependency 错误或最后一个 bucket 无后续计算,通信仍暴露在 critical path。

7. 扩展效率

strong-scaling efficiency = T₁ / (N × Tₙ)

固定 global problem 增加 N 时,每卡计算变少而同步不同比例减少,效率下降;weak scaling 保持每卡工作量更容易好看。训练还要注明 global batch 是否变化,否则吞吐比较同时改变了优化问题。

8. Straggler 与 hang

collective 必须让 ranks 以兼容顺序、shape 和 count 进入;一张卡先 OOM/异常,其余可能表现为 timeout。dataloader、CPU jitter、thermal throttle、网络拥塞也让所有 ranks 等最慢者。诊断需对齐每 rank 日志、collective sequence、GPU/NIC counters 和 topology。

9. NCCL 与 MPI 的关系

NCCL 专注 GPU collectives,并按 NVIDIA GPU/interconnect topology 优化;MPI 是更广泛的分布式消息接口,可传 CPU/GPU buffers(具体 CUDA-aware 支持依实现)。许多系统用 MPI/launcher 建立进程,用 NCCL 执行大规模 GPU collectives。

10. 四个 multi-GPU 手算

例 1:α–β 模型

传 100 MB,startup latency α=20 μs、effective bandwidth β=25 GB/s,时间≈20 μs+0.1/25 s=4.02 ms。小 message 看 α,大 message 看 bandwidth。

例 2:ring all-reduce volume

P=8、tensor=1 GB,ring 每 rank 发送约 2(P−1)/P×1 GB=1.75 GB。在 50 GB/s 理想链路上纯 bandwidth 下限约 35 ms(忽略 latency/contention)。

例 3:scaling efficiency

8 GPUs 吞吐 800 samples/s,32 GPUs 为 2600。相对 speedup=3.25×,理想是 4×,efficiency=3.25/4=81.25%

例 4:pipeline bubble

Pipeline stages=4、microbatches=8,简化 fill/drain efficiency=8/(8+4−1)=72.7%。增到 32 microbatches 可到 32/35=91.4%,但 activation/latency 也变化。

常见误解:

NVLink 带宽高不代表跨节点也一样快。一次并行策略可能在单机 8 卡优秀,却在多机因 AllToAll/AllReduce 跨越较慢网络而反转。

自测

1. 为什么 gradient bucket 不能无限增大?

虽能摊薄小消息延迟,但要等更多 gradients ready 才开始通信,削弱 backward overlap,并增加临时内存。

2. AllReduce 可如何分解?

常可理解为 ReduceScatter 得到归约分片,再 AllGather 让所有 ranks 获得完整结果。

3. 为什么 MoE 容易出现通信长尾?

token routing 不均会让某些 experts/ranks 过载,AllToAll 流量和计算都由最拥挤路径决定。

官方资料

NVIDIA NCCL Overview说明 topology-aware GPU collective 通信;Collective Operations定义 Broadcast、Reduce、AllReduce、AllGather、ReduceScatter 与 AllToAll 语义。