第三条路我失败了。
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上创建张量,直接将数据复制到GPU,效率更高。
直接在 nvidia GPU 上制作 50 x 50 张量 0 的示例:
zeros_tensor_gpu = torch.zeros((50, 50), device='cuda')
这将极大地加快大张量(例如 4000 x 4000)的创建速度