7

使用 Python 编写科学代码时遇到以下问题:

  • 通常你迭代地编写代码,作为执行一些计算的脚本。
  • 最后,它起作用了;现在您希望使用多个输入和参数运行它,但发现它花费了太多时间。
  • 回想一下您在一家优秀的学术机构工作并可以使用大约 100 个 CPU 的机器,您不知道如何获得这种能力。您首先准备小型 shell 脚本,这些脚本运行具有不同输入的原始代码并手动运行它们。

作为一名工程师,我知道所有正确的架构(工作项排队,工作线程或进程,工作结果排队并写入持久存储);但我不想自己实现这一点。最成问题的问题是由于代码更改或临时系统问题(例如内存不足)而需要重新运行。

我想找到一些框架,我将向其提供所需的输入(例如,每次运行一个文件),然后我将能够启动一些框架提供的代理的多个实例,这些代理将运行我的代码。如果运行出现问题(例如临时系统问题或由于错误引发的异常),我将能够删除结果并运行更多代理。如果我占用太多资源,我将能够杀死一些代理而不用担心数据不一致,而其他代理会在他们找到时间时拿起工作项。

任何现有的解决方案?有人愿意分享他的代码吗?谢谢!

4

4 回答 4

5

我可能是错的,但是对于这种情况,仅使用 GNU 命令行实用程序(例如parallel,甚至xargs)似乎适合我。用法可能如下所示:

cat inputs | parallel ./job.py --pipe > results 2> exceptions

这将对job.py每一行inputs并行执行,将成功的结果输出到results,将失败的结果输出到exceptions在这个Biostars 线程中可以找到很多使用示例(也适用于科学 Python 脚本)。

并且,为了完整起见,并行文档

于 2013-08-20T01:04:50.767 回答
2

首先,我想强调的是,Uri 在他的问题中描述的问题确实是许多从事科学计算的人都面临的问题。可能不容易看出您是否使用具有明确定义范围的已开发代码库 - 事情不会像科学计算或数据分析那样快速变化。这个页面很好地描述了为什么人们想要一个简单的解决方案来并行化代码片段。

所以,这个项目是解决这个问题的一个非常有趣的尝试。我自己还没有尝试过使用它,但它看起来很有前途!

于 2013-08-19T02:26:08.503 回答
2
  • 通常你迭代地编写代码,作为执行一些计算的脚本。

这让我觉得你真的很喜欢ipython 笔记本

笔记本是一个文件,其结构是文档和交互式 Python 解释器的混合体。当您编辑文档的 python 部分时,它们可以被执行并且输出嵌入到文档中。这是一个非常好的编程,你正在探索问题空间,并想在你去的时候做笔记。

它还与 matplotlib 高度集成,因此您可以内联显示图形。您可以嵌入 Latex 数学内联,以及许多媒体对象类型,例如图片和视频。

这是一个基本的例子,还有一个更华丽的例子

  • 最后,它起作用了;现在您希望使用多个输入和参数运行它,但发现它花费了太多时间。
  • 回想一下您在一家优秀的学术机构工作并可以使用大约 100 个 CPU 的机器,您不知道如何获得这种能力。您首先准备小型 shell 脚本,这些脚本运行具有不同输入的原始代码并手动运行它们。

这让我觉得你真的很喜欢ipython 集群

iPython 集群允许您在多台机器上运行并行程序。程序可以是 SIMD(听起来像您的情况)或 MIMD 风格。可以交互式地编辑和调试程序。

在最近的 SciPy 活动中,有几个关于 iPython 的讨论。进入PyVideo.org并搜索会提供大量视频,包括:

我没有看过所有这些,但它们可能是一个很好的起点。

于 2013-08-22T13:12:21.747 回答
2

如果你与“have access to a ~100 CPUs machines“意味着你可以访问 100 台机器,每台机器都有多个 CPU,如果你想要一个足够通用的系统来处理不同类型的应用程序,那么最好的(并且仅在我看来)解决方案是在你的资源和你的工作输入。这根本不是 Python 特定的,它适用于更普遍的意义。这样的层管理计算资源,将任务分配给单个资源单元并为你监控整个系统。你利用通过管理系统提供的定义良好的接口对资源进行分配。例如管理系统通常称为“批处理系统”或“作业排队系统”。流行的例子有 SLURM、Sun Grid Engine、Torque 等。他们每个人上来都不是微不足道的,而且你的要求也不是微不足道的。

基于 Python 的“并行”解决方案通常通过multiprocessing. 以自动方式在单台机器之外执行并行性需要配置良好的资源集群。它通常涉及更高级别的机制,例如消息传递接口 (MPI),它依赖于正确配置的资源系统。相应的配置是在操作系统甚至硬件级别上在资源池中涉及的每台机器上完成的。最终,涉及许多同构或异构性质的单机的并行计算环境需要建立这样的“批处理系统”才能以通用方式使用。

您意识到在正确实施这样一个资源池方面您没有避开努力。但是您可以做的就是将这项工作与您的应用程序层完全隔离开来。您曾经以通用方式实现了这样一个托管资源池,任何应用程序都可以通过一个通用接口使用它。该接口通常在命令行级别通过提供作业提交、监控、删除……命令来实现。由您来定义作业是什么以及它应该消耗哪些资源。将作业分配给特定机器取决于作业队列系统,并且取决于(正确配置的)操作系统和 MPI 库来确保机器之间的通信正常工作。

如果您需要为单个应用程序使用分布在多台机器上的硬件并假设机器可以通过 TCP/IP 相互通信,那么可以使用基于 Python 的解决方案来实现,可以说不太通用的作业排队系统。您可能想看看http://python-rq.org/http://itybits.com/pyres/intro.html(还有许多其他类似的系统,都基于独立的消息传递/排队Redis 或 ZeroMQ 等实例)。

于 2013-08-17T18:20:10.450 回答