简单介绍一下,我这新鲜热乎的坑。真的是太少见的了。本人在做pytorch分布式训练,网上找了个小demo准备先让服务器热一下身。
顺手将共享文件传输改成了tcp传输dist.init_process_group(init_method='file:///home/****/nfstest',backend="gloo",world_size=4,group_name="pytorch_test")
变为dist.init_process_group(init_method='tcp://192.168.80.156:8080', backend="nccl", rank=1, world_size=2)
准备好了,小白一枚,也不知道还要加啥,直接把代码扔到服务器上跑去吧。
接下来就是一个大坑,我就开开心心地掉进去了。
程序一运行就报错
Traceback (most recent call last):
File "test_dataparallel.py", line 87, in <module>
model = torch.nn.parallel.DistributedDataParallel(model)
File "/usr/local/anaconda/anaconda3/envs/py37/lib/python3.7/site-packages/torch/nn/parallel/distributed.py", line 285, in __init__
self.broadcast_bucket_size)
File "/usr/local/anaconda/anaconda3/envs/py37/lib/python3.7/site-packages/torch/nn/parallel/distributed.py", line 496, in _distributed_broadcast_coalesced
dist._broadcast_coalesced(self.process_group, tensors, buffer_size)
RuntimeError: NCCL error in: /pytorch/torch/lib/c10d/ProcessGroupNCCL.cpp:514, unhandled system error, NCCL version 2.4.8
想都不想,就知道,这肯定是没安装nccl的问题嘛。nccl官网安装一波。
找到我的系统(centos7,cuda10.2)对应的版本,下载
旁边还有官方安装文档。两步就结束。
rpm -i nccl-repo-rhel7-2.7.8-ga-cuda10.2-1-1.x86_64.rpm
yum install libnccl-2.7.8-1+cuda10.2 libnccl-devel-2.7.8-1+cuda10.2 libnccl-static-2.7.8-1+cuda10.2
兴冲冲跑回去运行代码,结果,duang~~~
依然报之前的错误。
我开始怀疑是自己是不是安装过程中哪一步漏下了。
谷歌了一下,发现有人安装的时候将文件复制到了cuda里,跟cudnn的安装步骤一样。链接。我也来试一下吧。
搞完了之后还是不好使。
根据git上的一个跟我相似的问题看到了可以打印nccl的日志。链接(还有一些其他文章,不记得地址了)。随即在环境变量里添加了
export NCCL_DEBUG=info
export NCCL_SOCKET_IFNAME=eth0
export NCCL_IB_DISABLE=1
全都添加好了重启服务器。
又失败了~~~
我还以为是不是我安装的有问题,因为他一直都在提示NCCL version 2.4.8,而我安装的是2.7.8,我回到官网有好好研究了一下版本支持列表,结果没看到有啥不对啊。
难道是我的安装方法有问题?
参考了这篇文章,我就又安装了一次。并安装了nccl-tests。测试之后没发现啥问题啊。
天啊,我开始怀疑人生了。
根据nccl打印出来的日志
localhost:3401:3401 [0] NCCL INFO Bootstrap : Using [0]enp2s0:192.168.80.156<0>
localhost:3401:3401 [0] NCCL INFO NET/Plugin : No plugin found (libnccl-net.so).
localhost:3401:3401 [0] NCCL INFO NCCL_IB_DISABLE set by environment to 1.
localhost:3401:3401 [0] NCCL INFO NET/Socket : Using [0]enp2s0:192.168.80.156<0>
NCCL version 2.4.8+cuda10.2
localhost:3401:3444 [0] NCCL INFO Setting affinity for GPU 0 to ffff
localhost:3401:3443 [0] include/socket.h:390 NCCL WARN Connect to 192.168.80.157<34630> failed : No route to host
localhost:3401:3443 [0] NCCL INFO bootstrap.cc:100 -> 2
localhost:3401:3443 [0] NCCL INFO bootstrap.cc:226 -> 2
localhost:3401:3444 [0] include/socket.h:390 NCCL WARN Connect to 192.168.80.157<56617> failed : No route to host
localhost:3401:3444 [0] NCCL INFO bootstrap.cc:100 -> 2
localhost:3401:3444 [0] NCCL INFO bootstrap.cc:337 -> 2
localhost:3401:3444 [0] NCCL INFO init.cc:695 -> 2
localhost:3401:3444 [0] NCCL INFO init.cc:951 -> 2
localhost:3401:3444 [0] NCCL INFO misc/group.cc:69 -> 2 [Async thread]
我查了一下No route to host,网上很多说是防火墙挡住了不能通消息。但是我两个机器之间可以ping通啊。于是我将我的端口号单独开启了(直接打开防火墙不安全)。
firewall-cmd --zone=public --add-port=8080/tcp --permanent
systemctl restart iptables.service
systemctl status firewalld
又又又不行~~~
我已经开始唱忐忑了。
关于这个问题的博客我都看得差不多了(本来也没几个)。
我都有点想试一下borovod了。
我翻着翻着看到了这个博客其中的这个评论
他说他解决了,我就尝试了一下。
结果成功了。
谁能想到,,,谁能想到,居然主机名相同还会出问题。
由于我不行永久修改我的主机名所以我使用的是
hostname aaa
修改之后的第一次是有效地。但是我重启机器再次修改了主机名之后又报错了。
正在解决中~~~
我这里出现的问题分为两类:
一类是:
NCCL WARN Connect to 192.168.80.156<51890> failed : No route to host
这类问题的解决方向是网络问题。查看防火墙以及网络端口。
另一类是:
NCCL WARN Bootstrap : no socket interface found
or
NCCL INFO Call to connect returned Connection refused, retrying
这类问题的解决方向是NCCL_SOCKET_IFNAME值得问题。解决方法是非虚拟环境可以使用一下设置:NCCL_SOCKET_IFNAME=en,eth,em,bond
最后确定了就是防火墙的原因了,把两面的防火墙都关了就不会报错了。