Почему нам нужен image.to ('CUDA'), когда у нас есть model.to ('CUDA') - PullRequest
0 голосов
/ 09 декабря 2018

Я прохожу курс на 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 или наоборот?

1 Ответ

0 голосов
/ 09 декабря 2018

Когда вы звоните model.to(device) (при условии, что device - это графический процессор) параметры вашей модели будут перемещены в ваш графический процессор.Что касается вашего комментария: тогда они перемещаются из памяти процессора в память GPU.

По умолчанию в CPU создаются вновь созданные тензоры, если не указано иное.Так что это относится и к вашим inputs и labels.

Проблема здесь в том, что все операнды операции должны быть на то же устройство !Если вы пропустите to и будете использовать тензоры процессора в качестве входных данных, вы получите сообщение об ошибке.

Вот краткий пример для иллюстрации:

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...