如何解决HPC SLURM 和对 Master-Worker 系统中启用 MPI 的应用程序的批量调用
我正在尝试使用资源管理器 SLURM 在 HPC 中实施某种 Master-Worker 系统,我正在寻找有关如何实施此类系统的建议。
我必须使用一些 Python 代码来扮演 Master 的角色,从某种意义上说,在向Worker 发送新一批工作之前,Master 将在计算批次之间运行 2 秒自己的计算。每个 Worker 必须在 HPC 的单个节点上运行外部可执行文件。外部可执行文件 (Gromacs) 本身支持 MPI。将有大约 25 个工人和许多批次的计算。
我想到的 atm(另请参阅下面的编辑):
我目前正在尝试的内容:
- 在我通过
sbatch run.sh
调用的 bash 脚本中,通过 SLURM 分配尽可能多的 MPI 任务以使用节点
#!/bin/bash -l
#SBATCH --nodes=4
#SBATCH --ntasks=4
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=12
module load required_env_module_for_external_executable
srun python my_python_code.py
- 在 python
my_python_code.py
中捕获当前 MPI 排名,并使用排名/节点 0 运行 Master python 代码
from mpi4py import MPI
name = MPI.Get_processor_name()
rank = MPI.COMM_WORLD.Get_rank()
size = MPI.COMM_WORLD.Get_size()
if rank == 0: # Master
run_initialization_and_distribute_work_to_Workers()
else: # Workers
start_Worker_waiting_for_work()
- 在 Workers 的 python 代码中,使用 MPI.COMM_SELF.Spawn() 启动外部(启用 MPI)应用程序
def start_Worker_waiting_for_work():
# here we are on a single node
executable = 'gmx_mpi'
exec_args = 'mdrun -deffnm calculation_n'
# create some relationship between current MPI rank
# and the one the executable should use ?
mpi_info = MPI.Info.Create()
mpi_info.Set('host',MPI.Get_processor_name())
commspawn = MPI.COMM_SELF.Spawn(executable,args=exec_args,maxprocs=1,info=mpi_info)
commspawn.Barrier()
commspawn.disconnect()
res_analysis = do_some_analysis() # check what the executable produced
return res_analysis
我想解释一下:
-
有人可以确认这种方法对于实现所需的系统似乎有效吗?或者很明显这没有机会工作?如果是这样,请问为什么?
-
我不确定
MPI.COMM_SELF.Spawn()
会使可执行文件从 SLURM 资源分配继承。如果没有,如何解决这个问题?我认为MPI.COMM_SELF.Spawn()
正是我要找的,但我不确定。 -
外部可执行文件需要加载一些 environment modules。如果它们是在
sbatch run.sh
加载的,那么当我从MPI.COMM_SELF.Spawn()
调用my_python_code.py
时它们是否仍然加载? -
作为一种稍微不同的方法,是否可以使用预分配/预留之类的方式为工作人员预订资源,然后将
MPI.COMM_WORLD.Spawn()
与预分配/预留一起使用?目标还在于避免在每个新批次时进入 SLURM 队列,因为这可能会浪费大量时钟时间(因此会在一开始就预订所有必需的资源)。 -
无论如何,python Master 必须始终保持活动状态,因此 SLURM 作业依赖项在这里没有用,是吗?
非常感谢您提供的任何帮助!
编辑:简化工作流程
为了让我的问题保持简单,我首先忽略了我实际上让 Workers 进行了一些分析的事实。但正如 Gilles Gouillardet 建议的那样,这项工作可以使用 OpenMP 多处理在 Master 上完成。它执行得足够快。
那么工作人员确实是必要的,因为每个任务在单个工作人员/节点上大约需要 20-25 分钟。
我还添加了一些关于维护我自己的任务队列的内容,这些任务将发送到 SLURM 队列并最终发送到工作人员,以防万一任务数量t将超过几十/几百个工作岗位。这也应该在将来为不同的应用程序重用此代码时提供一些灵活性。
大概这样就好了。我会尝试这样做并更新这些行。编辑:它工作正常。
解决方法
乍一看,这对我来说很复杂:
- 从站和 GROMACS 之间没有通信
- 有一些主/从通信,但 MPI 真的有必要吗?
- 奴隶真的有必要吗? (例如,主进程能否简单地将计算序列化,然后直接启动 GROMACS?)
一个更简单的架构是在你的前端有一个进程,这样就可以了:
- 准备 GROMACS 输入
-
sbatch gromacs
(连续启动多个作业) - 等待 GROMACS 作业完成
- 分析 GROMACS 输出
- 重复或退出
如果slave正在做一些你不想在master上序列化的工作,你能用共享文件系统上的文件来代替MPI通信吗?在这种情况下,您可以在执行 GROMACS 之前和之后在 GROMACS 作业中的计算节点上进行计算。如果没有,也许基于 TCP/IP 的通信可以解决问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。