多个节点上的单个R脚本

时间:2017-12-11 16:18:24

标签: r unix parallel-processing mpi hpc

我想利用来自多个节点的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包?

1 个答案:

答案 0 :(得分:1)

如果不使用Rmpi,使用mpirun启动R脚本是没有意义的。

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

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

#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)

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