【问题标题】:Is it required to clear GPU tensors in PyTorch?是否需要在 PyTorch 中清除 GPU 张量?
【发布时间】:2020-08-31 22:53:51
【问题描述】:

我是 PyTorch 的新手,我正在探索 .to() 方法的功能。根据 CUDA 张量的 documentation,我发现可以在 CPU 和 GPU 内存之间传输张量。

# let us run this cell only if CUDA is available
if torch.cuda.is_available():

    # creates a LongTensor and transfers it to GPU as torch.cuda.LongTensor
    a = torch.full((10,), 3, device=torch.device("cuda"))
    # transfers it to CPU, back to being a torch.LongTensor
    b = a.to(torch.device("cpu"))

在这种情况下,我想知道是否总是需要将张量从 GPU 传输回 CPU,也许是为了释放 GPU 内存?不是,运行时会自动清除 GPU 内存吗?

除了使用在 CPU 和 GPU 之间传输数据之外,我想知道 .to() 方法的推荐用法(从内存的角度来看)。提前致谢。

【问题讨论】:

    标签: python pytorch


    【解决方案1】:

    在这种情况下,我想知道是否总是需要 将张量从 GPU 传回 CPU,也许是为了释放 GPU 内存?

    不,这并不总是必要的。当不再引用 GPU 张量时,应释放内存。在这种情况下应该自动清除张量:

    def foo():
        my_tensor = torch.tensor([1.2]).cuda()
        return "whatever"
    
    smth = foo()
    

    但在这种情况下不会:

    def bar():
        return torch.tensor([1.2]).cuda()
    
    tensor = bar()
    

    在第二种情况下(张量被传递,可能累积或添加到列表中),您应该将其转换为 CPU,以免浪费 GPU 内存。

    除了它使用在 CPU 和 GPU 之间传输数据之外,我会 想知道 .to() 方法的推荐用法(来自内存 观点)

    不知道你在这里的意思。你应该追求的是最少的to 调用,因为它们需要复制数组(O(n) 复杂度),但无论如何都不应该太昂贵(例如与通过神经网络推送数据相比)并且可能不值得对这种微优化过于顽固。

    通常数据加载是在 CPU 上完成的(转换、增强),每个批次在传递到神经网络之前被复制到 GPU(可能带有固定内存)。

    此外,从1.5.0 版本开始,pytorch 在.to 方法中提供memory_format 参数。这允许您指定是否应将 (N, C, H, W)(PyTorch 默认值)或通道最后 (N, H, W, C) 用于张量和模型(准确地说是使用 torch.nn.Conv2d 的卷积模型)。这可以进一步加速您的模型(据 IIRC 报道,torchvision midels 加速了 16%),请参阅here 了解更多信息和用法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 2020-10-21
      • 2019-04-26
      • 2019-09-30
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      相关资源
      最近更新 更多