0

最近尝试利用部门集群做并行计算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 次。这绝对是错误的,因为只有 24 个线程node1。看来我的R脚本只能从中找到一个节点甚至一个线程。我只是想知道构建MPI集群的正确方法是什么?

4

2 回答 2

2

首先,即使安装了 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 不会自动获取节点列表,必须显式指定主机文件:

mpiexec ... -machinefile $PBS_NODEFILE ...

在 PBS Pro/Torque 下,Open MPI 也需要tmPLM 模块。缺少该模块将阻止 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 10mpiexec有助于确定是否是这种情况。

于 2015-05-27T11:22:49.980 回答
0

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

于 2015-05-26T23:41:27.133 回答