为何设置CUDA_VISIBLE_DEVICES=2后,DDP中local_rank仍为0?
问题解决思路
首先明确核心机制:当你设置CUDA_VISIBLE_DEVICES=2时,系统的物理2号GPU会被重映射为程序可见的唯一0号GPU——这是CUDA的环境变量隔离机制,目的是让程序只看到指定的GPU,且将其编号重置为0。所以你代码里的torch.cuda.set_device(local_rank)(此时local_rank=0),实际就是在使用你目标的物理2号GPU,这是正常行为。
如果你觉得这个逻辑不符合预期,可以根据你的训练场景选择以下方案:
方案1:保留分布式逻辑,验证当前GPU是否为目标设备
不用修改代码,直接验证程序是否在使用物理2号GPU:
- 在代码中添加验证代码:
输出的设备名称应该对应你系统中的物理2号GPU,说明逻辑是正确的。print(f"可见GPU数量: {torch.cuda.device_count()}") print(f"当前使用GPU名称: {torch.cuda.get_device_name(local_rank)}")
方案2:无需分布式训练,直接指定物理GPU
删除分布式相关的代码逻辑,改用配置文件中的gpu_id直接指定:
# 替换原分布式相关代码 torch.cuda.set_device(gpu_id) # gpu_id=2
- 此时可以去掉
CUDA_VISIBLE_DEVICES=2的环境变量设置,让程序直接看到所有GPU;如果保留环境变量,需要将代码改为torch.cuda.set_device(0),因为此时可见的只有重映射后的0号GPU。
方案3:分布式训练场景下明确绑定物理GPU
如果需要用分布式单卡训练,保持现有代码逻辑即可——因为CUDA_VISIBLE_DEVICES=2已经将物理2号GPU映射为程序内的0号,local_rank=0对应的就是目标设备。启动分布式训练时,确保启动命令中指定--local_rank=0即可。
内容的提问来源于stack exchange,提问作者hanugm
相关产品推荐
相关产品推荐

