首先,即使安装了 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 也需要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
有助于确定是否是这种情况。