为啥我的简单 pytorch 网络不能在 GPU 设备上运行?
Posted
技术标签:
【中文标题】为啥我的简单 pytorch 网络不能在 GPU 设备上运行?【英文标题】:Why doesn't my simple pytorch network work on GPU device?为什么我的简单 pytorch 网络不能在 GPU 设备上运行? 【发布时间】:2019-01-07 09:47:42 【问题描述】:我根据教程构建了一个简单的网络,但出现此错误:
RuntimeError:预期的类型为 torch.cuda.FloatTensor 的对象,但已找到 为参数 #4 'mat1' 输入 torch.FloatTensor
有什么帮助吗?谢谢!
import torch
import torchvision
device = torch.device("cuda:0")
root = '.data/'
dataset = torchvision.datasets.MNIST(root, transform=torchvision.transforms.ToTensor(), download=True)
dataloader = torch.utils.data.DataLoader(dataset, batch_size=4)
class Net(torch.nn.Module):
def __init__(self):
super(Net, self).__init__()
self.out = torch.nn.Linear(28*28, 10)
def forward(self, x):
x = x.view(x.size(0), -1)
x = self.out(x)
return x
net = Net()
net.to(device)
for i, (inputs, labels) in enumerate(dataloader):
inputs.to(device)
out = net(inputs)
【问题讨论】:
这个问题是关于 PyTorch,而不是 CUDA。这就是我删除标签的原因。两次。请不要再添加了 【参考方案1】:TL;DR 这是解决方法
inputs = inputs.to(device)
为什么?!torch.nn.Module.to()
和 torch.Tensor.to()
之间存在细微差别:Module.to()
是 就地 运算符,Tensor.to()
不是。因此
net.to(device)
更改net
本身并将其移动到device
。另一方面
inputs.to(device)
不更改inputs
,而是返回inputs
的副本,该inputs
位于device
。要使用该“设备上”副本,您需要将其分配给一个变量,因此
inputs = inputs.to(device)
【讨论】:
有效!太感谢了!我花了几个小时寻找答案。 @Harkonnen 很高兴我能提供帮助。在阅读 pytorch 文档时,您应该注意“就地”操作:有些方法是就地的,有些不是,有些方法具有“就地”变体...... 我有这个错误,因为我没有设置我的GPU设备,为:device = torch.device('cuda')【参考方案2】:import torch
import numpy as np
x = torch.tensor(np.array(1), device='cuda:0')
print(x.device) # Prints `cpu`
x = torch.tensor(1, device='cuda:0')
print(x.device) # Prints `cuda:0`
现在张量驻留在 GPU 上
【讨论】:
你想从答案中说什么不清楚。请您解释为什么使用 numpy 没有将张量推送到 cuda以上是关于为啥我的简单 pytorch 网络不能在 GPU 设备上运行?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 PyTorch 找不到我的 NVIDIA 驱动程序以支持 CUDA?
如何确保所有 PyTorch 代码充分利用 Google Colab 上的 GPU
为啥 PyTorch nn.Module.cuda() 不移动模块张量而只移动参数和缓冲区到 GPU?