NCCL填坑

简介

简单介绍一下,我这新鲜热乎的坑。真的是太少见的了。本人在做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
最后确定了就是防火墙的原因了,把两面的防火墙都关了就不会报错了。

  • 26
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 32
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值