Torch.Tensor和Torch.cuda.Tensor之间的区别

时间:2018-12-05 09:23:32

标签: pytorch

我们可以使用torch.Tensor([1., 2.], device='cuda')在GPU上分配张量。除了我们可以将特定的CUDA设备传递给前一个设备之外,使用这种方法而不是torch.cuda.Tensor([1., 2.])有什么区别吗?

或者换句话说,torch.cuda.Tensor()在哪种情况下是必需的?

1 个答案:

答案 0 :(得分:1)

因此,torch.Tensortorch.cuda.Tensor通常是等效的。您可以对他们俩都做任何喜欢的事情。

关键区别在于torch.Tensor占用 CPU 内存,而torch.cuda.Tensor占用 GPU 内存。当然,使用 CPU 计算 CPU张量上的操作,而使用 GPU 计算 GPU / CUDA Tensor 上的操作>。

之所以需要这两种张量类型,是因为底层的硬件接口完全不同。除了在计算上没有意义之外,尝试在torch.Tensortorch.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'

由于底层硬件接口完全不同,因此CPU张量仅与CPU张量兼容,而经签证的GPU张量仅与GPU张量兼容。

编辑:

正如您在此处看到的那样,移至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,但是为确保您使用的 ALL 张量是CUDA张量,此处无法混合。