我正在上PyTorch
的课程。
我想知道为什么我们需要在运行的设备上分别告诉torch.utils.data.DataLoader
输出。如果模型已经在CUDA
上,为什么不相应地自动更改输入?这种模式对我来说似乎很有趣:
model.to(device)
for ii, (inputs, labels) in enumerate(trainloader):
# Move input and label tensors to the GPU
inputs, labels = inputs.to(device), labels.to(device)
是否有一个用例,我想让模型在GPU上运行,但我的输入处于CPU模式,反之亦然?
答案 0 :(得分:2)
调用model.to(device)
(假设device
是GPU)时,您的模型参数将移至GPU。关于您的评论:然后将它们从CPU内存移至GPU内存。
默认情况下,如果没有另外指定,则在CPU上创建新创建的张量。因此,这也适用于您的inputs
和labels
。
这里的问题是,操作的所有 操作数必须位于同一设备上!如果省略to
并使用CPU张量作为输入,则会收到错误消息。
这是一个简短的示例:
import torch
# device will be 'cuda' if a GPU is available
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
# creating a CPU tensor
cpu_tensor = torch.rand(10)
# moving same tensor to GPU
gpu_tensor = cpu_tensor.to(device)
print(cpu_tensor, cpu_tensor.dtype, type(cpu_tensor), cpu_tensor.type())
print(gpu_tensor, gpu_tensor.dtype, type(gpu_tensor), gpu_tensor.type())
print(cpu_tensor*gpu_tensor)
输出:
tensor([0.8571, 0.9171, 0.6626, 0.8086, 0.6440, 0.3682, 0.9920, 0.4298, 0.0172,
0.1619]) torch.float32 <class 'torch.Tensor'> torch.FloatTensor
tensor([0.8571, 0.9171, 0.6626, 0.8086, 0.6440, 0.3682, 0.9920, 0.4298, 0.0172,
0.1619], device='cuda:0') torch.float32 <class 'torch.Tensor'> torch.cuda.FloatTensor
---------------------------------------------------------------------------
RuntimeError Traceback (most recent call last)
<ipython-input-15-ac794171c178> in <module>()
12 print(gpu_tensor, gpu_tensor.dtype, type(gpu_tensor), gpu_tensor.type())
13
---> 14 print(cpu_tensor*gpu_tensor)
RuntimeError: Expected object of type torch.FloatTensor but found type torch.cuda.FloatTensor for argument #2 'other'