用降雪R初始化MPI集群

时间:2013-07-27 16:02:37

标签: r parallel-processing cluster-computing openmpi snowfall

我一直在尝试在我的大学集群上运行Rmpisnowfall但由于某种原因,无论我分配了多少个计算节点,我的snowfall初始化只会继续运行一个节点。

以下是我如何初始化它:

sfInit(parallel=TRUE, cpus=10, type="MPI")

有什么想法吗?我会根据需要提供澄清。

1 个答案:

答案 0 :(得分:7)

要在群集上运行基于Rmpi的程序,您需要使用批处理排队系统请求多个节点,然后通过mpirun / mpiexec等实用程序从作业脚本执行R脚本。理想情况下,mpirun实用程序已构建为自动检测批处理排队系统已分配的节点,否则您将需要使用mpirun参数(例如--hostfile)来告诉它使用哪些节点。

在您的情况下,听起来您请求了多个节点,因此问题可能在于R脚本的执行方式。有些人没有意识到他们需要使用mpirun / mpiexec,结果是你的脚本在一个节点上运行。如果您使用的是mpirun,则可能是因为您的批量排队系统不支持安装Open MPI。在这种情况下,您必须根据批处理排队系统提供的信息创建适当的主机文件,该系统通常通过环境变量和/或文件提供。

这是一个典型的mpirun命令,用于从作业脚本执行我的并行R脚本:

mpirun -np 1 R --slave -f par.R

由于我们构建了支持Torque的Open MPI,因此我不使用--hostfile选项:mpirun自动从PBS_NODEFILE环境变量中找出要使用的节点。 -np 1的使用可能看起来很奇怪,但如果您的程序要生成工作程序,则需要使用snow,这通常在使用snowfall包时完成。我从未使用sfInit,但在查看源代码后,我认为makeMPIcluster始终使用“count”参数调用snow,这将导致-np 1为了产生工人,我认为snowfall的MPI集群需要sfInit。否则,mpirun将在多个节点上启动您的R脚本,并且每个节点将在自己的节点上生成10个工作程序,这不是您想要的。诀窍是将Rmpi“cpus”参数设置为与批处理排队系统分配给作业的节点数一致的值。您可能会发现mpi.universe.size {{1}}函数对此有用。

如果您认为所有这些都正确完成,问题可能在于您在R脚本中创建MPI群集对象的方式,但我怀疑它与使用(或缺乏使用)有关)mpirun。