有关在HPC群集上运行Rmpi和foreach的几个问题

时间:2019-09-06 11:15:35

标签: r foreach openmpi doparallel sbatch

我正在通过sbatch和mpirun在HPC集群上排队并运行R脚本;该脚本旨在并行使用foreach。为此,我使用了StackOverflow的几个有用的问题和答案:R Running foreach dopar loop on HPC MPIclusterSingle R script on multiple nodesSlurm: Use cores from multiple nodes for R parallelization

该脚本似乎已完成,但是发生了一些奇怪的事情。最重要的是,继续进行口吃作业,什么也不做(?)。我想了解我是否做得正确。我将首先提供一些更具体的信息,然后解释我所看到的奇怪事物,然后再问我的问题。

–信息:

  • R作为模块加载,该模块也称为OpenMPI模块。软件包RmpidoParallelsnowforeach已被编译并包含在模块中。

  • 集群中的每个节点都有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(这对我来说很有意义)。

–我的问题:

  • 为什么脚本完成后无限期地运行slurm作业?
  • 为什么会有大量snow消息?他们正常吗?
  • 软件包doParallelmpirun -np 1 R --slave -f 'myscript.R' 之间有一些掩蔽。我会按正确的顺序调用正确的包裹吗?
  • 对上述StackOverflow问题的一些答案建议使用以下命令调用脚本
Rscript

而不是像我一样使用RewriteEngine。有什么不同? 请注意,即使我以这种方式调用脚本,我提到的问题仍然存在。

非常感谢您的帮助!

0 个答案:

没有答案