Различия между `torch.Tensor` и` torch.cuda.Tensor` - PullRequest
0 голосов
/ 05 декабря 2018

Мы можем выделить тензор на GPU, используя torch.Tensor([1., 2.], device='cuda').Существуют ли какие-либо различия с использованием этого способа, а не torch.cuda.Tensor([1., 2.]), за исключением того, что мы можем передать конкретное устройство CUDA на прежнее?

Или другими словами, в каком сценарии torch.cuda.Tensor() необходимо?

1 Ответ

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

Так что, как правило, torch.Tensor и torch.cuda.Tensor эквивалентны.Вы можете делать все, что вам нравится с ними обоими.

Разница в том, что torch.Tensor занимает CPU память, в то время как torch.cuda.Tensor занимает GPU память.Конечно, операции на CPU Tensor вычисляются с помощью CPU , в то время как операции на GPU / CUDA Tensor вычисляются на GPU .

Причина, по которой вам нужны эти два типа тензоров, заключается в том, что базовый аппаратный интерфейс совершенно другой.Помимо того, что это не имеет смысла в вычислительном отношении, вы получите ошибку, как только вы попытаетесь выполнить вычисления между torch.Tensor и torch.cuda.Tensor:

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'

Поскольку базовый аппаратный интерфейс полностью отличается, тензоры ЦП просто совместимы с тензором ЦП, а тензоры ГП с тизером визы просто совместимы с тензорами ГП.

Редактировать:

Как вы можете видеть здесь, тензор, который перемещается в GPU, на самом деле является тензором типа: torch.cuda.*Tensor т.е. torch.cuda.FloatTensor.

Итак cpu_tensor.to(device)или torch.Tensor([1., 2.], device='cuda') фактически возвращает тензор типа torch.cuda.FloatTensor.

В каком сценарии torch.cuda.Tensor() необходимо?

Если вы хотите использовать ускорение GPU (что намного быстрее в большинстве случаев) для вашей программы, вам нужно использовать torch.cuda.Tensor, но вы должны убедиться, что ВСЕ используемые тензоры являются тензорами CUDA, смешивание здесь невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...