【问题标题】:Pytorch 0.4.0: There are three ways to create tensors on CUDA device. Is there some difference between them?Pytorch 0.4.0:在 CUDA 设备上创建张量的方法有三种。它们之间有什么区别吗?
【发布时间】:2019-04-19 06:02:48
【问题描述】:

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

【问题讨论】:

    标签: pytorch tensor


    【解决方案1】:

    这三种方法都对我有用。

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-11
        • 2018-04-30
        • 1970-01-01
        • 2013-04-13
        • 1970-01-01
        • 2018-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多