Pytorch 0.4.0:可以通过三种方式在 CUDA 设备上创建张量。它们之间有什么区别吗?

Pytorch 0.4.0: There are three ways to create tensors on CUDA device. Is there some difference between them?

第三条路我失败了。 t3 仍在 CPU。不知道为什么。

a = np.random.randn(1, 1, 2, 3)

t1 = torch.tensor(a)
t1 = t3.to(torch.device('cuda'))

t2 = torch.tensor(a)
t2 = t2.cuda() 

t3 = torch.tensor(a, device=torch.device('cuda'))

这三种方法都对我有用。

在 1 和 2 中,您在 CPU 上创建张量,然后在使用 .to(device).cuda() 时将其移动到 GPU。他们在这里是一样的。

但是,当您使用 .to(device) 方法时,您可以通过设置 device=torch.device("cuda:<id>") 明确告诉 torch 移动到特定的 GPU。使用 .cuda() 你必须做 .cuda(<id>) 才能移动到某个特定的 GPU。


为什么会有这两种方法呢?

.to(device) 是在 0.4 中引入的,因为在代码顶部将 device 变量声明为

更容易

device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")

并在任何地方使用 .to(device)。这使得从 CPU 切换到 GPU 非常容易,反之亦然

在此之前,我们必须使用 .cuda(),您的代码将让 if 到处检查 cuda.is_available(),这使得在 GPU/CPU 之间切换很麻烦。


第三种方法CPU不创建张量,直接copy数据到GPU,效率更高。

直接在您的 nvidia GPU 上制作 50 x 50 张量 0 的示例:

zeros_tensor_gpu = torch.zeros((50, 50), device='cuda')

这将极大地加快创建大张量(例如 4000 x 4000)的速度