mpirun、Python 和任务映射

问题描述 投票:0回答:2

我必须在具有多个内核的 SLURM 系统中,在 Python 包装器中同时使用两个工具。

  • 第一个很复杂,无法更改。它直接在 Python 中生成,并使用每个节点使用的任务,每个任务使用与每个节点中一样多的 CPU。示例:4个节点20核,运行命令为
    mpirun -np 4 -oversubscribe --bind-to none python run_solver1.py
    .
  • 第二个(OpenFOAM)通常由 mpirun 自行生成,并使用与 CPU 总数一样多的任务。先前配置的命令是:
    mpirun -np 80 solver2 -parallel
    ,然后求解器 2 将自己处理并行任务运行。

我需要的是仍然使用与第一种情况相同的语法,但还在 python 脚本中包含第二个求解器:

mpirun -np 4 -oversubscribe --bind-to none python run_solvers.py
.

我一直在使用

subprocess
来生成任务,但如果我这样做:

  • subprocess.check_call('solver2', '-parallel'])
    ,使用此配置,我只会生成 4 个任务,而不是 80 个。
  • subprocess.check_call('mpirun -np 80 solver2 -parallel'.split())
    使用此配置,子进程返回错误
  • 如果我在通话中添加
    -oversubscribe --bind-to none
    也一样。

我也尝试过 mpi4py:

  • MPI.COMM_SELF.Spawn('solver2', args=['-parallel'], maxprocs=80)
    产量
    mpi4py.MPI.Exception: MPI_ERR_SPAWN: could not spawn processes
    .
  • MPI.COMM_WORLD.Spawn('solver2', args=['-parallel'], maxprocs=80)
    .

我有什么办法让它工作,并让 Python 明白我需要用 80 个处理器生成这个命令吗?

谢谢!

python parallel-processing mpi coupling
2个回答
0
投票

您似乎正尝试在具有多个内核的 SLURM 系统上并行运行两个不同的求解器,并且您想使用 Python 包装器来完成。您提到第一个求解器使用特定命令,每个节点使用任务,每个任务使用与每个节点中一样多的 CPU,而第二个求解器使用不同的命令,使用所有可用的 CPU。

根据您的描述,您似乎无法让第二个求解器使用所有 80 个 CPU。一种可能的解决方案是使用 subprocess 模块并行生成两个求解器,并将适当的参数传递给每个命令。下面是一个示例,说明如何修改 Python 脚本以实现此目的: 导入子流程

运行第一个求解器

subprocess.check_call(['mpirun', '-np', '4', '-oversubscribe', '--bind-to', 'none', 'python', 'run_solver1.py'])

使用 80 个 CPU 运行第二个求解器

subprocess.check_call(['mpirun', '-np', '80', 'solver2', '-parallel']) 此代码使用 subprocess.check_call 函数将每个求解器生成为一个单独的进程。第一个求解器使用您提供的相同命令运行,而第二个求解器使用 mpirun 命令运行,并将 -np 参数设置为 80 以指示它应使用所有可用的 CPU。

请注意,您可能需要修改传递给每个命令的参数以匹配您的特定设置。此外,请确保您的系统上安装了必要的软件和库以并行运行两个求解器。


0
投票

是的,有可能让它发挥作用。您可以使用 Python mpi4py 模块生成具有正确数量处理器的进程。以下代码应该有效:

from mpi4py import MPI

comm = MPI.COMM_SELF.Spawn('solver2', args=['-parallel'], maxprocs=80)
comm.Disconnect()

此代码将生成 80 个具有给定参数的 solver2 进程实例。

© www.soinside.com 2019 - 2024. All rights reserved.