微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

HPC SLURM 和对 Master-Worker 系统中启用 MPI 的应用程序的批量调用

如何解决HPC SLURM 和对 Master-Worker 系统中启用 MPI 的应用程序的批量调用

我正在尝试使用资源管理器 SLURM 在 HPC 中实施某种 Master-Worker 系统,我正在寻找有关如何实施此类系统的建议。

我必须使用一些 Python 代码来扮演 Master 的角色,从某种意义上说,在向Worker 发送新一批工作之前,Master 将在计算批次之间运行 2 秒自己的计算。每个 Worker 必须在 HPC 的单个节点上运行外部可执行文件。外部可执行文件 (Gromacs) 本身支持 MPI。将有大约 25 个工人和许多批次的计算。

我想到的 atm(另请参阅下面的编辑):

workflow

我目前正在尝试的内容

  1. 在我通过 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
  1. 在 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()
  1. 在 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

我想解释一下:

  1. 有人可以确认这种方法对于实现所需的系统似乎有效吗?或者很明显这没有机会工作?如果是这样,请问为什么?

  2. 我不确定 MPI.COMM_SELF.Spawn() 会使可执行文件从 SLURM 资源分配继承。如果没有,如何解决这个问题?我认为 MPI.COMM_SELF.Spawn() 正是我要找的,但我不确定。

  3. 外部可执行文件需要加载一些 environment modules。如果它们是在 sbatch run.sh 加载的,那么当我从 MPI.COMM_SELF.Spawn() 调用 my_python_code.py 时它们是否仍然加载?

  4. 作为一种稍微不同的方法,是否可以使用预分配/预留之类的方式为工作人员预订资源,然后将 MPI.COMM_WORLD.Spawn() 与预分配/预留一起使用?目标还在于避免在每个新批次时进入 SLURM 队列,因为这可能会浪费大量时钟时间(因此会在一开始就预订所有必需的资源)。

  5. 无论如何,python Master 必须始终保持活动状态,因此 SLURM 作业依赖项在这里没有用,是吗?

非常感谢您提供的任何帮助!

编辑:简化工作流程

为了让我的问题保持简单,我首先忽略了我实际上让 Workers 进行了一些分析的事实。但正如 Gilles Gouillardet 建议的那样,这项工作可以使用 OpenMP 多处理在 Master 上完成。它执行得足够快。

那么工作人员确实是必要的,因为每个任务在单个工作人员/节点上大约需要 20-25 分钟。

我还添加了一些关于维护我自己的任务队列的内容,这些任务将发送到 SLURM 队列并最终发送到工作人员,以防万一任务数量t将超过几十/几百个工作岗位。这也应该在将来为不同的应用程序重用此代码时提供一些灵活性。

大概这样就好了。我会尝试这样做并更新这些行。编辑:它工作正常。

workflow2

解决方法

乍一看,这对我来说很复杂:

  • 从站和 GROMACS 之间没有通信
  • 有一些主/从通信,但 MPI 真的有必要吗?
  • 奴隶真的有必要吗? (例如,主进程能否简单地将计算序列化,然后直接启动 GROMACS?)

一个更简单的架构是在你的前端有一个进程,这样就可以了:

  1. 准备 GROMACS 输入
  2. sbatch gromacs(连续启动多个作业)
  3. 等待 GROMACS 作业完成
  4. 分析 GROMACS 输出
  5. 重复或退出

如果slave正在做一些你不想在master上序列化的工作,你能用共享文件系统上的文件来代替MPI通信吗?在这种情况下,您可以在执行 GROMACS 之前和之后在 GROMACS 作业中的计算节点上进行计算。如果没有,也许基于 TCP/IP 的通信可以解决问题。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。