通信优化
目录
通信出现在什么地方
在分布式训练中,通信通常出现在什么地方?
答:
| 并行方式 | 通信操作 | 通信类型 |
|---|---|---|
| DP (数据并行) | 梯度 All-Reduce | 集合通信 |
| TP (张量并行) | 激活值和梯度 All-Reduce | 高频集合通信 |
| PP (流水线并行) | 前向激活值/后向梯度的 Send/Recv | P2P 通信 |
| 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 层的梯度,能把通信耗时从总时间中'隐藏'掉。"