实验室GPU编号在pytorch和nvidia-smi中不一致引起的NCCL的分布式训练bug

这是一个很逆天的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)在多卡环境下指定某几张卡的时候,会产生指定的错误

指定特定GPU

【额外的补充信息】

(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"

就完成了

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值