我以第三种方式失败了。 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'))
答案 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 等大张量的速度