【问题标题】:Keras: release memory after finish training processKeras:完成训练过程后释放内存
【发布时间】:2018-12-02 22:44:18
【问题描述】:

我使用 Keras 构建了一个基于 CNN 结构的自动编码器模型,完成训练过程后,我的笔记本电脑有 64GB 内存,但我注意到至少有 1/3 的内存仍然被占用,GPU 也是如此记忆,也是。没有找到释放内存的好方法,只能通过关闭Anaconda Prompt命令窗口和jupyter notebook来释放内存。我不确定是否有人有好的建议。谢谢!

【问题讨论】:

  • 这个问题似乎与编程无关,而是消费 PC 硬件或软件的问题,这与 Stack Overflow 无关。如果您仍然需要有关此问题的帮助,请在 Stack Overflow 的姊妹网站Super User 进行咨询
  • 很可能是进程运行时占用内存的数据(jupyter内核)。您可以尝试del mydata 从范围中删除您的数据变量以进行垃圾收集;但没有代码就无法分辨。
  • 谢谢大家的建议,我尝试用"del"删除加载的训练和测试成像数据,可以释放3GB左右的内存,部分解决了问题

标签: python keras


【解决方案1】:

释放 RAM 内存

要释放 RAM 内存,只需按照@nuric 在评论中的建议执行del Variables

释放 GPU 内存

这比释放 RAM 内存要复杂一些。有些人会建议你以下代码(假设你使用的是 keras)

from keras import backend as K
K.clear_session()

但是,上面的代码并不适用于所有人。 (即使你尝试del Models,它仍然不起作用)

如果上述方法不适合你,那么试试下面的方法(你需要先安装numba库):

from numba import cuda
cuda.select_device(0)
cuda.close()

背后的原因是:Tensorflow只是给GPU分配内存,而CUDA负责管理GPU内存。

如果在您使用K.clear_session() 清除所有图形后 CUDA 以某种方式拒绝释放 GPU 内存,那么您可以使用 cuda 库直接控制 CUDA 以清除 GPU 内存。

【讨论】:

  • 感谢您解释 CUDA 和 Tensorflow 的内存管理之间的额外差异。我不知道这个。
【解决方案2】:

要清除 RAM 内存,只需按照 Raven 的建议删除变量即可。

但不幸的是,对于 GPU,cuda.close() 将在未来涉及 GPU 的步骤(例如模型评估)中引发错误。释放 GPU 内存的一种解决方法是将模型创建和训练部分封装在一个函数中,然后使用子进程进行主要工作。训练完成后,子进程将被终止,GPU 内存将被释放。

类似:

import multiprocessing

def create_model_and_train( ):
      .....
      .....

p = multiprocessing.Process(target=create_model_and_train)
p.start()
p.join()

或者您可以创建以下函数并在每次运行之前调用它:

from keras.backend.tensorflow_backend import set_session
from keras.backend.tensorflow_backend import clear_session
from keras.backend.tensorflow_backend import get_session
import tensorflow
import gc

# Reset Keras Session
def reset_keras():
    sess = get_session()
    clear_session()
    sess.close()
    sess = get_session()

    try:
        del classifier # this is from global space - change this as you need
    except:
        pass

    print(gc.collect()) # if it does something you should see a number as output

    # use the same config as you used to create the session
    config = tensorflow.ConfigProto()
    config.gpu_options.per_process_gpu_memory_fraction = 1
    config.gpu_options.visible_device_list = "0"
    set_session(tensorflow.Session(config=config))

【讨论】:

    猜你喜欢
    • 2021-12-27
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 2020-01-27
    • 2012-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多