我想利用来自多个节点的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包?
答案 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)
您需要将结果保存在磁盘上,然后将部分结果合并为一个完整的结果。