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