代码之家  ›  专栏  ›  技术社区  ›  nivniv

pytorch-在“with statement”中使用设备

  •  0
  • nivniv  · 技术社区  · 6 年前

    pytorch 在特定(GPU)设备的上下文中(无需为每个新张量指定设备,例如 .to

    类似于 tensorflow with tf.device('/device:GPU:0'): ..

    似乎默认设备是cpu(除非我做错了):

    with torch.cuda.device('0'):
       a = torch.zeros(1)
       print(a.device)
    
    >>> cpu
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   MBT Nina Golyandina    6 年前

    不幸的是,在目前的实施中 with-device 语句不能以这种方式工作,它只能用于在cuda设备之间切换。


    你还得使用 device .cuda() 将张量移动到指定的GPU),使用如下术语:

    # allocates a tensor on GPU 1
    a = torch.tensor([1., 2.], device=cuda)
    

    所以要访问 cuda:1 :

    cuda = torch.device('cuda')
    
    with torch.cuda.device(1):
        # allocates a tensor on GPU 1
        a = torch.tensor([1., 2.], device=cuda)
    

    以及访问 cuda:2 :

    cuda = torch.device('cuda')
    
    with torch.cuda.device(2):
        # allocates a tensor on GPU 2
        a = torch.tensor([1., 2.], device=cuda)
    

    但是张量没有 装置 参数仍将是CPU张量:

    cuda = torch.device('cuda')
    
    with torch.cuda.device(1):
        # allocates a tensor on CPU
        a = torch.tensor([1., 2.])
    

    不-不幸的是,它是在当前的执行 带设备 问题。


    documentation :

    cuda = torch.device('cuda')     # Default CUDA device
    cuda0 = torch.device('cuda:0')
    cuda2 = torch.device('cuda:2')  # GPU 2 (these are 0-indexed)
    
    x = torch.tensor([1., 2.], device=cuda0)
    # x.device is device(type='cuda', index=0)
    y = torch.tensor([1., 2.]).cuda()
    # y.device is device(type='cuda', index=0)
    
    with torch.cuda.device(1):
        # allocates a tensor on GPU 1
        a = torch.tensor([1., 2.], device=cuda)
    
        # transfers a tensor from CPU to GPU 1
        b = torch.tensor([1., 2.]).cuda()
        # a.device and b.device are device(type='cuda', index=1)
    
        # You can also use ``Tensor.to`` to transfer a tensor:
        b2 = torch.tensor([1., 2.]).to(device=cuda)
        # b.device and b2.device are device(type='cuda', index=1)
    
        c = a + b
        # c.device is device(type='cuda', index=1)
    
        z = x + y
        # z.device is device(type='cuda', index=0)
    
        # even within a context, you can specify the device
        # (or give a GPU index to the .cuda call)
        d = torch.randn(2, device=cuda2)
        e = torch.randn(2).to(cuda2)
        f = torch.randn(2).cuda(cuda2)
        # d.device, e.device, and f.device are all device(type='cuda', index=2)