使用Rmpi初始化MPI群集

时间:2015-05-26 23:03:22

标签: r mpi qsub snow

最近我尝试使用部门集群在R中进行并行计算。集群系统由SGE管理。 OpenMPI已安装并通过了安装测试。

我通过qsub命令将我的查询提交到集群。在脚本中,我通过以下命令指定要使用的节点数。
#PBS -l nodes=2:ppn=24 (two nodes with 24 threads each)
然后,mpirun -np 1 R --slave -f test.R
之后我检查了$PBS_NODEFILE。根据需要分配两个节点。我可以找到两个节点的名称node1, node2,每个节点出现24次。

`test.R`的内容如下所示。

library(Rmpi)
library(snow)

cl <- makeCluster(41,type="MPI")
clusterCall(cl, function() Sys.info()[c("nodename","machine")])
stopCluster(cl)
mpi.quit()

clusterCall()的输出非常令人失望。只有一个节点的名称node1出现41次。这绝对是错误的,因为node1上只有24个线程。我的R脚本似乎只找到一个节点甚至一个线程。我只是想知道构建MPI集群的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

首先,即使安装了后者,您的群集也绝对不会被SGE管理。 SGE不了解作业文件中的#PBS标记,并且它不会导出PBS_NODEFILE环境变量(SGE导出的大多数环境变量以SGE_开头)。它也不会接受nodes=2:ppn=24资源请求,因为分配的节点之间的时隙分配由指定的并行环境控制。您拥有的是PBS Pro或Torque。但是SGE将命令行实用程序命名为相同,qsub或多或少地使用相同的参数,这可能是您认为它是SGE的原因。

如果Open MPI无法从环境中正确获取节点列表,则通常会出现您所描述的问题。如果没有编译支持PBS Pro / Torque。在这种情况下,它将启动执行mpirun的节点上的所有MPI进程。通过运行:

检查是否编译了正确的RAS模块
ompi_info | grep ras

它应该列出各种RAS模块,其中应该是一个名为tm

的模块
...
MCA ras: tm (MCA v2.0, API v2.0, Component v1.6.5)
...

如果未列出tm模块,则Open MPI将不会自动获取节点列表,并且必须明确指定主机文件:

mpiexec ... -machinefile $PBS_NODEFILE ...

在PBS Pro / Torque下,Open MPI还需要tm PLM模块。缺少该模块将阻止Open MPI使用TM API远程启动第二个节点上的进程,因此它将回退到使用SSH。在这种情况下,您应该确保无密码SSH登录,例如一个使用公钥认证,可以从每个集群节点到另一个节点。

解决问题的第一步是检查是否存在正确的模块,如上所示。如果模块在那里,您应该在hostname下启动mpiexec并检查是否有效,例如:

#PBS -l nodes=2:ppn=24

echo "Allocated nodes:"
cat $PBS_NODEFILE
echo "MPI nodes:"
mpiexec --mca ras_base_display_alloc 1 hostname

然后比较两个列表并检查ALLOCATED NODES块。列表应该或多或少相等,并且两个节点都应该在分配的节点表中显示,每个节点有24个插槽(参见Num slots)。如果第二个列表只包含一个主机名,则Open MPI无法正确获取主机文件,因为有些东西阻止tm模块(假设它们存在)初始化或被选中。这可以是系统范围的Open MPI配置或具有更高优先级的某些其他RAS模块。将--mca ras_base_verbose 10传递给mpiexec有助于确定是否属于这种情况。

答案 1 :(得分:0)

-np 1调用的mpirun部分指示MPI仅使用一个核心。尝试删除该部分,以便OpenMPI从SGE设置的环境中获取核心数。