是否需要清除PyTorch中的GPU张量?

时间:2020-05-15 07:12:44

标签: python pytorch

我是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()方法的推荐用法(从内存的角度来看)。预先感谢。

1 个答案:

答案 0 :(得分:2)

在这种情况下,我想知道是否总是有必要 将张量从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在memory_format方法中提供了.to自变量。这使您可以指定将(N, C, H, W)(默认为PyTorch)还是最后使用通道(N, H, W, C)来用于张量和模型(准确地说是使用torch.nn.Conv2d的卷积模型)。这样可以进一步加快模型的速度(据IIRC报告,火炬视觉中片的速度提高了16%),有关更多信息和用法,请参见here

相关问题