doMPI无法识别R脚本中集群中的其他节点

时间:2017-02-07 01:21:40

标签: r parallel-processing mpi openmpi dompi

  • 使用RHEL7.3
  • 使用R 3.3.2
  • 已安装Rmpi_0.6-6.tar.gz和doMPI_0.2.1.tar.gz
  • 安装了mpich-3.0-3.0.4-10.el7 RPM for x86_64

我创建了一个由三台机器组成的集群(aml1,2,3)。我可以从mpich安装中运行 / examples / cpi 示例,并且所有三台计算机上的进程都没有问题。

我还可以运行需要多次运行的R脚本,这在doMPI文档中进行了讨论 - 因此脚本可以在所有集群上运行。

我的问题是我的R脚本在%dopar%之前的代码需要在master(aml1)上运行一次,并且在集群上运行%dopar%(aml2,aml3)。它只能在主服务器上运行。并且doMPI说Size of MPI universe: 0并且不识别aml2或aml3。

例如:

运行:mpirun -np 1 --hostfile ~/projects/hosts R --no-save -q < example6.R

(我的~/projects/hosts文件定义为使用8个核心)

example6.R:

library(doMPI) #load doMPI library
cl <- startMPIcluster(verbose=TRUE)
#load data
#clean data
#perform some functions

#let's say I want to have this done in the script and only parallelize this
x <- foreach(seed=c(7, 11, 13), .combine="cbind") %dopar% {
 set.seed(seed)
 rnorm(3)
 }
x
closeCluster(cl)

example6.R的输出:

Master processor name: aml1; nodename: aml1
Size of MPI universe: 0
Spawning 2 workers using the command:
  /usr/lib64/R/bin/Rscript /usr/lib64/R/library/doMPI/RMPIworker.R WORKDIR=/home/spark LOGDIR=/home/spark MAXCORES=1 COMM=3 INTERCOMM=4 MTAG=10 WTAG=11 INCLUDEMASTER=TRUE BCAST=TRUE VERBOSE=TRUE
 2 slaves are spawned successfully. 0 failed.

如果我定义cl <- startMPIcluster(count=34, verbose=TRUE)我仍然会得到以下内容,但至少我可以运行34个奴隶:

Master processor name: aml1; nodename: aml1
Size of MPI universe: 0
34 slaves are spawned successfully. 0 failed.

我该如何解决这个问题?我想运行R脚本,使其在主服务器上运行第一部分,然后在集群上执行%dopar%。

谢谢!

更新1

自上次更新以来,我尝试运行旧版本的OpenMPI:

[spark@aml1 ~]$ which mpirun
/opt/openmpi-1.8.8/bin/mpirun

根据@SteveWeston,我创建了以下脚本并运行它:

[spark@aml1 ~]$ cat sanity_check.R
library(Rmpi)
print(mpi.comm.rank(0))
mpi.quit()

使用以下输出:

[spark@aml1 ~]$ mpirun -np 3 --hostfile ~/projects/hosts R --slave -f sanity_check.R
FIPS mode initialized
master (rank 0, comm 1) of size 3 is running on: aml1
slave1 (rank 1, comm 1) of size 3 is running on: aml1
slave2 (rank 2, comm 1) of size 3 is running on: aml1
[1] 0

这里只是挂起 - 没有任何反应。

1 个答案:

答案 0 :(得分:0)

我已经接受了@ SteveWeston的答案,因为它帮助我更好地理解了我原来的问题。

我对他的回答评论说我的R脚本仍然存在问题;脚本会运行,但它永远不会自己完成或关闭自己的集群,我将不得不用ctrl-C杀死它。

我最终建立了一个nfs环境,在那里构建并安装了openmpi-1.10.5,并在那里安装了我的R库。 R在两台计算机上单独安装,但它们在我的nfs目录中共享相同的库。以前我已经在root下安装和管理了所有东西,包括R库(我知道)。我不确定这是否会导致并发症,但我的问题似乎得到了解决。

[master@aml1 nfsshare]$ cat sanity_check.R
library(Rmpi)
print(mpi.comm.rank(0))
mpi.quit(save= "no")

[master@aml1 nfsshare]$ mpirun -np 3 --hostfile hosts R --slave -f sanity_check.R
FIPS mode initialized
[1] 1
[1] 0
[1] 2
# no need to ctrl-C here. It no longer hangs