多机多卡docker分布式训练
正确配置方法是在主机上先新添加一个网桥,这个网桥配置新的网段,启动容器的时候选择该网卡的配置项。docker默认的内网网段为172.17.0.0/16,不同主机的容器ip有可能冲突,所以要先改ip。重新配置容器中的ssh,参考:https://blog.csdn.net/feiying0canglang/article/details/124656425。但是运维说后边想要不同主机容器内的ip互通
一、基于pytorch开源的
pytorch分布式训练ddp,4台机器,每台8个卡。每台机器中配置了一个docker,具体方法参考:https://blog.csdn.net/weixin_41012399/article/details/128645840?spm=1001.2014.3001.5502
方法一:
每个主机的docker 容器配置一个独有ip,不同主机之间的容器相互连通。docker默认的内网网段为172.17.0.0/16,不同主机的容器ip有可能冲突,所以要先改ip。
参考方法:
https://blog.csdn.net/lihongbao80/article/details/122583848
https://www.shuzhiduo.com/A/8Bz8e3AVJx/
按照上边的教程改完ip以后容器内连不上网,应该是少配置了网关或者路由。请教了一个公司的运维同时。正确配置方法是在主机上先新添加一个网桥,这个网桥配置新的网段,启动容器的时候选择该网卡的配置项。
关于容器内网络设置参考一个比较全的文档:
https://blog.csdn.net/Trollz/article/details/126176819
https://blog.csdn.net/qq_42418169/article/details/119102917
添加完一个name叫做gpu的网桥
root@k8s-10-17-70-2-node:~# docker network ls
NETWORK ID NAME DRIVER SCOPE
3bdc4b513df3 bridge bridge local
07d397c6a9e2 gpu bridge local
a14b41570df6 host host local
fe0801fe11b3 none null local
docker network ls
查看docker网卡
docker network rm 网卡id
删除docker网卡
docker network inspect 网卡id
查看docker网卡的相关详细信息
创建容器时添加–network gpu
这样方式修改容器内ip即可成功。但是运维说后边想要不同主机容器内的ip互通是比较复杂的,建议采用使用端口号的形式,通过主机的ip互通。
方法二:
采用使用端口号的形式,通过主机的ip互通。
分布式训练指令
export NCCL_IB_DISABLE=1; export NCCL_P2P_DISABLE=1; NCCL_DEBUG=INFO python -m torch.distributed.launch --nproc_per_node 8 --nnodes 1 --node_rank 0 --master_addr "0.0.0.0" --master_port 1234 train.py
例如4台机器ip分别为
192.70.11.1
192.70.11.2
192.70.11.3
192.70.11.4
进入192.70.11.1主机的docker容器,端口号配置的1234:22.
容器中
ping 192.70.1.1可通
ping 192.70.1.1 -p 22 可通
ping 192.70.1.1 -p 1234 不通
重新配置容器中的ssh,参考:https://blog.csdn.net/feiying0canglang/article/details/124656425
再次
ping 192.70.1.1 -p 1234 可通
但是进行分布式训练
export NCCL_IB_DISABLE=1; export NCCL_P2P_DISABLE=1; NCCL_DEBUG=INFO python -m torch.distributed.launch --nproc_per_node 8 --nnodes 1 --node_rank 0 --master_addr "192.70.1.1" --master_port 1234 train.py
报错
File "/opt/conda/lib/python3.8/site-packages/torch/distributed/elastic/rendezvous/static_tcp_rendezvous.py", line 55, in next_rendezvous
self._store = TCPStore( # type: ignore[call-arg]
RuntimeError: Stop_waiting response is expected
ip改成0.0.0.0不报错。0.0.0.0就是主机ip,但是改成主机ip不对。
改完之后进入容器没有网,需要指定参数–net host设置一下网络
docker run -it --net host --name test6 -v /data:/data --gpus all --shm-size 64G -p 1234:22 nvcr.io/nvidia/pytorch:22.08-py3 /bin/bash
基于horovod
参考:http://chaopeng.name/2020/01/03/horovod%E5%A4%9A%E6%9C%BA%E5%A4%9A%E5%8D%A1%E5%90%AF%E5%8A%A8%E6%8C%87%E5%8D%97/
每一步都成功了,但是最后运行时候报错:
# horovodrun -np 8 -H localhost:4,10.17.70.6:4 -p 12345 python pytorch_imagenet_resnet50.py
Traceback (most recent call last):
File "/usr/local/bin/horovodrun", line 21, in <module>
run.run()
File "/usr/local/lib/python3.6/dist-packages/horovod/run/run.py", line 692, in run
settings, fn_cache=fn_cache)
File "/usr/local/lib/python3.6/dist-packages/horovod/run/util/cache.py", line 103, in wrap_f
results = func(*args, **kwargs)
File "/usr/local/lib/python3.6/dist-packages/horovod/run/run.py", line 229, in _driver_fn
driver.wait_for_initial_registration(settings.timeout)
File "/usr/local/lib/python3.6/dist-packages/horovod/run/common/service/driver_service.py", line 117, in wait_for_initial_registration
timeout.check_time_out_for('tasks to start')
File "/usr/local/lib/python3.6/dist-packages/horovod/run/common/util/timeout.py", line 32, in check_time_out_for
raise Exception(self._message.format(activity=activity))
Exception: Timed out waiting for tasks to start. Please check connectivity between servers. You may need to increase the --start-timeout parameter if you have too many servers.
机器A中在容器里#测试是否可以免密登录
ssh -p 12345 B
是正确的,但是运行还是报错连接不上。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)