我正在尝试使用以下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
这个错误到期是什么?我找不到关于当前主题的任何相关主题。
答案 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)
您甚至可以通过以下方式尝试在群集节点中执行代码:
创建一个名称文件 nodelist - &gt;记下那个机器名称在另一个下面。
使用mpirun在终端中尝试以下命令:
mpirun -np (no.of processes) -machinefile (path where your nodelist file is present) Rscript (filename.R)
。忽略圆括号。
默认情况下,它会将第一个节点作为主节点,并将进程生成到其余节点,包括自身作为从节点。