我正在尝试使用openMPI在三个节点上运行Pytorch代码,但该代码只是暂停而没有任何错误或输出。最终,我的目的是在这些节点上分布一个Pytorch图。
我的三个节点连接在同一局域网中,并且无需密码即可相互进行SSH访问,并且具有相似的规范:
下面显示的代码可在单个节点上运行-多个进程,如:
> mpirun -np 3 -H 192.168.100.101:3 python3 run.py
具有以下输出:
INIT 0 of 3 Init env://
INIT 1 of 3 Init env://
INIT 2 of 3 Init env://
RUN 0 of 3 with tensor([0., 0., 0.])
RUN 1 of 3 with tensor([0., 0., 0.])
RUN 2 of 3 with tensor([0., 0., 0.])
Rank 1 has data tensor(1.)
Rank 0 has data tensor(1.)
Rank 2 has data tensor(1.)
但是当我将代码放在三个节点上并分别在每个节点上运行以下命令时,它什么也没做:
> mpirun -np 3 -H 192.168.100.101:1,192.168.100.102:1,192.168.100.103:1 python3 run.py
请提供一些有关MPI代码或配置的修改,以使给定的Pytorch代码在多个节点上运行?
#!/usr/bin/env python
import os
import torch
import torch.distributed as dist
from torch.multiprocessing import Process
def run(rank, size):
tensor = torch.zeros(size)
print(f"RUN {rank} of {size} with {tensor}")
# incrementing the old tensor
tensor += 1
# sending tensor to next rank
if rank == size-1:
dist.send(tensor=tensor, dst=0)
else:
dist.send(tensor=tensor, dst=rank+1)
# receiving tensor from previous rank
if rank == 0:
dist.recv(tensor=tensor, src=size-1)
else:
dist.recv(tensor=tensor, src=rank-1)
print('Rank ', rank, ' has data ', tensor[0])
def init_processes(rank, size, fn, backend, init):
print(f"INIT {rank} of {size} Init {init}")
dist.init_process_group(backend, init, rank=rank, world_size=size)
fn(rank, size)
if __name__ == "__main__":
os.environ['MASTER_ADDR'] = '192.168.100.101'
os.environ['BACKEND'] = 'mpi'
os.environ['INIT_METHOD'] = 'env://'
world_size = int(os.environ['OMPI_COMM_WORLD_SIZE'])
world_rank = int(os.environ['OMPI_COMM_WORLD_RANK'])
init_processes(world_rank, world_size, run, os.environ['BACKEND'], os.environ['INIT_METHOD'])
由于基于arm64的硬件,NCCL对我来说不是一个选择。
答案 0 :(得分:1)
很抱歉对此做出答复,但我可以通过在<{3}中添加-mca btl_tcp_if_include eth1 标志来解决该问题。 }。
暂停的原因是,默认情况下,openMPI尝试通过本地回送网络接口(例如, lo 。我们必须明确指定应包含(或排除)哪些接口以定位其他其他节点。
我希望它可以节省某人的一天:)