我正在通过sbatch和mpirun在HPC集群上排队并运行R脚本;该脚本旨在并行使用foreach
。为此,我使用了StackOverflow的几个有用的问题和答案:R Running foreach dopar loop on HPC MPIcluster,Single R script on multiple nodes,Slurm: Use cores from multiple nodes for R parallelization。
该脚本似乎已完成,但是发生了一些奇怪的事情。最重要的是,继续进行口吃作业,什么也不做(?)。我想了解我是否做得正确。我将首先提供一些更具体的信息,然后解释我所看到的奇怪事物,然后再问我的问题。
–信息:
R作为模块加载,该模块也称为OpenMPI模块。软件包Rmpi
,doParallel
,snow
,foreach
已被编译并包含在模块中。
集群中的每个节点都有20个CPU。我的sbatch文件预订2个节点,每个节点20个CPU。
在sbatch文件中这样调用R脚本myscript.R
:
mpirun -np 1 Rscript -e "source('myscript.R')"
library('snow')
library('Rmpi')
library('doParallel')
library('foreach')
,然后在开始时按如下所示设置并行化:
workers <- mpi.universe.size() - 1
cl <- makeMPIcluster(workers, outfile='', type='MPI')
registerDoParallel(cl)
然后依次调用多个foreach-dopar
–即,每个stopCluster(cl)
mpi.quit()
在前一个结束后开始。最后
mpi.universe.size()
在脚本的最后被调用。
getDoParWorkers()
如预期的那样正确给出40。同样,doParallelSNOW
给出print(clusterCall(cl, function() Sys.info()[c("nodename","machine")]))
。含糊的日志令人鼓舞地说
成功产生了39个奴隶。 0个失败。
MPI的新手
MPI的新手
...
另外,从脚本内调用Type: EXEC
会正确报告在Slurm队列中显示的节点名称。
–奇怪的是:
R脚本完成了所有操作,最后一个是将图另存为pdf,我确实看到了,这是正确的。但是the昧的工作并没有结束,它以状态“正在运行”无限期地保留在队列中。
slurm日志显示非常多行
foreach
。我找不到他们的电话号码与所呼叫的Type: DONE
号码之间的任何关系。最后,日志显示19行带有Type: EXEC
(这对我来说很有意义)。
–我的问题:
snow
消息?他们正常吗?doParallel
和mpirun -np 1 R --slave -f 'myscript.R'
之间有一些掩蔽。我会按正确的顺序调用正确的包裹吗?Rscript
而不是像我一样使用RewriteEngine
。有什么不同? 请注意,即使我以这种方式调用脚本,我提到的问题仍然存在。
非常感谢您的帮助!