网络拓扑与训练效率
网络拓扑是分布式训练效率的关键因素。GPU 间的互连方式(NVLink、PCIe、InfiniBand)和拓扑结构直接决定了通信带宽和延迟,进而影响训练吞吐。
互连技术对比
| 互连 | 带宽 | 延迟 | 距离 | 用途 |
|---|---|---|---|---|
| NVLink 4.0 | 900GB/s 双向 | ~1μs | 芯片间 | TP 通信 |
| NVSwitch | 900GB/s 双向 | ~2μs | 节点内 | TP/DP |
| PCIe 5.0 | 64GB/s 双向 | ~5μs | 节点内 | 低优先级 |
| InfiniBand NDR | 400Gb/s | ~2μs | 节点间 | DP/PP |
| Ethernet 400G | 400Gb/s | ~5μs | 节点间 | 辅助网络 |
拓扑感知训练
bash
# 查看节点内 GPU 拓扑
nvidia-smi topo -m
# 示例输出(8×A100 NVLink 全互联)
# GPU0 GPU1 GPU2 GPU3 GPU4 GPU5 GPU6 GPU7
# GPU0 X NV12 NV12 NV12 NV12 NV12 NV12 NV12
# GPU1 NV12 X NV12 NV12 NV12 NV12 NV12 NV12
# ...(全 NVLink 互联)python
# 根据 NCCL 拓扑调整并行策略
def optimize_parallelism(topo_matrix):
"""根据拓扑矩阵优化并行度"""
# NVLink 全互联:支持高 TP 度
nvlink_groups = find_nvlink_groups(topo_matrix)
# TP 限制在 NVLink 组内
tp_size = min(len(nvlink_groups[0]), 8)
# PP 用于跨 NVLink 组
pp_size = len(nvlink_groups)
return tp_size, pp_sizeInfiniBand 配置
bash
# IB 链路检查
ibstat # HCA 状态
ibping -S # IB 连通性测试
ibwritebw <server> # 带宽测试
# NCCL IB 配置
export NCCL_IB_DISABLE=0
export NCCL_IB_GID_INDEX=3
export NCCL_IB_HCA=mlx5_0,mlx5_1 # 指定 HCA
export NCCL_SOCKET_IFNAME=ib0 # IB 网络接口
export NCCL_NET_GDR_LEVEL=5 # GPUDirect RDMA胖树拓扑
大规模集群通常采用胖树(Fat-Tree)拓扑:
Core Switch (NDR400)
/ | \
Spine1 Spine2 Spine3
/ \ / \ / \
Leaf1 Leaf2 Leaf3 Leaf4 ...
| | | |
Node1 Node2 Node3 Node4| 集群规模 | 拓扑 | 交换机 | 跨交换机带宽 |
|---|---|---|---|
| 32 节点 | 单层 | 1× NDR | 51.2Tbps |
| 128 节点 | 两层 | 8+1 | 51.2Tbps |
| 1024 节点 | 三层 | 64+8+1 | 收敛比 4:1 |
拓扑感知调度
- TP 通信最密集,必须在 NVLink 组内
- DP 通信(AllReduce)可跨节点,对带宽要求高
- PP 通信(P2P)量最小,适合跨节点
- 调度系统应将同一训练任务分配到相同 Leaf 下的节点
胖树收敛比
大规模集群的胖树收敛比通常 >1,意味着跨核心交换机的带宽不足。训练任务应尽量限制在同一 Spine 下。