2013-07-27 162 views
5

我一直试图在我的大学的集群上运行Rmpisnowfall,但由于某种原因,无论我分配了多少计算节点,我的snowfall初始化只能在一个节点上运行。用降雪初始化MPI集群R

这里是我如何对其进行初始化:

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

任何想法?我会根据需要提供说明。

+0

任何错误信息? – sgibb

+0

你的群集正在运行什么样的MPI? –

+0

openMPI,据我所知没有错误消息(事情运行顺利,但系统管理员告诉我,它在一个集群上运行,即使我已经分配了5个)。我也意识到我的意思是一个节点不是一个集群。 – user1480248

回答

6

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

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

下面是我用从作业脚本执行我的平行[R脚本一个典型的mpirun命令:

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

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

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

+0

谢谢,我认为这个问题很可能是我没有使用mpirun(没有意识到这一点)。因此,使用mpirun的文档如下:#调用mpirun。 #注意:$ NSLOTS由OGS设置为N,即“-pe mpi_M_tasks_per_node N”选项请求的处理器数量 #。 #如果M = 4,则可能的N是:4,8,12,16,...。 。 。 #(见表2 Runningjobs页) 的mpirun -np $ NSLOTS mpi_program ARG1 ARG2 ..如果我想有降雪做一切对我的工作,我应该只是做-np 1? – user1480248

+1

@ user1480248正如我在更新的答复中提到,我想你需要使用“-np 1”降雪。基于Rmpi的软件包在使用MPI产卵方面非常不寻常,所以关于如何设置'-np'的通常建议是错误的。 –

+0

所以,如果我分配了16个计算节点,我想利用所有16​​个内核上的每个节点(该系统让我访问)的,如果我让CPU的< - mpi.universe.size(),它会运行在所有这些计算节点上并充分利用它们? – user1480248