R - 有雪的Rmpi错误

时间:2013-09-28 11:50:54

标签: r parallel-processing mpi

我正在尝试使用以下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

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

2 个答案:

答案 0 :(得分: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的批次信息。

答案 1 :(得分:0)

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

  1. 创建一个名称文件 nodelist - &gt;记下那个机器名称在另一个下面。

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

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