【问题标题】:Memory leak in IPython.parallel module?IPython.parallel 模块中的内存泄漏?
【发布时间】:2012-01-11 05:25:20
【问题描述】:

我正在使用 IPython.parallel 处理集群上的大量数据。我运行的远程功能如下:

def evalPoint(point, theta):
    # do some complex calculation
    return (cost, grad)

由这个函数调用:

def eval(theta, client, lview, data):
    async_results = []
    for point in data:
        # evaluate current data point
        ar = lview.apply_async(evalPoint, point, theta)
        async_results.append(ar)

    # wait for all results to come back
    client.wait(async_results)

    # and retrieve their values
    values = [ar.get() for ar in async_results]

    # unzip data from original tuple
    totalCost, totalGrad = zip(*values)

    avgGrad =  np.mean(totalGrad, axis=0)
    avgCost = np.mean(totalCost, axis=0)

    return (avgCost, avgGrad)

如果我运行代码:

client = Client(profile="ssh")
client[:].execute("import numpy as np")        

lview = client.load_balanced_view()

for i in xrange(100):
    eval(theta, client, lview, data)

内存使用量不断增长,直到我最终用完(76GB 内存)。我已经简化 evalPoint 以确保它不是罪魁祸首。

eval 的第一部分是从 IPython 关于如何使用负载均衡器的文档中复制而来的。第二部分(解压缩和平均)相当简单,所以我认为这不是内存泄漏的原因。此外,我尝试手动删除eval 中的对象并调用gc.collect(),但没有成功。

我希望有 IPython.parallel 经验的人可以指出我做错了什么,或者能够确认这实际上是内存泄漏。

一些额外的事实:

  • 我在 Ubuntu 11.10 上使用 Python 2.7.2
  • 我使用的是 IPython 0.12 版
  • 我的引擎在服务器 1-3 上运行,客户端和集线器在服务器 1 上运行。如果我将所有内容都保留在服务器 1 上,我会得到类似的结果。
  • 我发现的唯一与 IPython 的内存泄漏类似的事情与 %run 有关,我相信在这个版本的 IPython 中已修复(另外,我没有使用 %run

更新

此外,我尝试将日志记录从内存切换到 SQLiteDB,以防万一,但仍然存在同样的问题。

回复(1)

内存消耗肯定在控制器中(我可以通过以下方式验证这一点:(a)在另一台机器上运行客户端,以及(b)观察顶部)。我没有意识到非 SQLiteDB 仍然会消耗内存,所以我没有费心清理。

如果我使用 DictDB 并清除,我仍然会看到内存消耗增加,但速度要慢得多。对于 eval() 的 20 次调用,它徘徊在 2GB 左右。

如果我使用 MongoDB 并进行清除,看起来 mongod 占用了大约 4.5GB 的内存,而 ipcluster 占用了大约 2.5GB。

如果我使用 SQLite 并尝试清除,则会收到以下错误:

File "/usr/local/lib/python2.7/dist-packages/IPython/parallel/controller/hub.py", line 1076, in purge_results
  self.db.drop_matching_records(dict(completed={'$ne':None}))
File "/usr/local/lib/python2.7/dist-packages/IPython/parallel/controller/sqlitedb.py", line 359, in drop_matching_records
  expr,args = self._render_expression(check)
File "/usr/local/lib/python2.7/dist-packages/IPython/parallel/controller/sqlitedb.py", line 296, in _render_expression
  expr = "%s %s"%null_operators[op]
TypeError: not enough arguments for format string

所以,我想如果我使用 DictDB,我可能会没事(我今晚要试试跑步)。我不确定是否仍会出现一些内存消耗(我还按照您的建议清除了客户端)。

【问题讨论】:

    标签: memory-leaks parallel-processing ipython


    【解决方案1】:

    是控制器进程在增长,还是客户端,或两者兼而有之?

    控制器会记住所有请求和所有结果,因此将这些信息存储在简单 dict 中的默认行为将导致不断增长。使用 db 后端(如果可用,sqlite 或最好是 mongodb)应该可以解决这个问题,或者可以使用 client.purge_results() 方法来指示控制器丢弃任何/所有结果历史记录(如果您正在使用,这将从 db 中删除它们一)。

    客户端本身将所有自己的结果缓存在其results 字典中,因此随着时间的推移,这也会导致增长。不幸的是,这有点难以处理,因为引用可以在各种方向上传播,并且不受控制器的数据库后端的影响。

    这是 IPython 中的 known issue,但现在,您应该能够通过删除客户端结果/元数据字典中的条目来手动清除引用,如果您的视图仍然存在,它有自己的结果字典:

    # ...
    # and retrieve their values
    values = [ar.get() for ar in async_results]
    
    # clear references to the local cache of results:
    for ar in async_results:
        for msg_id in ar.msg_ids:
            del lview.results[msg_id]
            del client.results[msg_id]
            del client.metadata[msg_id]
    

    或者,您可以使用简单的dict.clear() 清除整个客户端缓存:

    view.results.clear()
    client.results.clear()
    client.metadata.clear()
    

    旁注:

    视图有自己的 wait() 方法,因此您根本不需要将 Client 传递给您的函数。一切都应该可以通过 View 访问,如果您真的需要客户端(例如,用于清除缓存),您可以将其作为 view.client 获取。

    【讨论】:

    • 感谢您抽出宝贵时间回复!我没有足够的空间来正确回复所有内容,因此我将其余回复放在了问题的底部。
    • 昨晚我能够完整运行,所以只要我使用 DictDB 就可以解决我的问题。我猜 MongoDB 可能有一个选项来限制其内存使用,但这是一个单独的问题。
    • 要补充一点:一件有趣的事情是,对于我的进程来说,DictDB 的运行速度比 MongoDB 或 SQLite 快得多。我猜这是由于流程完成的速度以及由此产生的簿记开销。
    • 谢谢,我修正了 sqlite 错字。 db 后端的部分要点是 purge_results 不应该是必需的。如果您仍然使用它,我建议您尽可能少地使用它。新设计的部分优势在于缓慢的集线器不能减慢执行速度,但只有在您不一直阻塞集线器操作时才会如此。另请参阅 this post on mongodb memory usagethe relevant doc
    • 至少对于 SQLiteDB,如果我不清除它,它会占用我所有的内存。感谢 MongoDB 的信息。那么,这是否意味着理论上我应该能够在不清除的情况下运行 Mongo?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多