首页 > 解决方案 > iPython Parallel 模块消耗大量内存

问题描述

我正在使用 ipyparallel 模块来加速所有列表比较,但我遇到了巨大的内存消耗问题。

这是我正在运行的脚本的简化版本:

从 SLURM 脚本启动集群并运行 python 脚本

ipcluster start -n 20 --cluster-id="cluster-id-dummy" &
sleep 60
ipython /global/home/users/pierrj/git/python/dummy_ipython_parallel.py
ipcluster stop --cluster-id="cluster-id-dummy"

在 python 中,为简化示例制作两个列表列表

import ipyparallel as ipp
from itertools import compress

list1 = [ [i, i, i] for i in range(4000000)]
list2 = [ [i, i, i] for i in range(2000000, 6000000)]

然后定义我的列表比较函数:

def loop(item):
    for i in range(len(list2)):
        if list2[i][0] == item[0]:
            return True
    return False

然后连接到我的 ipython 引擎,将 list2 推送到每个引擎并映射我的函数:

rc = ipp.Client(profile='default', cluster_id = "cluster-id-dummy")
dview = rc[:]
dview.block = True
lview = rc.load_balanced_view()
lview.block = True
mydict = dict(list2 = list2)
dview.push(mydict)
trueorfalse = list(lview.map(loop, list1))

如前所述,我在使用 SLURM 的集群上运行它并从 sacct 命令获取内存使用情况。这是我为每个步骤获得的内存使用情况:

只需创建两个列表:1.4 Gb 创建两个列表并将它们推送到 20 个引擎:22.5 Gb 一切:62.5 Gb++(这是我遇到 OUT_OF_MEMORY 失败的地方)

从运行作业时在节点上运行 htop 开始,似乎内存使用量随着时间的推移缓慢上升,直到达到最大内存并失败。

我梳理了这个先前的线程并实施了一些建议的解决方案但没有成功

IPython.parallel 模块中的内存泄漏?

我尝试使用每个循环清除视图:

def loop(item):
    lview.results.clear()
    for i in range(len(list2)):
        if list2[i][0] == item[0]:
            return True
    return False

我尝试用每个循环清除客户端:

def loop(item):
    rc.purge_everything()
    for i in range(len(list2)):
        if list2[i][0] == item[0]:
            return True
    return False

我尝试将 --nodb 和 --sqlitedb 标志与 ipcontroller 一起使用,并像这样启动我的集群:

ipcontroller --profile=pierrj --nodb --cluster-id='cluster-id-dummy' &
sleep 60
for (( i = 0 ; i < 20; i++)); do ipengine --profile=pierrj --cluster-id='cluster-id-dummy' & done
sleep 60
ipython /global/home/users/pierrj/git/python/dummy_ipython_parallel.py
ipcluster stop --cluster-id="cluster-id-dummy" --profile=pierrj

不幸的是,这些都没有帮助并导致完全相同的内存不足错误。

任何建议或帮助将不胜感激!

标签: pythonipythonipython-parallel

解决方案


推荐阅读