【问题标题】:Clear up memory in python loop after creating a model创建模型后清除python循环中的内存
【发布时间】:2019-12-18 20:17:29
【问题描述】:

我正在 python 中运行一个 for 循环,其中每个循环都需要在不同的数据上创建模型(下面显示了一个摘录)。每次创建的模型都不会从内存中删除,从而导致每次循环变慢。

import gc
for s in range(0, 5):
  X, Y = get_data()
  m = make_dgp_model(X, Y, Z_100, L)
  del m
  gc.collect()
  print('memory: {}'.format(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1000000))

给出输出:

memory: 460.025856
memory: 470.310912
memory: 486.764544
memory: 493.457408
memory: 499.523584

我知道 python 使用指针引用作为它的内存,并且当变量被重用时它不会重写内存中的东西。出于这个原因,我尝试了 del m,然后使用了垃圾收集器。这似乎不起作用。难道我做错了什么?有没有办法在循环完成后完全删除m 中存储的内容?

【问题讨论】:

  • 您为什么要尝试在 Python 中处理内存使用情况?这不是你应该担心的事情。
  • 由于内存的增加,每个循环都会显着减慢。
  • 为什么要这样?或许你应该展示一些代码,并解释一下 X、Y、Z_100 和 L 是什么。
  • 我猜你可以重新初始化每个循环的权重而不是创建一个新模型?这应该会给出相同的结果而不会出现内存泄漏
  • 如果您没有使用 Eager 模式,您可能正在向图中添加模型的新版本。即使您del m,图形及其操作仍然存在。如果您自己没有创建图表,则图表将被指定为tf.get_default_graph(),您可以使用tf.reset_default_graph() 清除它(将其替换为新的空图表)。

标签: python tensorflow machine-learning memory gpflow


【解决方案1】:

我解决此问题的方法是添加以下内容,以便在每个循环中重置图表。

tf.reset_default_graph()
graph = tf.get_default_graph()
gpflow.reset_default_session(graph=graph)

this github 问题所示(见最后一条评论)。

【讨论】:

  • 有一个内置的实用功能:gpflow.reset_default_graph_and_session()
  • @STJ。你知道 pytorch 中是否有类似的功能,但是我在 pytorch 中遇到了同样的问题。
【解决方案2】:

GPflow 的自述页面有一个链接到漂亮的提示和技巧笔记本。在那里,您可以在第一条中找到您的问题的答案:)

https://github.com/GPflow/GPflow/blob/develop/doc/source/notebooks/tips_and_tricks.ipynb

【讨论】:

  • 此链接已失效
猜你喜欢
  • 2015-10-21
  • 2014-12-11
  • 2019-06-30
  • 2020-12-18
  • 2015-11-01
  • 2017-02-07
  • 1970-01-01
  • 2014-07-24
  • 2016-10-17
相关资源
最近更新 更多