Так что, как правило, 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, смешивание здесь невозможно.