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