多个节点上的单个 R 脚本

Single R script on multiple nodes

我想利用来自多个节点的 CPU 个核心来执行单个 R 脚本。每个节点包含 16 个核心,并通过 Slurm 工具分配给我。

到目前为止,我的代码如下所示:

ncores <- 16

List_1 <- list(...)
List_2 <- list(...)

cl <- makeCluster(ncores)
registerDoParallel(cl)
getDoParWorkers()

foreach(L_1=List_1) %:% 
foreach(L_2=List_2) %dopar% {
...
}

stopCluster(cl)

我在 UNIX shell 中通过以下命令执行它:

mpirun -np 1 R --no-save < file_path_R_script.R > another_file_path.Rout

这在单个节点上工作正常。但是,我还没有弄清楚一旦我可以访问第二个节点,将 ncores 增加到 32 是否足够。 R 是否自动在另一个节点上包含额外的 16 个内核?或者我必须使用另一个 R 包吗?

如果不使用 Rmpi,则使用 mpirun 启动 R 脚本没有任何意义。

查看您的代码,您可能确实希望没有 MPI。使用 2x16 核的方法如下。

要求 2 个任务和每个任务 16 个 cpu

#SBATCH --nodes 2
#SBATCH --ntasks 2
#SBATCH --cpus-per-task 16

使用 Slurm 的 srun 命令启动您的程序

srun R --no-save < file_path_R_script.R > another_file_path.Rout

srun 命令将在两个不同的节点上启动 R 脚本的 2 个实例,并将环境变量 SLURM_PROCID 设置为在一个节点上为 0,在另一个节点上为 1

在您的 Rscript 中使用 SLURM_PROCID 的值将工作分配给由 srun

启动的两个进程
ncores <- 16

taskID <- as.numeric(Sys.getenv('SLURM_PROCID'))

List_1 <- list(...)
List_2 <- list(...)

cl <- makeCluster(ncores)
registerDoParallel(cl)
getDoParWorkers()

Lits_1 <- split(List_1, 1:2)[[taskID+1]] # Split work based on value of SLURM_PROCID

foreach(L_1=List_1) %:% 
foreach(L_2=List_2) %dopar% {
...
}

stopCluster(cl)

您需要将结果保存在磁盘上,然后将部分结果合并为一个完整结果。