Keras:完成训练过程后释放记忆

时间:2018-06-23 21:21:06

标签: python keras

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

2 个答案:

答案 0 :(得分:7)

释放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内存。

答案 1 :(得分:0)

要清除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))