Pytorch &引用;“没有到主机的路线”;torch.distributed.init_进程_组中出错

Pytorch &引用;“没有到主机的路线”;torch.distributed.init_进程_组中出错,pytorch,Pytorch,我正在尝试在两台GPU服务器上并行训练一个简单的pytorch模型。我已经从源代码处编译了pytorch。当进程在第二台服务器上运行时,程序给出“RuntimeError:没有到主机的路由”。我怎么修理它 我已经尝试过anaconda安装和pytorch、cuda、NCCL的源代码安装 我已从中复制了以下代码 导入操作系统 从日期时间导入日期时间 导入argparse 导入torch.multiprocessing作为mp 进口火炬视觉 导入torchvision.transforms作为变换

我正在尝试在两台GPU服务器上并行训练一个简单的pytorch模型。我已经从源代码处编译了pytorch。当进程在第二台服务器上运行时,程序给出“RuntimeError:没有到主机的路由”。我怎么修理它

我已经尝试过anaconda安装和pytorch、cuda、NCCL的源代码安装

我已从中复制了以下代码

导入操作系统
从日期时间导入日期时间
导入argparse
导入torch.multiprocessing作为mp
进口火炬视觉
导入torchvision.transforms作为变换
进口火炬
导入torch.nn作为nn
导入火炬。作为dist分发
#从apex.parallel导入分布式数据并行为DDP
#来自apex进口放大器
类ConvNet(nn.Module):
定义初始化(self,num_classes=10):
超级(ConvNet,self)。\uuuu init\uuuuu()
self.layer1=nn.Sequential(
nn.Conv2d(1,16,内核大小=5,步幅=1,填充=2),
nn.2D(16),
nn.ReLU(),
nn.MaxPool2d(内核大小=2,步幅=2)
)
self.layer2=nn.Sequential(
nn.Conv2d(16,32,内核大小=5,步幅=1,填充=2),
nn.2D(32),
nn.ReLU(),
nn.MaxPool2d(内核大小=2,步幅=2)
)
self.fc=nn.Linear(7*7*32,num_类)
def前进(自身,x):
out=自身第1层(x)
out=自身。第2层(out)
out=out.重塑(out.大小(0),-1)
out=self.fc(out)
返回
def main():
parser=argparse.ArgumentParser()
add_参数('-n','-nodes',default=1,type=int,metavar='n')
parser.add_参数('-g','-gpus',default=1,type=int,help='每个节点的gpu数量')
add_参数('-nr','-nr',default=0,type=int,help='classing in the nodes')
add_参数('--epochs',default=2,type=int,metavar='N',help='要运行的总epoch数')
args=parser.parse_args()
args.world_size=args.gpus*args.nodes
操作系统环境['MASTER_ADDR']=“192.168.0.238”
操作系统环境['MASTER_PORT']='8888'
mp.spawn(train,nprocs=args.gpu,args=(args,))
#列车(0,args)
def序列(gpu、args):
秩=args.nr*args.gpu+gpu
dist.init\u进程组(
后端='nccl',
init_method='env://',
世界大小=args.world大小,
秩=秩
)
model=ConvNet()
打印('gpu:',gpu)
torch.cuda.set_设备(gpu)
型号.cuda(gpu)
批量大小=100
criteria=nn.CrossEntropyLoss().cuda(gpu)
optimizer=torch.optim.SGD(model.parameters(),1e-4)
model=nn.parallel.DistributedDataParallel(model,device\u id=[gpu])
train_dataset=torchvision.datasets.MNIST(根='./数据',
火车=真的,
transform=transforms.ToTensor(),
下载=真)
系列采样器=torch.utils.data.distributed.distributed SAMPLE(
列车运行数据集,
num\u副本=args.world\u大小,
秩=秩
)
列车加载器=torch.utils.data.DataLoader(数据集=列车加载器数据集,
批次大小=批次大小,
shuffle=False,
工人数量=0,
pin_memory=True,
取样器=列车(取样器)
start=datetime.now()
总步进=长度(列车装载机)
对于范围内的历元(参数历元):
对于enumerate(列车装载机)中的i(图像、标签):
images=images.cuda(非阻塞=True)
labels=labels.cuda(非阻塞=True)
输出=模型(图像)
损失=标准(输出、标签)
optimizer.zero_grad()
loss.backward()
optimizer.step()
如果(i+1)%100==0且gpu==0:
打印('Epoch[{}/{}],步骤[{}/{}],丢失:{:.4f}'。格式(
纪元+1,
args.epochs,
i+1,
总步数,
损失.第()项
))
如果gpu==0:
打印(“培训完成于:”+str(datetime.now()-start))
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()
TL;博士 这可能是由防火墙引起的

遵循此操作以信任从属节点

逐步检查表: 1。安装
netcat
以帮助我们检查网络

对于Ubuntu:

apt get install netcat

2。检查主流程是否可用

在节点0(或主节点)上:

nc-vv localhost:

到本地主机端口[tcp/tproxy]的输出
连接成功表示您的主进程正在正确运行。否则,请检查主节点上的程序是否正常运行

3。关闭防火墙 如果主节点程序正在工作,并且两个节点应该连接良好,这可能是防火墙问题。对于<强> FixWald,考虑将节点设置为<代码>信任< /代码>区域。有关更多详细信息,请参阅