Pytorch中dist.broadcast调用卡住 广播发送进程停止工作其余进程未收更新
问题根因
你代码的核心错误是集合通信接口dist.broadcast要求全局所有rank都必须主动调用,不能仅在源rank(此处为rank 0)的分支中调用。广播操作本身是跨进程同步操作,源rank会等待所有目标rank都进入broadcast调用后才会执行数据分发,你当前的写法里只有rank 0调用了dist.broadcast,其余rank都没有调用该接口,所以rank 0会一直处于等待状态卡死,其他进程直接执行打印逻辑,拿到的自然还是初始化的0值。
另外你代码中的dist.barrier同样属于集合通信接口,也不能仅放在rank 0的分支内,否则同样会触发卡死问题。
修复方案
将dist.broadcast和dist.barrier移出rank 0的条件分支,保证所有进程都能调用到对应接口即可,修改后的run函数如下:
def run(rank, size): tensor = torch.zeros(1) if rank == 0: tensor += 1 # 所有rank统一调用broadcast,非源rank会自动接收src发送的张量,覆盖本地tensor的值 dist.broadcast(tensor=tensor, src=0) dist.barrier() print('Rank ', rank, ' has data ', tensor[0])
补充说明
- 该问题属于分布式集合通信的通用使用规则,和你使用的PyTorch 1.9.0版本无关,所有版本的PyTorch分布式都需要遵循该调用要求
- 非源rank调用
dist.broadcast时不需要做额外赋值操作,接口会自动将传入的tensor的值更新为源rank发送的内容
内容的提问来源于stack exchange,提问作者T C
相关产品推荐
相关产品推荐

