跳到主要内容

通信优化

目录


通信出现在什么地方

在分布式训练中,通信通常出现在什么地方?

答:

并行方式通信操作通信类型
DP (数据并行)梯度 All-Reduce集合通信
TP (张量并行)激活值和梯度 All-Reduce高频集合通信
PP (流水线并行)前向激活值/后向梯度的 Send/RecvP2P 通信
MoE 架构Token 路由 All-to-All集合通信
ZeRO 框架参数/梯度 All-Gather集合通信

通信原语对比

all-reduce、reduce-scatter、all-gather 有什么区别?

答:

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│ All-Reduce │ │Reduce-Scatter│ │ All-Gather │
├─────────────┤ ├─────────────┤ ├─────────────┤
│ [A0 B0 C0] │ │ [A0 B0 C0] │ │ [A0] │
│ [A1 B1 C1] │ │ [A1 B1 C1] │ │ [B0] │
│ [A2 B2 C2] │ │ [A2 B2 C2] │ │ [C0] │
│ ↓ │ │ ↓ │ │ ↓ │
│ [∑A ∑B ∑C] │ │ [∑A] │ │ [A0 B0 C0] │
│ [∑A ∑B ∑C] │ │ [∑B] │ │ [A0 B0 C0] │
│ [∑A ∑B ∑C] │ │ [∑C] │ │ [A0 B0 C0] │
│ (每张卡完整) │ │ (每张卡部分) │ │ (每张卡完整) │
└─────────────┘ └─────────────┘ └─────────────┘
原语功能典型应用场景
All-Reduce所有卡求和,每张卡得到完整结果DDP 梯度同步
Reduce-Scatter所有卡求和,结果切片分发ZeRO 替代 All-Reduce
All-Gather每张卡广播切片,拼接完整数据ZeRO 参数收集

ZeRO 为什么用 Reduce-Scatter + All-Gather 替代 All-Reduce?

因为 ZeRO 已经把参数分片了,每张卡只保存 1/N 的参数。用 Reduce-Scatter + All-Gather 可以直接得到分片后的梯度,无需额外的 Reduce 操作。

Reduce、Broadcast、AllToAll 分别是什么?

答:

原语功能图示
Reduce所有节点数据聚合到一个节点(如求和)[A0][A1][A2] → GPU0: [∑A]
Broadcast一个节点的数据发送到所有节点GPU0: [A] → [A][A][A]
AllToAll每个节点向每个其他节点发送不同数据MoE token routing 专用

AllToAll 详解(MoE/EP 核心通信):

GPU 0: [A→0, A→1, A→2]    AllToAll → GPU 0: [A→0, B→0, C→0]
GPU 1: [B→0, B→1, B→2] ────────→ GPU 1: [A→1, B→1, C→1]
GPU 2: [C→0, C→1, C→2] GPU 2: [A→2, B→2, C→2]

AllToAll 功能最灵活,但对网络和拓扑要求也最高。MoE 场景中,token 需要根据 router 结果被分发到不同 expert 所在的 GPU,频繁 AllToAll 很容易把网络打满。

通信开销怎么估?

答:

通信时间模型: $T = \alpha + M / \beta$

  • $\alpha$:延迟(建立连接的固定开销)
  • $\beta$:带宽
  • $M$:数据量
通信原语数据量(N 节点)说明
AllReduce$2 \times \frac{N-1}{N} \times M$= ReduceScatter + AllGather
AllGather$\frac{N-1}{N} \times M$每个节点收集其余所有分片
ReduceScatter$\frac{N-1}{N} \times M$聚合后分发到各节点
AllToAll取决于路由模式MoE token routing

关键公式:AllReduce = ReduceScatter + AllGather


通信成为瓶颈的原因

通信为什么会成为大模型训练瓶颈?

答:

核心矛盾:算力增长速度远超网络带宽增长

  • A100 到 H100 算力翻了 3-4 倍
  • 网络带宽只提升了不到 2 倍

结果: 算得太快,传得太慢,计算无法完全掩盖(Overlap)通信延迟。


减少通信开销的方法

如何减少分布式训练中的通信开销?

答:

方法说明
调整 Bucket Size提升 Overlap 效率
通信压缩如 INT8 梯度压缩
参数预取ZeRO-3 中的 Prefetching
合理拓扑设计把高频通信锁在机内(TP 用 NVLink)
减少同步次数全局梯度裁剪(Global Norm)的同步优化

通信与计算重叠

通信和计算重叠是什么意思?为什么重要?

答:

原理:

GPU 的计算单元(SM)和通信单元(如 NVLink/网卡 DMA)是物理独立的。

重叠: 让 GPU 算第 N-1 层梯度的同时,网卡发送第 N 层的梯度。

时间线:
传统方式: [计算 N-1] -> [通信 N] -> [计算 N]
重叠方式: [计算 N-1]
↕ 同时进行
[通信 N] -> [计算 N]
↑ 通信时间被"隐藏"

重要性: 能把通信耗时从总时间中"隐藏"掉。


多机训练的挑战

多机训练和单机多卡相比,最大的挑战是什么?

答:

维度单机多卡多机训练
带宽400GB/s (NVLink)50GB/s (RDMA)
延迟极低 (~1μs)较高 (~10μs)
稳定性
主要挑战较小硬件/网络故障导致的掉线重启

关键: 容错和 Checkpoint 机制极其重要。


面试金句

"算力增长速度远超网络带宽增长。A100 到 H100 算力翻了 3-4 倍,但网络带宽只提升了不到 2 倍。导致算得太快,传得太慢,计算无法完全掩盖通信延迟。"

"GPU 的计算单元(SM)和通信单元是物理独立的。重叠就是让 GPU 算第 N-1 层梯度的同时,网卡发送第 N 层的梯度,能把通信耗时从总时间中'隐藏'掉。"