我正在通过 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。
脚本似乎完成了,但发生了一些奇怪的事情。最重要的是 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
消息这么多?他们正常吗? - 包
snow
和doParallel
. 我是否以正确的顺序调用了正确的包裹? - 上面提到的 StackOverflow 问题的一些答案建议使用以下命令调用脚本
mpirun -np 1 R --slave -f 'myscript.R'
而不是Rscript
像我一样使用。有什么不同?请注意,即使我以这种方式调用脚本,我提到的问题仍然存在。
我非常感谢您的帮助!