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

时间:2018-11-16 04:01:02

标签: pytorch tensor

我以第三种方式失败了。 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'))

2 个答案:

答案 0 :(得分:7)

这三种方法都对我有用。

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

但是,当您使用.to(device)方法时,可以通过设置device=torch.device("cuda:<id>")明确告诉割炬移动到特定的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上创建张量,而是直接将数据复制到GPU,这样效率更高。

答案 1 :(得分:0)

直接在 nvidia GPU 上生成 50 x 50 张量的示例:

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

这将极大地加快创建 4000 x 4000 等大张量的速度