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

问题描述 投票:0回答:2

第三条路我失败了。

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'))
python pytorch tensor
2个回答
27
投票

这三种方法都对我有用。

在 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,效率更高。


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.