【问题标题】:Initialize MPI cluster using Rmpi使用 Rmpi​​ 初始化 MPI 集群
【发布时间】:2015-08-08 19:54:27
【问题描述】:

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

【问题讨论】:

  • 您的集群由 PBSPro 或 Torque 管理。尽管 SGE 中的许多命令名称相同(qsubqstat 等),但 SGE 不使用 #PBS 标记,而是使用 #$,并且它导出的环境变量以 SGE_ 开头。
  • 您的脚本和启动命令适用于 LSF。确保 MPI 库正确获取环境。从批处理脚本中运行以下命令:mpiexec hostname 并查看它是否输出与 $PBS_NODEFILE 中包含的相同主机名和相同次数。 Open MPI 和 PBS/Torque 之间的集成可能存在问题。

标签: r mpi qsub snow


【解决方案1】:

首先,即使安装了 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 登录,例如一个使用公钥认证,可以从每个集群节点到其他节点。

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

【讨论】:

  • 很好的答案!事实证明,Open MPI 没有正确获取节点列表。这主要是由于权限问题。谢谢。
【解决方案2】:

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

【讨论】:

  • Open MPI 总是从 DRM 环境接收完整的插槽分配信息。 -np 1 仅指示它使用单个插槽来启动初始 MPI 作业。
  • 我同意@HristoIliev。有关于这个-np 选项的讨论。还是谢谢。
猜你喜欢
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 2021-07-28
  • 2012-06-05
  • 2020-12-07
相关资源
最近更新 更多