DDP(分布式数据并行)中 N 张卡各持有本分片数据的梯度
gi,训练必须把各卡梯度求和(或平均)得到全局梯度——这正是 All-Reduce 操作。设单卡梯度总大小为
S 字节。朴素实现(每卡把全量梯度
S 发给其余 N−1 卡)每卡通信量
O(NS),随卡数线性放大、不可扩展;Ring-AllReduce 通过环形拓扑把每卡通信量降到约
2S、与 N 无关,是带宽最优方案。把梯度切成 N 个 chunk(每块大小
S/N),两阶段各 N−1 步: ① Scatter-Reduce: 第 k 步,
ranki 把本地 chunk
(i−k)modN 发给下一跳
rank(i+1)modN,同时从
rank(i−1)modN 收到 chunk
(i−k−1)modN 并原地累加;N−1 步后每个 rank 恰好完整拥有某一个 chunk 的全局和(不同 chunk 的和分布在不同 rank 上)。② All-Gather: 拥有全局和的 rank 沿环把该 chunk 转发,再 N−1 步后所有 rank 都持有全部 chunk 的全局和。通信量推导: 每步每卡发送
S/N 字节,两阶段共
2(N−1) 步,每卡总发送量
V=2(N−1)⋅NS=2NN−1S,当
N→∞ 时
V→2S——因为每步传输量
S/N 随 N 缩小、而步数
N−1 随 N 增长,两者乘积收敛到常数,所以每卡通信量(带宽)与 N 无关(全量梯度只被传
O(S) 而非
O(NS))。但延迟项是
2(N−1) 次串行 hop,仍随 N 线性增长: 小消息、慢网络下 Ring 不是最优,因此 NCCL 在跨节点/小数据时用 tree 算法、在节点内用 NVLink 分层 reduce。梯度重叠: 反向传播按层从后往前计算梯度,DDP 把参数按 bucket(默认约 25MB)分桶,每个 bucket 的梯度一旦就绪立即异步发起该桶的 All-Reduce,与后续层的反向计算并行(compute 与 communication 重叠),通信延迟几乎被完全隐藏;全局梯度裁剪在全部 All-Reduce 完成之后、优化器 step 之前进行。