pytorch多gpu的问题(RuntimeError: Expected tensor for argument #1 ‘input‘ to have the same device as ...)

1. pytorch正常使用多GPU的方式

# 导入需要的库
import torch
import torch.nn as nn

# 设置torch.device
device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu')

# 假定这里直接导入了model
model = torch.load('xxx.pth')

# 利用nn.DataParallel(device_ids设置多gpu的id)
model = nn.DataParallel(model, device_ids = [0, 1])
model.to(device)
model.eval()  # 假设这里要作推理用

# 推理, 假设输入是img
result = model(img.to(device))

注:这里设置device从0号gpu开始,后面的device_ids里也必须要有0,其他id自己设置。

2. 报错:RuntimeError: Expected tensor for argument #1 ‘input’ to have the same device as …

2.1 问题描述

input和weight不再同一个device上,就是输入跟模型的参数不再同一个gpu上,所以报错。
在这里插入图片描述

2.2 问题分析

跟模型的定义形式有关。
在这里插入图片描述(1)上图中子模块的定义只是单纯地copy了self.g的操作(不是tensor,即没有继承nn.Module的方法),所以调用多gpu时,模型的参数不会分配到其他的gpu,因此报错。

(2)贴一张“参考资料1”中比较准确的说法,是对上一张图报错的说明:
在这里插入图片描述

2.3 实验验证

定义一个简单的mnist模型(可以正常调用多gpu),如下图所示:
在这里插入图片描述

再模拟一个调用多gpu会报错的模型,把fc1变成fc3,如下图所示:
在这里插入图片描述果然跟预想的一样报错了,不过报错信息是(-_-|||):
RuntimeError: arguments are located on different GPUs at /pytorch/aten/src/THC/generic/THCTensorMathBlas.cu:255
(好吧,意思差不多,参数在不同的gpu上。。。)

把fully_connect1的定义改成如下形式,就可以正常调用多GPU:
在这里插入图片描述

就先写到这里把。。

3. 总结

  1. pytorch想正常地调用多GPU,需要定义好模型的形式,可以都定义成如下形式:
    在这里插入图片描述
    子模块也定义成这样,然后import进去,给Net调用。

  2. pytorch你咋这么坑呢!!!

参考资料:

  1. https://github.com/pytorch/pytorch/issues/8637
  2. https://blog.csdn.net/senius/article/details/96599955

结束。

  • 9
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值