Pytorch 多GPU multi-GPU使用 RuntimeError: all tensors must be on devices[0]

问题:
在跑多GPU时出现RuntimeError: all tensors must be on devices[0]问题,找了一番没解决,最后瞎试出来了。
主体代码部分:

os.environ['CUDA_VISIBLE_DEVICES'] = args.gpu
net.cuda()
net = torch.nn.DataParallel(net)

第一次训练时设置的args.gpu=”0,2”,第二次同样配置就出现RuntimeError: all tensors must be on devices[0]问题。google一番,找到几个解决办法:
办法1:
CUDA_VISIBLE_DEVICES中gpu id和DataParallel中device_ids不同,如果使用:

CUDA_VISIBLE_DEVICES = 3,1,2

则:

net = torch.nn.DataParallel(net, device_ids=[0,1,2])

意思是此处的device_ids=[0,1,2]分别对应的是三个gpu3,1,2。但我使用无效。
参考链接
办法2:
使用net.cuda(0)或者with torch.cuda.device(0):指定数据载入gpu。又对我没用。
参考链接
办法3:
在device_ids中只指定一个gpu,代码跑的时候还是使用两个gpu。

os.environ['CUDA_VISIBLE_DEVICES'] = "0,2"
net.cuda()
net = torch.nn.DataParallel(net, device_ids=[0])

分享自己跑多GPU方法:

主要内容如下:
net.cuda()
net = torch.nn.DataParallel(net)
但在这段代码前你调用net的层使用:
for param in net.features.parameters():
    param.requires_grad = True
再经过并行封装后,调用层要加module,尤其注意保存模型时加module:
{'params':net.module.out1.parameters()}
'net': net.module,
### 三级标题:错误信息概述 在使用 PyTorch 进行深度学习模型开发时,用户可能会遇到如下错误信息: ``` RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! ``` 该错误表明当前的运算涉及了位于不同设备上的张量,例如一个张量在 CPU 上,而另一个张量在 GPUcuda:0)上,PyTorch 不支持跨设备的张量操作[^4]。 ### 三级标题:常见错误原因 此错误通常出现在以下几种情况: - 模型和数据不在同一设备上。例如,模型被移动到了 GPU 上,但输入数据仍然在 CPU 上。 - 某些张量是通过 CPU 上的操作生成的,而其他张量则是通过 GPU 上的模型计算得到的。 - 在创建张量时没有显式指定设备,导致默认设备与当前模型所在的设备不一致。 - 使用了 `.to(device)` 或 `.cuda()` 方法但未将结果重新赋值给变量,因此张量仍然位于原始设备上[^5]。 ### 三级标题:解决方法 为了解决这个问题,需要确保所有参与运算的张量都位于相同的设备上。以下是几种常见的解决方式: #### 显式地将张量移动到同一设备 可以使用 `.to(device)` 方法将张量移动到指定设备上。其中 `device` 可以是 `'cuda'` 或 `'cpu'`。例如: ```python device = torch.device("cuda" if torch.cuda.is_available() else "cpu") tensor = tensor.to(device) ``` 确保在执行任何操作之前,所有张量都通过这种方式移动到了相同的设备。 #### 在创建张量时指定设备 当创建新的张量时,可以直接指定其所在的设备: ```python new_tensor = torch.randn(3, 4, device=device) ``` 这可以避免后续操作中出现设备不一致的问题。 #### 检查模型和数据的设备一致性 在训练或推理阶段,确保模型和输入数据位于相同的设备上: ```python model = model.to(device) input_data = input_data.to(device) ``` #### 使用 `.cuda()` 方法(仅限 GPU) 如果明确知道要将张量移动到 GPU 上,也可以使用 `.cuda()` 方法: ```python tensor = tensor.cuda() ``` 但需要注意的是,该方法仅适用于 GPU 设备,且必须确保 GPU 可用。 ### 三级标题:示例代码对比 #### 原始代码(可能导致错误) ```python device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = model.to(device) input_tensor = torch.randn(3, 4) output = model(input_tensor) # input_tensor 仍在 CPU 上 ``` #### 修改后的代码(设备一致) ```python device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = model.to(device) input_tensor = torch.randn(3, 4, device=device) # 直接创建在 GPU 上 output = model(input_tensor) ``` 或者: ```python input_tensor = input_tensor.to(device) # 移动到 GPU 上 output = model(input_tensor) ``` ### 三级标题:最佳实践 - 在程序开始时定义一个 `device` 变量,并在整个代码中使用它来统一设备管理。 - 对于所有张量和模型,确保在创建或使用前调用 `.to(device)`。 - 在调试时,可以使用 `tensor.device` 属性检查张量所在的设备,确认是否一致。 - 如果使用GPU,确保张量和模型都被分配到了正确的 GPU 上(如 `cuda:0`, `cuda:1` 等)。 ### 三级标题:总结 PyTorch 的张量操作要求所有参与运算的张量必须位于相同的设备上。当出现 `Expected all tensors to be on the same device` 错误时,通常是由于张量分布在不同的设备上导致的。通过显式地将张量和模型移动到同一设备,可以在很大程度上避免此类问题。此外,在开发过程中保持良好的设备管理习惯也有助于减少类似错误的发生。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值