`torch.Tensor` 和 `torch.cuda.Tensor` 之间的差异

lin*_*ncr 7 pytorch

我们可以使用torch.Tensor([1., 2.], device='cuda'). torch.cuda.Tensor([1., 2.])除了我们可以将特定的 CUDA 设备传递给前一种之外,使用这种方式有什么区别吗?

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

blu*_*nox 6

所以通常两者torch.Tensortorch.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)
Run Code Online (Sandbox Code Playgroud)

输出:

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'
Run Code Online (Sandbox Code Playgroud)

由于底层硬件接口完全不同,CPU Tensors 只兼容 CPU Tensor,而 versevisa GPU Tensors 只兼容 GPU Tensor。

编辑:

正如你在这里看到的,移动到 GPU 的张量实际上是一个类型的张量:torch.cuda.*Tensortorch.cuda.FloatTensor.

所以cpu_tensor.to(device)ortorch.Tensor([1., 2.], device='cuda')会实际返回一个 type 的张量torch.cuda.FloatTensor

什么情况下torch.cuda.Tensor()需要?

当你想为你的程序使用 GPU 加速(在大多数情况下更快)时,你需要使用torch.cuda.Tensor,但你必须确保你使用的所有张量都是 CUDA 张量,在这里混合是不可能的。