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)的速度
第三条路我失败了。 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)的速度