【问题标题】:Embarrasingly Parallel For loop, subprocess call尴尬的并行For循环,子进程调用
【发布时间】:2026-01-07 01:05:02
【问题描述】:

我有一个像这样工作的 python 程序:

  1. 初始化数据

  2. 调用外部软件计算数据结果(使用子进程),读回外部软件的输出

  3. 处理输出,准备返回步骤 1。

我想在集群环境 (slurm) 中并行化第 2 步,并使用多节点环境。

我试图找到最简单的方法,因为如果在批处理文件中分配给 python 程序,我认为 subprocess 不会自动使用多个节点。

我尝试使用 dask-jobqueue,但是这依赖于为每个工作人员创建一个批处理文件,这意味着我必须进行 10 次批处理文件调用并等待它们全部赶上代码以使用它们。

我想知道是否有人有任何建议,因为这似乎应该是一件容易的事。

编辑:我认为这比仅使用多处理更复杂。 This question 了解我想要完成的工作,我想知道解决这类问题的理想方案是什么

【问题讨论】:

  • 有很多方法可以做到这一点。在最基本的层面上,有两种选择:1)让您的 Python 进程同时进行多个子进程调用,每个子进程都将问题的一部分作为单个任务进行攻击,以及 2)让 Python 对某个事物进行单个子进程调用然后分解任务,然后利用某种并行化来并行执行任务....
  • #1 可以通过多种方式完成:a) 在单个执行线程中进行多个非阻塞子进程调用,b) 多个线程各自进行子进程调用,或 c) 多个多处理块(低开销线程)进行子进程调用。 #2 包含几乎无限的可能性。也许您的集群环境提供了一种自然的方式来执行 #2。如果不是,我是老派,所以我可能会选择 b) vs c)。
  • 您的问题似乎已经被问到了。看看这篇文章。 - 这篇文章似乎解决了我提到的所有三种可能性......
  • 感谢您的回复。子进程是否利用集群上可用的多个节点?

标签: python subprocess cluster-computing slurm


【解决方案1】:

似乎解决此问题的最佳方法很大程度上取决于您正在使用的集群大小、环境等的容量。对我来说最好的情况是使用 MPI4py,它将隔离我的子进程调用并在我的 X 个节点中使用它们(步骤 2),并让我的头节点运行其余代码(步骤 1 和 3)。这使我的 slurm 保留保持不变,而不必在每个循环中请求节点,或在程序运行期间请求节点(如 dask-jobqueue)。

【讨论】:

    最近更新 更多