我是 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()
方法的推荐用法(从内存角度)。提前致谢。
\n\n\n在这种情况下,我想知道是否总是需要将张量从 GPU 传输回 CPU,也许是为了释放 GPU 内存?
\n
不,这并不总是必要的。当不再有对 GPU 张量的引用时,应该释放内存。在这种情况下,张量应该被自动清除:
\n\ndef 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\ndef 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\n\n除了在CPU和GPU之间传输数据的用途之外,我还想知道\n\n\n\xc2\xa0.to()\xc2\xa0method的推荐用法(从内存的角度\n)
\n
不确定你在这里的意思。您应该追求的是最少的to
调用,因为它们需要复制数组(O(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%),请参阅此处了解更多信息和用法。