Embarrasingly Parallel For loop, subprocess call
我有一个像这样的python程序:
初始化数据
调用外部软件以计算数据结果(使用子过程),读回外部软件的输出
处理输出,准备好返回步骤1。
我想在集群环境(slurm)中使用多节点环境并行执行步骤2。
我正在尝试找到最简单的方法,因为我认为子进程如果在批处理文件中分配给python程序,不会自动使用多个节点。
我尝试使用dask-jobqueue,但这依赖于为每个工作人员创建一个批处理文件,这意味着我将不得不进行10个批处理文件调用,并等待它们全部赶上代码以充分利用它们。
我想知道是否有人提出建议,因为这似乎应该很容易。
编辑:我认为这比仅使用多处理更为复杂。这个问题要问我要解决的问题,我想知道对于这种类型的问题,理想的解决方案是什么
- 有很多方法可以做到这一点。在最基本的级别上,有两种选择:1)让您的Python进程同时进行多个子进程调用,每个子进程都将其作为单个任务来攻击问题的一部分,以及2)让Python对该内容进行单个子进程调用然后分解任务,然后利用某种并行化并行地执行任务...。
-
#1可以通过多种方式来实现:a)在单个执行线程中进行多个非阻塞子流程调用,b)每个进行子流程调用的多个线程,或c)进行子流程的多个多处理块(低开销线程)电话。 #2由几乎无限的可能性组成。也许您的集群环境提供了一种自然的方式来执行#2。如果不是,那我是高中,所以我可能会选择b)vs c)。
-
您的问题似乎已经被提出。看看这篇文章。 -这篇文章似乎解决了我提到的所有三种可能性...
-
Python线程化多个bash子进程的可能重复项?
-
感谢您的回复。子进程是否利用了集群中可用的多个节点?
-
不,不是直接。子进程本身只是启动一个shell(通常是Bash)并在该shell中执行一个命令。 -(从技术上来说,默认情况下,它甚至不使用shell ...它直接执行命令。请参阅该模块的文档中各个子流程调用的" shell"参数)。
-
对不起,也许我不清楚。我想通过(最有可能的)某种分布式编程方式(MPI,dask等)跨节点并行化子流程调用。
-
对不起。我之前删除的评论含糊不清。如果使用子进程,则将执行本地命令,然后转过头来并运行分发给远程计算机的某些内容,例如" ssh"。有" ssh"库可以做到这一点。我已经使用Fabric来做到这一点。它使用主机名或IP,并允许您与远程计算机"对话"。这可能对您有用。
-
我尚未使用Python完成此特定操作。我只是通过Google搜索" Python分布式计算",并想出了很多东西。像:dispy.sourceforge.net。执行该谷歌搜索。第一页上有很多好东西。 -这是一个非常广泛的主题。甚至不只是"几个",更不用说一种正确的方式来做到这一点。对您来说"最佳"的工作将取决于您的确切用例。
-
快速浏览一下Dask。乍一看似乎仅用于单个主机上的多处理。 -还要检查面料-很抱歉,我没有"确定,请这样做!"回答。
-
谢谢,这有帮助。一旦弄清一切,我将更新我所做的事情
-
凉爽的。我很想听听您选择哪种解决方案以及如何为您解决问题。
解决此问题的最佳方法似乎在很大程度上取决于正在使用的群集大小,环境等的容量。对我而言,最好的情况是使用MPI4py,它将隔离我的子流程调用,并在我的X个节点中使用它们(步骤2),并使我的头节点运行其余代码(步骤1)。