为啥我的简单 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?

在 Google Colaboratory 上,对于 Pytorch,GPU 的性能比 CPU 慢

安装pytorch GPU版不能使用问题

当我增加批量大小时,为啥 tensorflow GPU 内存使用量会减少?