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

Swa*_*oop 5 python pytorch

我是 PyTorch 的新手,我正在探索方法的功能.to()。根据CUDA 张量的文档,我发现可以在 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"))
Run Code Online (Sandbox Code Playgroud)

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

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

Szy*_*zke 5

\n

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

\n
\n\n

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

\n\n
def foo():\n    my_tensor = torch.tensor([1.2]).cuda()\n    return "whatever"\n\nsmth = foo()\n
Run Code Online (Sandbox Code Playgroud)\n\n

但在这种情况下不会:

\n\n
def bar():\n    return torch.tensor([1.2]).cuda()\n\ntensor = bar()\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n

除了在CPU和GPU之间传输数据的用途之外,我还想知道\n\n\n\xc2\xa0.to()\xc2\xa0method的推荐用法(从内存的角度\n)

\n
\n\n

不确定你在这里的意思。您应该追求的是最少的to调用,因为它们需要复制数组(O(n) 复杂度),但无论如何成本不应该太高(例如与通过神经网络推送数据相比)并且可能不值得这种微观优化太核心了。

\n\n

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

\n\n

此外,自1.5.0发布以来,pytorchmemory_format在方法中提供了参数.to。这允许您指定是否应使用(N, C, H, W)(PyTorch 默认值)或最后一个通道(N, H, W, C)作为张量和模型(torch.nn.Conv2d准确地说是卷积模型)。这可以进一步加速您的模型(据 IIRC 报道,torchvision midels 的加速速度为 16%),请参阅此处了解更多信息和用法。

\n