gpt4 book ai didi

python - Python : Is there a way to use pool. imap 中的多处理没有积累内存?

转载 作者:太空宇宙 更新时间:2023-11-04 01:52:06 28 4
gpt4 key购买 nike

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

我使用 memory_profiler 模块来跟踪我的内存使用情况,训练了 12 个网络。这里使用的是 Vanilla imap: vanilla

如果我将 maxtasksperchild = 1 放入 Pool 中: 1taskperchild

如果我使用 imap(chunksize = 3): chunks

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

尽管 block 解决方案似乎有效,但我宁愿不使用它,因为

  • 我想使用 tqdm 模块跟踪进度,在 block 的情况下,它只会在每个 block 之后更新,这实际上意味着它根本不会真正跟踪任何东西,因为这些 block 同时完成(在这个例子中)
  • 目前,所有网络的训练时间完全相同,但我希望能够让它们有不同的训练时间,这样分块解决方案可能会导致一个进程获得所有较长的训练时间。<

这是普通情况下的代码片段。在另外两种情况下,我只是更改了 Pool 中的 maxtasksperchild 参数,以及 imap 中的 chunksize 参数:

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()

最佳答案

不幸的是,python 中的multiprocessing 模块带来了巨大的开销。数据大多不在进程之间共享,需要复制。这将从 python 3.8 开始改变。

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

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

关于python - Python : Is there a way to use pool. imap 中的多处理没有积累内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57758384/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com