PyTorch指定GPU仍提示设备忙,多GPU识别异常求助
解决办法
1. 确保环境变量在导入PyTorch前设置
你的脚本中os.environ配置必须放在导入torch的代码之前,否则PyTorch初始化CUDA时不会读取新设置的环境变量。正确的代码顺序如下:
import os # 先设置CUDA环境变量 os.environ["CUDA_DEVICE_ORDER"] = 'PCI_BUS_ID' os.environ["CUDA_VISIBLE_DEVICES"] = '2,3,4' # 再导入PyTorch import torch print(f'[INFO] Available GPUs: {torch.cuda.device_count()}') for d in range(torch.cuda.device_count()): print(f'映射后GPU {d} (对应原GPU {["2","3","4"][d]}): {torch.cuda.get_device_name(d)}')
正常生效后,device_count会显示为3,而非10。
2. 检查全局环境变量是否覆盖临时设置
查看系统或用户的全局配置文件(如~/.bashrc、~/.profile、/etc/profile)中是否预先设置了CUDA_VISIBLE_DEVICES,全局配置会覆盖你临时设置的值。可以用以下命令排查:
grep -r "CUDA_VISIBLE_DEVICES" ~/.bashrc ~/.profile /etc/profile
如果发现全局配置,可先清除再启动脚本:
unset CUDA_VISIBLE_DEVICES && CUDA_VISIBLE_DEVICES=2,3,4 python gdxray_cganTrainer.py
3. 验证目标GPU是否真的空闲
执行nvidia-smi命令,确认GPU#2、#3、#4没有被其他进程占用:
nvidia-smi
如果这些GPU的Used GPU Memory不为0,或存在未知PID,需终止对应进程:
# 替换<PID>为占用GPU的进程ID kill -9 <PID>
4. 代码中使用映射后的GPU索引
设置CUDA_VISIBLE_DEVICES=2,3,4后,PyTorch会将原GPU#2映射为cuda:0,原GPU#3映射为cuda:1,原GPU#4映射为cuda:2。代码中需使用映射后的索引,而非原GPU编号:
# 单GPU使用示例 device = torch.device('cuda:0') # 对应原GPU#2 # 多GPU并行示例 model = torch.nn.DataParallel(model, device_ids=[0,1,2])
5. 升级PyTorch版本(可选)
torch 1.8.0与cuda 11.1的组合存在部分环境变量处理的已知bug,升级到更稳定的版本(如1.12.x系列)可解决兼容性问题:
pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 --extra-index-url https://download.pytorch.org/whl/cu113
内容的提问来源于stack exchange,提问作者ROBOTechnics
相关产品推荐
相关产品推荐

