slurm 上的 R:Rmpi 和 srun

Chr*_*Chr 5 r mpi openmpi slurm

我正在使用带有 Open MPI 的 HPC slurm 集群。管理员希望每个人都使用srun而不是mpirun. 我已经使用了mpirun很多年,几乎所有关于使用 R 和 MPI 的在线讨论都使用mpirun而不是srun. srun使用 R代替有什么缺点吗mpirun?我需要调整代码吗?不幸的是,与我一起工作的集群管理员并不知道这一点,因为他们没有 R 经验。

这是一个mpirun示例,我在 R 外部设置并行进程,然后使用Rmpi包附加到它。

作业脚本:

#!/bin/bash
#SBATCH --job-name=Example
#SBATCH --partition=Something
#SBATCH --nodes=2
#SBATCH --tasks-per-node=30
#SBATCH --time=24:00:00
#SBATCH --mail-user=example@example.com
#SBATCH --mail-type=END,FAIL
#SBATCH --export=NONE
 
module load openmpi
module load r/4.2.2
 
mpirun Rscript --no-save --no-restore $HOME/Example.R
Run Code Online (Sandbox Code Playgroud)

R脚本:

if(!is.loaded("mpi_initialize")) {
  library("doMPI")
}

cl <- startMPIcluster(comm = 0)
registerDoMPI(cl)
 
.Last <- function() {
  if(is.loaded("mpi_initialize")) {
    if(mpi.comm.size(1) > 0) {
      mpi.close.Rslaves()
    }
    .Call("mpi_finalize")
  }
}

foreach(x = something) %dopar% {
 
}

closeCluster(cl)
mpi.quit()
Run Code Online (Sandbox Code Playgroud)

您还可以使用or中的函数,而不是使用 的foreach循环。doMPIapplyRmpisnow

有些人更喜欢mpirun只生成一个进程,然后从 R 中生成从属进程。在这种情况下,您可以使用mpirun该选项进行调用,并在 R 脚本中-np 1进行调用。mpi.spawn.Rslaves

当我开始在 HPC 集群上使用 R 时,它srun并没有按预期工作Rmpi,这就是我最终使用的原因mpirunmpirun那么,替换为时我必须考虑什么srun?代码必须如何更改?不仅可以随意评论,RmpipbdMPI可以评论用例。