当在多个Docker容器中运行分布式PyTorch Lightning训练作业时(例如通过Slurm),NCCL无法初始化运行在同一主机上的容器之间的进程间通信,但当容器运行在不同主机上时却没有问题,这是为什么,如何修复?
每个PyTorch Lightning示例的命令:
$ docker run ...
日志:
...
0: aws-p4d-02:1:14 [0] transport/p2p.cc:136 NCCL WARN Cuda failure 'invalid device context'
0: aws-p4d-02:1:14 [0] NCCL INFO transport/p2p.cc:238 -> 1
0: aws-p4d-02:1:14 [0] NCCL INFO transport.cc:111 -> 1
0: aws-p4d-02:1:14 [0] NCCL INFO init.cc:778 -> 1
0: aws-p4d-02:1:14 [0] NCCL INFO init.cc:904 -> 1
...
0: Traceback (most recent call last):
0: File "/.../script.py", line 81, in <module>
0: main()
0: File "/.../script.py", line 70, in main
0: td.all_reduce(a) # <--- ncclUnhandledCudaError: Call to CUDA function failed.
0: File "/usr/local/lib/python3.8/dist-packages/torch/distributed/distributed_c10d.py", line 1320, in all_reduce
0: work = default_pg.allreduce([tensor], opts)
0: RuntimeError: NCCL error in: ../torch/csrc/distributed/c10d/ProcessGroupNCCL.cpp:1191, unhandled cuda error, NCCL version 2.10.3
0: ncclUnhandledCudaError: Call to CUDA function failed.
...
1条答案
按热度按时间3qpi33ja1#
禁用Docker容器上的PID(进程ID)命名空间可修复此问题(
docker run --pid=host ...
)。来自日志的堆栈下方跟踪指向NCCL源中的一行,该行在比较PID的分支之后运行。PID命名空间将命名空间外部的PIDMap到命名空间内部的不同PID。因此,同一PID可以表示同一主机上不同命名空间中的不同进程。