You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 11:47:47