使用 Rmpi​​ 初始化 MPI 集群

Initialize MPI cluster using Rmpi

最近在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 集群的正确方法是什么?

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

首先,即使安装了SGE,你的集群也绝对不是由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不会自动获取节点列表,必须显式指定hostfile:

mpiexec ... -machinefile $PBS_NODEFILE ...

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

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

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