【问题标题】:any use case for mpirun on slurm-managed cluster?mpirun 在 slurm 管理的集群上的任何用例?
【发布时间】:2018-07-12 07:54:48
【问题描述】:

我最近在看this post 关于mpirunmpiexecthis post 关于srunsbatch,但我想知道mpirun 与slurm 和srun 的关系。

通常在我看到的示例中,发送到sbatch 的文件中包含srun <program> 以执行MPI 程序,但我有时会看到使用mpirunmpiexec 的文件。但是,我不明白为什么要这样做。如another question I recently asked 中的示例,似乎使用mpirunmpiexec 可能会产生各种(依赖于实现?)错误,没有理由不使用srun

这是准确的,还是有充分的理由让您在 slurm 管理的集群上执行程序时要使用 mpirunmpiexec 而不是 srun

【问题讨论】:

  • mpirun 在每个节点上启动代理,然后启动 MPI 任务。另一方面(例如,资源管理器不直接知道 MPI 任务)。 srun 直接启动 MPI 任务,但这需要来自 SLURM 的一些支持(PMIPMIx)。
  • @GillesGouaillardet 所以你会使用mpirun 来获得一个节点的(可能是16个)核心的并行化? srun 的想法不是能够跨节点和在它们内部创建多个进程吗?
  • 从高层次上看,结果是一样的。 srun(又名直接启动)使用资源管理器进行“连接”(例如初始化并行作业),而 mpirun 使用自己的代理。

标签: mpi slurm


【解决方案1】:

这个问题在很大程度上取决于您使用的 MPI 的风格及其与 SLURM 的集成。

就我自己而言,我完全理解这是个人喜好问题,我想说的是,由于必须与众多不同的集群和环境打成一片,我会尽量减少可变性的跨度。所以如果 SLURM 在我运行的集群上可用,我将尝试通过 SLURM 和 sbatch 对我的代码进行所有运行时调整,并让 MPI 继承它们。

为此,我将定义我想要什么以及我希望我的 MPI 代码如何从我的#SBATCH 提交参数中提交:节点数、每个进程的核心数、每个节点的进程数等。然后, MPI 的启动有望通过 MPI 库提供的 mpirun、mpiexec 或类似命令尽可能简单。例如,大多数(如果不是全部)最近的 MPI 库可以直接检测到作业已在 SLURM 中提交,并无需任何额外工作即可继承 SLURM 的进程放置。通常,例如,对于英特尔 MPI,我确实使用mpirun -bootstrap slurm <mycode>,并且所有进程都按预期放置。事实上,这个-bootstrap slurm 选项可能甚至都不是必需的,但我保留它以防万一。

相反,在库的 mpirunmpiexec 上使用 srun 将要求 MPI 代码已与 SLURM 的进程管理库链接。这可能是也可能不是,所以它可能会也可能不会做你想做的事。但更重要的是,即使它确实有效,与仅使用 MPI 默认启动器相比,它也不会给您带来任何额外的优势,因为 SLURM 在通过sbatch 提交作业时已经完成了进程管理。 所以对我来说,除了极少数的快速和肮脏的测试,每当 SLURM 用于批处理调度时,srun 不会被使用,而是 MPI 的mpirunmpiexec 默认命令。

【讨论】:

  • 因此,如果我只是登录到使用 SLURM 管理的集群并执行例如module load intel-mpi mpi4py,那么使用srun 是否有意义?
  • 另外,您说“大多数(如果不是全部)最近的 MPI 库可以直接检测到作业已在 SLURM 中提交并继承 SLURM 的流程放置而无需任何额外的努力”......是问题我使用带有 SLURM 异常的英特尔 MPI 与错误相关联,或者我只是使用了不正确的东西?
  • 我也不明白为什么使用 srun 会要求 MPI 代码已经与 SLURM 的库链接,但让 mpirun 知道并自动继承 SLURM 的进程放置不会。
猜你喜欢
  • 2021-08-10
  • 2015-10-29
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多