我正在使用Python中的multiprocessing
模块来并行训练带有keras
的神经网络,使用带有imap
的Pool(processes = 4)
对象。在每一个“周期”(即每4个进程)之后,它会稳定地使用越来越多的内存,直到最终崩溃。你知道吗
我使用memory_profiler
模块跟踪我的内存使用情况,训练了12个网络。这里使用香草imap
:
如果我把maxtasksperchild = 1
放在Pool
:
如果我使用imap(chunksize = 3)
:
在后一种情况下,如果一切正常,我只向池中的每个进程发送一个批,所以问题似乎是这些进程携带了有关前一批的信息。如果是这样,我能强迫游泳池不要这样做吗?你知道吗
尽管chunks解决方案似乎有效,但我还是不想使用它,因为
tqdm
模块来跟踪进度,在chunks情况下,它只会在每个chunk之后更新,这实际上意味着它根本不会真正跟踪任何东西,因为所有chunk都会在同一时间完成(在本例中)这里有一个vanilla案例中的代码片段。在另外两个例子中,我只是更改了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()
我想出了一个似乎可行的解决办法。我抛弃了游泳池,建立了自己的简单排队系统。除了不增加(虽然它确实略微增加,但我认为这是我将一些字典存储为日志)之外,它甚至比上面的chunks解决方案消耗更少的内存:
我不知道为什么会这样。也许
Pool
对象只是占用了大量内存?不管怎样,这是我的代码:不幸的是,python中的
multiprocessing
模块带来了巨大的开销。数据通常不在进程之间共享,需要复制。这将从python3.8开始改变。你知道吗尽管python3.8的正式发布日期是2019年10月21日,但您已经可以在github上下载它了
相关问题 更多 >
编程相关推荐