使用 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
有助于确定是否属于这种情况。
最近在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
有助于确定是否属于这种情况。