我正在使用一个R脚本,它基本上是将命令行命令粘贴在一起,通过system2()
执行。这些命令运行一些Java应用程序。
现在,我想一次生成该Java应用程序的多个进程,以便在集群计算机上执行一些任务。作业通过Slurm提交。使用doParallel
从R内部执行系统调用,并为Slurm作业保留一定数量的内核,这有意义吗?或者是否有更有效的选项(例如,通过Slurm并行运行R脚本的多个示例,以便产生并行Java示例)?
我不确定Slurm或parallel
如何分配资源,以及如何最有效地生成进程。在此设置中,哪个进程将控制Java示例的执行位置?
泥浆作业示例:
#!/bin/bash
#SBATCH --job-name=somejob
#SBATCH --output=somejob%a.out
#SBATCH --time=2:00:00
#SBATCH --partition=node
#SBATCH --qos=normal
#SBATCH --account=node
#SBATCH --cpus-per-task=20
#SBATCH --mem-per-cpu=3200
#SBATCH --ntasks=1
#SBATCH --array=1#-12
srun R --vanilla -f somescript.R
示例R脚本:
#!/usr/bin/env Rscript
require("doParallel")
cl <- parallel::makeCluster(20)
doParallel::registerDoParallel(cl)
foreach::foreach(
arg1 = 1:20, .packages = "mypackage"
) %dopar% {
arg2 <- "some_arg"
system2("/path/to/java.exe", args = c(arg1, arg2), stdout = TRUE)
}
1条答案
按热度按时间wribegjk1#
假设您有一个集群,每个集群的节点都有32个内核,下面的R脚本和shell脚本将运行2个R会话,每个会话使用32个内核,对您的Java代码执行64次并行操作。
将上述内容保存到
my_r_script.R
中。将上述内容保存到
my_script.sh
中,并使用sbatch my_script.sh
提交给Slurm。shell脚本要求2个节点和节点上的所有内核。OpenMPI
mpirun
为每个节点放置1个R会话,并且由于独占访问,所有核心都可用于mclapply()
。您可能需要加载提供软件环境的模块,包括
module load r
。这些细节通常取决于站点。您将需要额外的
#SBATCH
参数,用于帐户、队列、时间和可能的内存,这些参数在具有不同本地默认值的不同集群上可能会有所不同。arg1
参数在64个示例中各不相同,可用于在Java代码中创建不同的输出文件名。