【问题标题】:How to clear GPU memory after PyTorch model training without restarting kernelPyTorch模型训练后如何在不重启内核的情况下清除GPU内存
【发布时间】:2020-01-11 11:33:36
【问题描述】:

我正在 Jupyter-Lab 笔记本上训练 PyTorch 深度学习模型,使用 Tesla K80 GPU 上的 CUDA 进行训练。在进行训练迭代时,使用了 12 GB 的 GPU 内存。我通过保存模型检查点来完成训练,但想继续使用笔记本进行进一步分析(分析中间结果等)。

但是,这些 12 GB 在完成训练后继续被占用(从 nvtop 可以看出)。我想释放这个内存,以便我可以将它用于其他笔记本。

到目前为止,我的解决方案是重新启动此笔记本的内核,但这并不能解决我的问题,因为我无法继续使用同一个笔记本及其各自的输出。

【问题讨论】:

    标签: python pytorch jupyter


    【解决方案1】:

    我自己从未使用过 PyTorch,但 Google 有几个结果基本上都说相同..torch.cuda.empty_cache()

    https://forums.fast.ai/t/clearing-gpu-memory-pytorch/14637

    https://discuss.pytorch.org/t/how-can-we-release-gpu-memory-cache/14530

    How to clear Cuda memory in PyTorch

    【讨论】:

    • torch.cuda.empty_cache() 清除了大部分已用内存,但我仍有 2.7GB 正在使用。可能是模型占用的内存,但我不知道它有多清晰。我从另一个答案中尝试了model = Nonegc.collect(),但没有成功。
    【解决方案2】:

    如果您只是将使用大量内存的对象设置为None,如下所示:

    obj = None
    

    然后你打电话给

    gc.collect() # Python thing
    

    这是避免重启笔记本的方法。


    如果您仍然希望从 Nvidea smi 或 nvtop 中清楚地看到它,您可以运行:

    torch.cuda.empty_cache() # PyTorch thing
    

    清空 PyTorch 缓存。

    【讨论】:

    • 我试过 model = Nonegc.collect() 但它没有清除任何 GPU 内存
    • 我通常使用 nvtop 来检查 GPU 内存。这是一个好方法吗?
    • gc.collect 告诉 Python 进行垃圾收集,如果您使用 nvidia 工具,您将看不清楚,因为 PyTorch 仍然分配了缓存,但它使其可用。
    • 是的,torch.cuda.empty_cache() 可以帮助您看清楚。
    【解决方案3】:
    with pytorch.no_grad():
        torch.cuda.empty_cache()
    

    【讨论】:

      【解决方案4】:

      到目前为止,对于 Cuda 方面的答案是正确的,但在 ipython 方面也存在问题。

      当您在笔记本环境中出现错误时,ipython shell 会存储异常的回溯,以便您可以使用%debug 访问错误状态。问题是这需要将导致错误的所有变量保存在内存中,并且它们不会被gc.collect() 之类的方法回收。基本上你所有的变量都卡住了,内存泄露了。

      通常,引发新异常会释放旧异常的状态。所以尝试像1/0 这样的东西可能会有所帮助。但是,使用 Cuda 变量时事情会变得很奇怪,有时如果不重新启动内核就无法清除 GPU 内存。

      有关更多详细信息,请参阅以下参考资料:

      https://github.com/ipython/ipython/pull/11572

      How to save traceback / sys.exc_info() values in a variable?

      【讨论】:

      • “但是 Cuda 变量会变得很奇怪,有时如果不重新启动内核就无法清除 GPU 内存”哇,你是认真的吗?真是太糟糕了……
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-19
      • 2021-07-30
      • 1970-01-01
      • 2021-01-21
      • 2021-06-03
      • 2017-02-07
      • 1970-01-01
      相关资源
      最近更新 更多