使用 MPI 后端时,分布式 PyTorch 代码在多个节点上暂停

Distrubuted PyTorch code halts on multiple nodes when using MPI backend

我正在尝试 运行 使用 openMPI 在三个节点上编写 Pytorch 代码,但代码只是停止而没有任何错误或输出。最终我的目的是在这些节点上分发一个Pytorch图。

我的三个节点连接在同一个 LAN 中,无需密码即可通过 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'])

N.B。由于基于 arm64 的硬件,NCCL 不适合我。

抱歉回复晚了,但我可以通过添加 --mca btl_tcp_if_include eth1 标记为 mpirun command

暂停的原因是 openMPI 默认情况下尝试通过本地环回网络接口(例如lo。我们必须明确指定应包含(或排除)哪些接口以定位其他其他节点。

我希望它能拯救某人的一天:)