2

我正在通过 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

脚本似乎完成了,但发生了一些奇怪的事情。最重要的是 slurm 工作之后继续运行,什么都不做(?)。我想了解我是否正确地做事。我会先给出一些更具体的信息,然后解释我看到的奇怪的事情,然后我会问我的问题。

- 信息:

  • R 作为模块加载,也称为 OpenMPI 模块。包Rmpi, doParallel, snow,foreach已经编译并包含在模块中。

  • 集群有节点,每个节点有 20 个 CPU。我的 sbatch 文件记录了 2 个节点和每个节点 20 个 CPU。

  • R 脚本myscript.R在 sbatch 文件中调用,如下所示:

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()正如预期的那样,正确地给出了 40。此外,getDoParWorkers()给出doParallelSNOW. slurm 日志令人鼓舞地说

    成功生成 39 个奴隶。0 失败。
    启动 MPI 工作者
    启动 MPI 工作者
    ...

此外,print(clusterCall(cl, function() Sys.info()[c("nodename","machine")]))从脚本中调用会正确报告 slurm 队列中显示的节点名称。

– 有什么奇怪的:

  • R 脚本完成了它的所有操作,最后一个是将绘图保存为 pdf,我确实看到并且是正确的。但是 slurm 工作并没有结束,它无限期地留在队列中,状态为“正在运行”。

  • slurm 日志显示很多行带有 Type: EXEC. 我找不到他们的号码和foreach被叫号码之间的任何关系。最后,日志显示 19 行Type: DONE(这对我来说很有意义)。

– 我的问题:

  • 为什么脚本完成后 slurm 作业会无限期运行?
  • 为什么Type: EXEC消息这么多?他们正常吗?
  • snowdoParallel. 我是否以正确的顺序调用了正确的包裹?
  • 上面提到的 StackOverflow 问题的一些答案建议使用以下命令调用脚本
mpirun -np 1 R --slave -f 'myscript.R'

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

我非常感谢您的帮助!

4

0 回答 0