doMPI 无法识别 R 脚本集群中的其他节点
doMPI not recognizing other nodes in cluster for R script
- 使用 RHEL7.3
- 使用 R 3.3.2
- 已安装 Rmpi_0.6-6.tar.gz 和 doMPI_0.2.1.tar.gz
- 为 x86_64
安装了 mpich-3.0-3.0.4-10.el7 RPM
我创建了一个由三台机器 (aml1,2,3) 组成的集群。我可以 运行 来自 mpich 安装的 /examples/cpi 示例和进程 运行 在所有三台机器上都没有问题。
我还可以 运行 一个需要 运行 多次的 R 脚本,这在 doMPI 文档中进行了讨论——因此所有集群上的脚本 运行s。
我的问题是,当我的 R 脚本在 %dopar% 之前有代码时,需要在 master(aml1) 上 运行 一次,并且在 %dopar% 运行集群(aml2,aml3)。它只有 运行s 在 master 上。 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
它只是挂起 -- 没有任何反应。
我已经接受了@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
- 使用 RHEL7.3
- 使用 R 3.3.2
- 已安装 Rmpi_0.6-6.tar.gz 和 doMPI_0.2.1.tar.gz
- 为 x86_64 安装了 mpich-3.0-3.0.4-10.el7 RPM
我创建了一个由三台机器 (aml1,2,3) 组成的集群。我可以 运行 来自 mpich 安装的 /examples/cpi 示例和进程 运行 在所有三台机器上都没有问题。
我还可以 运行 一个需要 运行 多次的 R 脚本,这在 doMPI 文档中进行了讨论——因此所有集群上的脚本 运行s。
我的问题是,当我的 R 脚本在 %dopar% 之前有代码时,需要在 master(aml1) 上 运行 一次,并且在 %dopar% 运行集群(aml2,aml3)。它只有 运行s 在 master 上。 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
它只是挂起 -- 没有任何反应。
我已经接受了@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