【发布时间】: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