PyTorch如何从GPU中删除模型

20

我希望在基于Pytorch的项目中进行交叉验证。然而,我没有找到任何Pytorch提供的方法来删除当前模型并清空GPU内存。您能告诉我如何做吗?


我需要做同样的事情,因为我想在同一个过程中训练一些模型(一个接一个的)。你找到答案了吗? - jperezmartin
2个回答

21

在PyTorch中释放内存的方式与普通Python垃圾收集器相同。这意味着一旦所有对Python-Object的引用都已消失,它就会被删除。

您可以使用del运算符删除引用:

del model

但是,您必须确保没有对应对象的引用留下,否则内存将不会被释放。

因此,一旦您删除了所有有关model的引用,它应该被删除并且内存得到释放。

如果您想了解更多关于内存管理的知识,您可以在此处查看: https://pytorch.org/docs/stable/notes/cuda.html#cuda-memory-management


1
使用 model.cpu() 将模型/张量/损失移动到 CPU 上,会将它们从 GPU 中移除吗? - drevicko
@drevicko 不是直接释放,但当您删除所有对GPU“model”的引用时,它应该会自动释放。这与所有其他Python变量的工作方式相同。 - MBT
嗯..好吧..我觉得有点奇怪..我猜如果你把它发送回去,torch就不必在GPU上重新分配内存,但如果你想保留其值(例如:在CPU上或将它们传递到另一个GPU)并且不再需要它在原始GPU上,你需要一种方法来释放该内存。 - drevicko
4
您可以在这里查看:https://pytorch.org/docs/stable/tensors.html#torch.Tensor.cpu,该网页上写着:“返回此对象在CPU内存中的副本。”(如果尚未在CPU上)。就像上面所说的那样:如果您想释放GPU上的内存,您需要摆脱所有指向GPU对象的引用。然后它将自动被释放。因此,假设`model`在GPU上:`model=model.cpu()`将在您没有保留模型的其他引用时释放GPU内存,但是`model_cpu=model.cpu()`将保留您的GPU模型。 - MBT
啊,是的。很有道理。如果model.cpu()是其GPU数据的唯一引用,提到可以使用它来释放GPU内存可能会很方便。可能其他人也有类似于我这样的用例(即:想要保留数据但将其从GPU中移除)。顺便问一下,反向传播信息是否会保留引用? - drevicko

0
我更喜欢按照以下步骤进行,而不仅仅是执行del model_object
model_object = My_Network().cuda()

del model_object  #deleting the model 


# model will still be on cache until its place is taken by other objects so also execute the below lines
import gc         # garbage collect library
gc.collect()
torch.cuda.empty_cache() 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接