多卡/多机的通信与调度瓶颈
一句话定位:单卡装不下就要并行,而并行的代价是通信。选错并行策略或忽视拓扑,加卡不加速——判断标准只有一个:扩展效率是否线性。
1. 张量并行(TP)vs 流水并行(PP)
1 张量并行(Tensor Parallelism)
- 做法:把同一层内的权重矩阵按行/列切分到多卡,各卡算一部分再合并。
- 特点:通信密集——每层前向都需要 AllReduce/AllGather 同步激活,通信发生在每一层、且在关键路径上。
- 结论:宜放同机内、走 NVLink(高带宽低延迟)。跨机做 TP 会被网络带宽拖死。
2 流水并行(Pipeline Parallelism)
- 做法:把模型按层切段,不同卡持有不同层,数据像流水线一样逐段流过。
- 特点:通信量小(只在段边界传激活),适合跨机;但存在气泡(bubble)问题——流水线填充与排空阶段部分卡空闲,micro-batch 数越少气泡占比越高。
- 缓解:增加 micro-batch 数量、使用 1F1B / 交错式调度减少气泡。
对比记忆:TP 换通信量、PP 换空闲气泡;实践中常混合使用(机内 TP + 跨机 PP,再叠加数据并行)。
2. NCCL 通信原语与拓扑感知
- AllReduce:所有卡的数据求和(或其他归约)后,结果分发给所有卡——TP 与数据并行的梯度/激活同步主力。
- AllGather:把各卡各自持有的分片汇集成完整数据,每卡都得到全量(常用于收集切分的激活或权重)。
- 其余:ReduceScatter、Broadcast、AllToAll(MoE 场景关键)。
- 拓扑感知:NCCL 会探测硬件拓扑(NVLink / NVSwitch / PCIe / 网卡),自动选择 Ring、Tree 等算法与最优路径。因此物理拓扑决定上限:NVLink 全连接 > PCIe > 跨机 RDMA/以太网,差距可达数量级。部署时要确认卡间实际连接方式(
nvidia-smi topo -m)。
3. 如何判断通信瓶颈:看扩展效率是否线性
标准方法:
- 测单卡吞吐
T1,测 N 卡吞吐TN; - 计算扩展效率
= TN / (N × T1); - 效率接近 1 → 通信不是瓶颈;效率显著衰减(如 8 卡只有 4~5 倍)→ 通信瓶颈。
- 进一步用 Nsight Systems 看时间线上通信 Kernel(NCCL kernel)占比与是否与计算重叠;用 NCCL 的带宽基准测试对比理论带宽。
对应动作:调整并行策略(把 TP 收进单机)、增大 micro-batch 减少气泡、开启通信与计算重叠、检查拓扑与网卡配置。
参考:NCCL 官方文档;论文《DeepSpeed-Inference: Enabling Efficient Inference of Transformer Models at Unprecedented Scale》