gpt4 book ai didi

python - python中并行任务的良好实践

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

我有一个生成数据的 python 脚本和一个使用 tensorflow 和 keras 在此数据上训练神经网络的脚本。两者都需要神经网络的一个实例。

因为我没有设置“允许增长”标志,所以每个进程都占用了全部 GPU 内存。因此我简单地给每个进程它自己的 GPU。 (对于只有一个 GPU 的人来说,这可能不是一个好的解决方案……又一个 Unresolved 问题)

实际问题如下:两个实例都需要访问网络权重文件。我最近遇到了很多崩溃,因为两个进程都试图访问权重。一个标志或类似的东西应该阻止每个进程访问它,而另一个进程正在访问。希望这不会造成瓶颈。我试图想出一个像 C 中的信号量这样的解决方案,但今天我发现了这个 post在堆栈交换中。

重命名的想法对我来说似乎非常简单有效。这对我来说是好的做法吗?我将使用自己的函数创建权重文件

self.model.save_weights(filepath='weights.h5$$$')

学习过程中,保存后重命名为

os.rename('weights.h5$$$', 'weights.h5')

并使用函数将它们加载到我的数据生成过程中

self.model.load_weights(filepath='weights.h5')

?

这个重命名会覆盖旧文件吗?如果另一个进程当前正在加载会发生什么?我会很感激其他想法如何可以多线程/多处理我的脚本。刚刚意识到在顺序脚本中生成数据、学习、生成数据......并不是真正高效的。

编辑 1:忘记提及权重通过 keras 的保存功能存储在 .h5 文件中

最佳答案

multiprocessing 模块有一个 RLock可用于调节对分片资源的访问的类。 如果您记得在读取和写入之前获取锁并在之后释放它,这也适用于文件。使用锁意味着有时其中一个进程无法读取或写入文件。这有多大问题取决于两个进程必须访问该文件的程度。

请注意,要使其正常工作,其中一个脚本必须将另一个脚本作为进程 创建锁后启动。

如果权重是 Python 数据结构,您可以将其置于 multiprocessing.Manager 的控制之下.这将为您管理对其控制下的对象的访问。 请注意,Manager 不适用于文件,仅用于内存中的对象

此外,在类 UNIX 操作系统上,Python 有 os.lockf锁定(部分)文件。请注意,这只是一个建议 锁。也就是说,如果另一个进程调用lockf,返回值表明文件已经被锁定。它实际上并不会阻止您阅读该文件。

注意:可以读取和写入文件。 当两个进程读取同一个文件(读/读)时,此功能才能正常工作。所有其他组合(读/写、写/读、写/写)都可能并最终会导致未定义的行为和数据损坏。

注2:另一种可能的解决方案涉及进程间通信。进程 1 写入一个新的 h5 文件(具有随机文件名),关闭它,然后发送一条消息(使用 PipeQueue 到进程 2 “我写了一个新的参数文件\路径\到\文件”。然后进程 2 读取文件并将其删除。这可以双向工作,但要求两个进程都经常检查和处理消息。这可以防止文件损坏,因为写入进程仅在完成文件后通知读取进程。

关于python - python中并行任务的良好实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54003532/

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