1

我正在尝试使用以下 R 代码在局域网内的 3 台不同计算机上执行 MPI 集群:

library(plyr)
library(class)
library(snow)
cl <- makeCluster(spec=c("localhost","ip1","ip2"),master="ip3")

但我收到一个错误:

Error in mpi.comm.spawn(slave = mpitask, slavearg = args, nslaves = count,  : 
  Calloc could not allocate memory (18446744071562067968 of 4 bytes)
Warning messages:
1: In if (nslaves <= 0) stop("Choose a positive number of slaves.") : [...]
2: In mpi.comm.spawn(slave = mpitask, slavearg = args, nslaves = count,  :
  NA produced by coercition

这个错误是什么原因造成的?我找不到关于当前主题的任何相关主题。

4

2 回答 2

4

调用makeCluster创建 MPI 集群时,spec参数应该是数字或缺失,具体取决于您是否希望生成工作程序。您不能像创建 SOCK 集群时那样指定主机名。为了在具有 MPI 集群的其他机器上启动工作程序,您必须使用诸如 mpirun、mpiexec 等命令执行您的 R 脚本,具体取决于您的 MPI 安装,并通过参数指定要使用的主机 mpirun ,而不是makeCluster

在您的情况下,您可以使用以下命令执行脚本:

$ mpirun -n 1 -H ip3,localhost,ip1,ip2 R --slave -f script.R

由于-n 1使用了,您的脚本仅在“ip3”上执行,而不是所有四台主机,但 MPI 知道其他三台主机,并且能够为它们生成进程。

您将在该脚本中创建 MPI 集群:

cl <- makeCluster(3)

这应该会导致在“localhost”、“ip1”和“ip2”上生成一个工作进程,主进程在“ip3”上运行(至少对于 Open MPI:我不确定其他 MPI 发行版)。我不相信“主”选项与 MPI 传输一起使用:它主要由 SOCK 传输使用。

您可以从其手册页中获得有关 mpirun 的大量信息。

于 2013-09-28T13:28:21.050 回答
0

您甚至可以通过以下方式尝试在集群节点中执行代码:

  1. 创建一个名为 nodelist的文件-> 在另一个下面写下该文件中的机器名称。

  2. 使用 mpirun 在终端中尝试以下命令: mpirun -np (no.of processes) -machinefile (path where your nodelist file is present) Rscript (filename.R)。忽略圆括号。

  3. 默认情况下,它会将第一个节点作为主节点,并将进程生成到其余节点,包括自身作为从节点。

于 2014-02-21T11:32:13.823 回答