最近在折腾一个图像分类项目,单卡跑没问题,但想试试多卡加速。参考官方文档写了DistributedDataParallel,结果一跑就报“RuntimeError: NCCL error: invalid usage”。排查了半天,发现好像是我设了torch.cuda.set_device(local_rank)后,主进程和子进程的设备号对不上?我用的启动命令是torchrun --nproc_per_node=2 train.py,代码里也加了init_process_group(backend='nccl')。是不是我多卡初始化顺序有问题,或者环境变量没设全?有没有大佬能帮忙看看常见坑在哪?先谢谢了!
楼主
22小时前
用PyTorch做多卡训练,DDP一直报错找不到设备,求指点
请 登录 后发表回复
全部回复
共 2 条
2楼
19小时前
试试点把set_device放到init_process_group后面,我上次这么换了下顺序就好了。
3楼
6小时前
这个问题我之前也踩过坑,大概率是你设了set_device之后,和torchrun自动分配的设备号冲突了。torchrun默认会把local_rank传给每个进程,但你在代码里手动set_device等于又把设备指定了一遍,容易导致主进程占用了子进程的卡。建议把set_device那行删掉,直接用torchrun的local_rank环境变量来获取设备索引,然后靠init_process_group里的rank参数来对齐。另外有个细节,nccl后端对设备顺序很敏感,最好在init_process_group之前就把当前进程的cuda设备绑定好,可以用torch.cuda.set_device(local_rank)但必须确保local_rank是从环境变量里读的,而不是自己写死的。还有一个常见问题是环境变量MASTER_ADDR和MASTER_PORT没设置,虽然torchrun会默认填上,但如果你在代码里手动覆盖了可能会乱掉。如果还不行,试试把world_size也显式传进去,有时候多卡训练里这几个参数少一个就会报NCCL invalid usage。