这是一个很逆天的bug,底层逻辑暂时没有想清楚,bug与解决方法报道如下:
(1)关于实验室GPU编号在pytorch和nvidia-smi中不一致的问题
参考链接:不一致的GPU编号
整体上两个核心:1)原因:nvidia-smi 下的 GPU 编号默认使用 PCI_BUS_ID,而 PyTorch 代码默认情况下设备排序是 FASTEST_FIRST
2)解决办法:
export CUDA_DEVICE_ORDER="PCI_BUS_ID"
(2)关于引起的bug与可能的原因:
【bug的报错信息】
NCCL error
RuntimeError: NCCL error in: /opt/conda/conda-bld/pytorch_1667808731763/work/torch/csrc/distributed/c10d/ProcessGroupNCCL.cpp:1272, internal error, NCCL version 2.14.3
ncclInternalError: Internal check failed.
Last error:
Duplicate GPU detected : rank 1 and rank 0 both on CUDA device 4000
pytorch lightning上面错误的行
就在trainer.fit函数里面,会有一个self.consigure_ddp()函数里面还是python的包括,再往底层就是上面的这个nccl error了
【相关的资料】
(1)运用的是pytorch_lightning相关的库,相关讨论见lighting的github上的issue
可以看到,有包括pytorch版本问题,读取的world size等问题,解决方法包括环境变量等等
(2)在多卡环境下指定某几张卡的时候,会产生指定的错误
【额外的补充信息】
(1)前两天在超算系统上申请两块V100进行训练的时候,完全可以跑的通没有这样的错误
【解决过程】
(1)可能是pytorch版本问题,但是我升级到2.0.1之后还是不行
(2)可能是环境变量问题,如lighting的github上的issue,但是加上了哪些关于卡间通讯什么的变量,都没有效果
(3)可能是pytorch_lighting版本与torch版本不兼容问题,但是为什么北京超算能够跑,否定
(4)将超算的环境配置导出,在实验室机器上跑,还是完全相同的问题,无法复现
(5)思考NCCL错误相关的可能因素,主要是指定GPU编号然后设置不同线程使用的device的时候,会产生这样的编号-硬件设备对应上面的错误,因此得考虑实验室机器和超算机器上面在这里的不同之处
(6)想起来实验室机器在nvidia-smi的时候,gpu顺序和pytorch进行指定的时候,顺序不一致
(7)查阅了相关原因,添加了环境变量,让pytorch的顺序和nvidia-smi读取的顺序一致,问题居然就立即解决了
【解决方法】
添加一行
export CUDA_DEVICE_ORDER="PCI_BUS_ID"
就完成了