PyTorch多GPU训练疑问:指定GPU5、6后current_device显示为0
如何正确使用指定的GPU(ID 5、6)
你遇到的这个情况其实是CUDA_VISIBLE_DEVICES的正常映射行为,完全不用慌~
当你通过CUDA_VISIBLE_DEVICES=5,6 train.py启动程序时,系统会给当前进程做一个GPU编号映射:它会隐藏所有未指定的GPU,然后把你选中的GPU 5和6,在程序内部重新编号为cuda:0和cuda:1。这就是为什么torch.cuda.current_device()返回0(默认绑定第一个可见GPU),而torch.cuda.device_count()返回2(正好对应你指定的GPU数量)——程序的表现完全符合预期。
下面是几种正确使用这两个GPU的具体方式:
1. 手动指定单GPU运行
如果只想用其中某一个GPU(比如实际的GPU5),直接在代码里使用映射后的编号即可:
# 对应实际硬件的GPU5 device = torch.device("cuda:0") # 要是想用实际的GPU6,就写成: # device = torch.device("cuda:1") # 将模型和输入数据移到指定设备 model = model.to(device) inputs = inputs.to(device)
2. 多GPU并行训练
如果要同时利用GPU5和6的算力,可以用PyTorch提供的并行训练工具:
方法一:DataParallel(单机器多GPU首选,简单易用)
# 指定程序内部可见的两个GPU编号[0,1],对应实际的5和6 model = torch.nn.DataParallel(model, device_ids=[0, 1]) model = model.to("cuda")
框架会自动把模型拆分到两个GPU上,完成并行计算和结果聚合。
方法二:DistributedDataParallel(适合多机器或高需求场景)
如果需要更高效率的分布式训练,启动命令保持不变,代码里按映射后的编号初始化即可:
torch.distributed.init_process_group(backend='nccl') model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[torch.cuda.current_device()])
3. 验证GPU是否正常工作
你可以在终端执行nvidia-smi命令,查看实际硬件中GPU5和6的显存占用、利用率等指标——因为程序内部的编号是映射后的,实际硬件的编号还是5和6,所以通过nvidia-smi能直接确认它们是否在正常运行。
另外,如果你想切换默认的当前设备,可以用这个命令:
torch.cuda.set_device(1) # 切换到程序内部的cuda:1,对应实际的GPU6 print(torch.cuda.current_device()) # 此时会输出1
内容的提问来源于stack exchange,提问作者Shengyu Liu
相关产品推荐
相关产品推荐

