python - Python 中的多处理:有没有办法在不累积内存的情况下使用 pool.imap?
问题描述
我正在使用 Python 中的模块来并行multiprocessing
训练神经网络,使用. 这在每个“循环”之后稳定地使用越来越多的内存,即每 4 个进程,直到它最终崩溃。keras
Pool(processes = 4)
imap
我使用该memory_profiler
模块来跟踪我的内存使用情况,训练了 12 个网络。这里使用香草imap
:
如果我maxtasksperchild = 1
输入Pool
:
如果我使用imap(chunksize = 3)
:
在后一种情况下,一切正常,我只向池中的每个进程发送一个批次,因此问题似乎在于这些进程携带有关先前批次的信息。如果是这样,我可以强制游泳池不这样做吗?
即使块解决方案似乎工作我宁愿不使用它,因为
- 我想使用
tqdm
模块跟踪进度,在块的情况下,它只会在每个块之后更新,这实际上意味着它根本不会真正跟踪任何东西,因为所有块同时完成(在这个例子中) - 目前,所有网络都需要完全相同的时间来训练,但我想让它们有单独的训练时间的可能性,块解决方案可能会导致一个进程获得所有长的训练时间。
这是香草案例中的代码片段。在其他两种情况下,我只是更改了maxtasksperchild
in 中的参数和 in 中Pool
的chunksize
参数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()
解决方案
不幸的是,multiprocessing
python 中的模块需要付出很大的代价。数据大多不在进程之间共享,需要复制。这将从 python 3.8 开始改变。
https://docs.python.org/3.8/library/multiprocessing.shared_memory.html
虽然,python 3.8 的正式版本是 2019 年 10 月 21 日,但你已经可以在github上下载它了
推荐阅读
- aws-iot - 如何限制 AWS-IoT 事物发布/订阅 AWS IoT-Core 中的某些主题?
- postgresql - 服务器和 postgresql 在 Docker `getaddrinfo ENOTFOUND` 上运行时无法连接
- java - 如何使用不同数量的命令行参数构建对象?
- eclipse-plugin - 为什么 Nebula NatTable 在处理大型数据集方面更好?
- json - 使用 wso2 处理大型列表
- haskell - 隐藏包(升级到 Fedora 33 后?)
- reactjs - React Axios 发布错误 400 错误请求,不应具有其他属性
- python - 如何在 python 中将打印语句写入 csv 文件?
- reactjs - 如何在设置值时更改 React 中的输入值并在状态是数组对象时更新状态?
- xamarin.android - 裁剪并保存图像