首页 > 解决方案 > Python 中的多处理:有没有办法在不累积内存的情况下使用 pool.imap?

问题描述

我正在使用 Python 中的模块来并行multiprocessing训练神经网络,使用. 这在每个“循环”之后稳定地使用越来越多的内存,即每 4 个进程,直到它最终崩溃。kerasPool(processes = 4)imap

我使用该memory_profiler模块来跟踪我的内存使用情况,训练了 12 个网络。这里使用香草imap香草

如果我maxtasksperchild = 1输入Pool1个任务孩子

如果我使用imap(chunksize = 3)块

在后一种情况下,一切正常,我只向池中的每个进程发送一个批次,因此问题似乎在于这些进程携带有关先前批次的信息。如果是这样,我可以强制游泳池不这样做吗?

即使块解决方案似乎工作我宁愿不使用它,因为

这是香草案例中的代码片段。在其他两种情况下,我只是更改了maxtasksperchildin 中的参数和 in 中Poolchunksize参数imap

def train_network(network):
    (...)
    return score

pool = Pool(processes = 4)
scores = pool.imap(train_network, networks)
scores = tqdm(scores, total = networks.size)

for (network, score) in zip(networks, scores):
    network.score = score

pool.close()
pool.join()

标签: pythonkerasmultiprocessing

解决方案


不幸的是,multiprocessingpython 中的模块需要付出很大的代价。数据大多不在进程之间共享,需要复制。这将从 python 3.8 开始改变。

https://docs.python.org/3.8/library/multiprocessing.shared_memory.html

虽然,python 3.8 的正式版本是 2019 年 10 月 21 日,但你已经可以在github上下载它了


推荐阅读