Python Keras:完成训练过程后释放记忆
我使用Keras构建了一个基于CNN结构的自动编码器模型,在完成训练过程后,我的笔记本电脑有64GB的内存,但我注意到至少1/3的内存仍然被占用,GPU内存也是如此。我没有找到释放内存的好方法,我只能通过关闭Anaconda提示符命令窗口和jupyter笔记本来释放内存。我不确定是否有人有好的建议。谢谢 释放RAM存储器 要释放RAM内存,只需按照@nuric在注释中的建议执行Python Keras:完成训练过程后释放记忆,python,keras,Python,Keras,我使用Keras构建了一个基于CNN结构的自动编码器模型,在完成训练过程后,我的笔记本电脑有64GB的内存,但我注意到至少1/3的内存仍然被占用,GPU内存也是如此。我没有找到释放内存的好方法,我只能通过关闭Anaconda提示符命令窗口和jupyter笔记本来释放内存。我不确定是否有人有好的建议。谢谢 释放RAM存储器 要释放RAM内存,只需按照@nuric在注释中的建议执行delvariables 释放GPU内存 这比释放RAM内存要复杂一点。有些人会建议您使用以下代码(假设您正在使用ker
delvariables
释放GPU内存
这比释放RAM内存要复杂一点。有些人会建议您使用以下代码(假设您正在使用keras)
然而,上述代码并不适用于所有人。(即使您尝试del Models
,它仍然不起作用)
如果上述方法不适用于您,请尝试以下方法(您需要先安装库):
其背后的原因是:Tensorflow只是将内存分配给GPU,而CUDA负责管理GPU内存
如果CUDA在您用
K.clear_session()
清除所有图形后以某种方式拒绝释放GPU内存,那么您可以使用CUDA库直接控制CUDA清除GPU内存。要清除RAM内存,只需按照Raven的建议删除变量即可
但不幸的是,对于GPUcuda.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))
这个问题似乎与编程无关,而是消费者PC硬件或软件的问题,这与堆栈溢出无关。如果您在这个问题上仍然需要帮助,请向Stack Overflow的姐妹站点询问,它很可能是进程运行时占用内存的数据(jupyter内核)。您可以尝试
delmydata
从垃圾收集的范围中删除数据变量;但是没有代码就说不出来。谢谢你的建议,我试着用“del”删除加载的训练和测试成像数据,它可以释放大约3GB的内存,这部分解决了问题。谢谢你解释CUDA和Tensorflow内存管理之间的额外区别。我不知道这件事。
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))