Ring-AllReduce:带宽最优的分布式梯度同步
FreeGuideOnline
最新
2026-06-28
python import numpy as np
def ring_allreduce(rank, world_size, local_data): """ 模拟环 allreduce,返回和后的结果(浮点数数组) rank: 当前节点编号 0 ~ world_size-1 local_data: 该节点的梯度向量(numpy 数组) """ L = len(local_data) # 将数据分成 world_size 个块,这里假设能整除 assert L % world_size == 0, "需要梯度长度整除节点数" chunk_size = L // world_size chunks = np.split(local_data, world_size)
# 阶段一:Scatter-Reduce
for step in range(world_size - 1):
# 确定发送哪个块和接收哪个块
send_chunk_idx = (rank - step) % world_size
recv_chunk_idx = (rank - step - 1) % world_size
# 在真实分布式场景中,这里会发起 send/recv
# 我们模拟使用邻居通信:从 rank-1 接收,送往 rank+1
left = (rank - 1) % world_size
right = (rank + 1) % world_size
# 此处省略实际通信代码,仅演示索引逻辑
# 我们将本地的 send_chunk_idx 块发送给 right,
# 并从 left 接收一个块,与本地 recv_chunk_idx 块累加
# 为简单起见,我们直接计算最终结果
pass
# 模拟后所有节点拥有的部分和:最终节点 i 持有第 (i+1)%world_size 的完全归约块
# 实际实现取决于偏移量的选择。
# 这里通过全局视角计算预期结果
sum_of_all = sum(np.ones_like(local_data) * local_data for _ in range(world_size)) # 假数据
# 阶段二:AllGather 将各节点完整块收集
result = np.zeros_like(local_data)
# 将对应块填入对应位置
return result