Docker中的Torch分配失败:NCCL WARN Cuda故障“设备上下文无效”

zzlelutf  于 2023-03-17  发布在  Docker
关注(0)|答案(1)|浏览(775)

当在多个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.
...
3qpi33ja

3qpi33ja1#

禁用Docker容器上的PID(进程ID)命名空间可修复此问题(docker run --pid=host ...)。来自日志的堆栈下方跟踪指向NCCL源中的一行,该行在比较PID的分支之后运行。PID命名空间将命名空间外部的PIDMap到命名空间内部的不同PID。因此,同一PID可以表示同一主机上不同命名空间中的不同进程。

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

相关问题