10.10. 使用Grid Engine启动

Open MPI 支持包括Sun Grid Engine (SGE)、Oracle Grid Engine (OGE)、Grid Engine (GE)、Son of Grid Engine等在内的运行时调度器系列。

除非特指Grid Engine家族中的某个具体版本,否则本文档将统一使用"Grid Engine"来指代所有这些版本。

10.10.1. 验证Grid Engine支持

重要

要在Open MPI中构建Grid Engine支持,您需要通过Open MPI的configure脚本显式地使用--with-sge命令行开关来请求SGE支持。

要验证您的Open MPI安装是否配置了Grid Engine支持,请运行prte_info如下所示,并查找gridengine

shell$ prte_info | grep gridengine
              MCA ras: gridengine (MCA v2.0, API v2.0, Component v1.3)

注意

PRRTE是为Open MPI提供运行时环境支持的软件层。Open MPI通常对终端用户隐藏了大部分PMIx和PRRTE的细节,但在这里Open MPI无法掩盖是PRRTE而非Open MPI本身提供这一功能的事实。因此,用户需要使用prte_info命令来检查Grid Engine支持(而非ompi_info)。

10.10.2. 启动

当包含Grid Engine支持时,Open MPI会自动检测是否在SGE环境中运行,并执行"正确的操作"。

具体来说,如果在Grid Engine作业中执行mpirun命令,它将自动使用Grid Engine机制来启动和终止进程。无需指定运行节点——Open MPI会直接从Grid Engine获取这些信息,并默认使用与指定槽位数相等的进程数。例如,以下命令将在Grid Engine分配的节点上运行4个MPI进程:

# Get the environment variables for Grid Engine

# (Assuming Grid Engine is installed at /opt/sge and $Grid
# Engine_CELL is 'default' in your environment)
shell$ . /opt/sge/default/common/settings.sh

# Allocate an Grid Engine interactive job with 4 slots from a
# parallel environment (PE) named 'ompi' and run a 4-process Open
# MPI job
shell$ qrsh -pe ompi 4 -b y mpirun -n 4 mpi-hello-world

在Grid Engine下还有其他提交作业的方式:

# Submit a batch job with the 'mpirun' command embedded in a script
shell$ qsub -pe ompi 4 my_mpirun_job.csh

# Submit a Grid Engine and OMPI job and mpirun in one line
shell$ qrsh -V -pe ompi 4 mpirun hostname

# Use qstat(1) to show the status of Grid Engine jobs and queues
shell$ qstat -f

关于设置,请确保您已定义了一个并行环境(PE)用于提交并行作业。您不必将PE命名为"ompi"。以下示例展示了一个名为"ompi"的PE,其配置如下:

shell$ qconf -sp ompi
   pe_name            ompi
   slots              99999
   user_lists         NONE
   xuser_lists        NONE
   start_proc_args    NONE
   stop_proc_args     NONE
   allocation_rule    $fill_up
   control_slaves     TRUE
   job_is_first_task  FALSE
   urgency_slots      min
   accounting_summary FALSE
   qsort_args         NONE

注意

qsort_args 在Son of Grid Engine发行版8.1.1及更高版本中是必需的,可能仅适用于该版本。

注意

对于非常旧版本的Sun Grid Engine,也请省略accounting_summary

您可能需要调整其他参数,但关键的是control_slaves,它指定了环境具有"紧密集成"特性。还需注意这里没有启动或停止流程。紧密集成意味着mpirun会自动获取槽位计数作为默认值替代-n参数,自动获取主机文件,通过qrsh生成远程进程以便Grid Engine能控制和监控它们,并创建和销毁每个作业的临时目录($TMPDIR),Open MPI的目录默认将在此创建。

请确保队列将使用您指定的PE:

shell$ qconf -sq all.q
[...snipped...]
pe_list               make cre ompi
[...snipped...]

要确定Grid Engine并行作业是否成功启动到远程节点,您可以在mpirun中传入MCA参数--mca plm_base_verbose 1

这将在用于向远程Grid Engine执行主机发送并行任务的qrsh -inherit命令中添加一个-verbose标志。它将显示与远程主机的连接是否成功建立。

错误

待办事项:这个网站还在运行吗?看起来不像.. Jeff在2021年12月31日给Dave Love发邮件询问这个URL是否仍然正确。

2022年3月更新:这个网站似乎已经不再适用了。或许可以改用https://github.com/grisu48/gridengine替代...?

各种Grid Engine文档及相关资源可在Son of GridEngine站点获取,配置指南详见Son of GridEngine配置教程站点

10.10.3. Grid Engine 对 qsub -notify 标志的紧密集成支持

如果您运行的是SGE 6.2 Update 3或更高版本,则支持-notify标志。如果您运行的是较早版本,则-notify标志将不起作用,使用它会导致作业被终止。

要使用-notify,必须格外小心。首先,让我们回顾一下-notify的功能。以下是qsub手册页中关于-notify标志的摘录。

当设置-notify标志时,Sun Grid Engine会在向运行中的作业发送实际信号前先发送警告信号。如果即将发送SIGSTOP信号,作业会在SIGSTOP到达前几秒收到SIGUSR1信号。如果即将发送SIGKILL信号,作业会在SIGKILL到达前几秒收到SIGUSR2信号。这个时间延迟量由每个队列配置中的notify参数控制。

假设您想使用-notify标志的原因是为了在收到SIGTSTP信号前先获取SIGUSR1信号。可以使用类似这样的批处理脚本:

#! /bin/bash
#$ -S /bin/bash
#$ -V
#$ -cwd
#$ -N Job1
#$ -pe ompi 16
#$ -j y
#$ -l h_rt=00:20:00
mpirun -n 16 -mca orte_forward_job_control 1 mpi-hello-world

错误

Ralph: orte_forward_job_control 还存在吗?

然而,为了使脚本正常工作,必须对其做出以下两项修改之一。默认情况下,SIGUSR1信号会终止shell脚本的运行。因此我们需要确保这种情况不会发生。以下是其中一种处理方法:

#! /bin/bash
#$ -S /bin/bash
#$ -V
#$ -cwd
#$ -N Job1
#$ -pe ompi 16
#$ -j y
#$ -l h_rt=00:20:00
exec mpirun -n 16 -mca orte_forward_job_control 1 mpi-hello-world

或者,可以在脚本中捕获信号,而不是在mpirun上执行exec操作:

#! /bin/bash
#$ -S /bin/bash
#$ -V
#$ -cwd
#$ -N Job1
#$ -pe ompi 16
#$ -j y
#$ -l h_rt=00:20:00

function sigusr1handler()
{
    echo "SIGUSR1 caught by shell script" 1>&2
}

function sigusr2handler()
{
    echo "SIGUSR2 caught by shell script" 1>&2
}

trap sigusr1handler SIGUSR1
trap sigusr2handler SIGUSR2

mpirun -n 16 -mca orte_forward_job_control 1 mpi-hello-world

10.10.4. Grid Engine 作业挂起/恢复支持

要暂停作业,您需要向mpirun发送SIGTSTP信号(而非SIGSTOP)。mpirun会捕获该信号并将其作为SIGSTOP信号转发给mpi-hello-world。要恢复作业,则向mpirun发送SIGCONT信号,该信号将被捕获并转发给mpi-hello-world

默认情况下,此功能未启用。这意味着SIGTSTP和SIGCONT信号将仅由mpirun进程处理。若要将这些信号转发,您需要使用--mca orte_forward_job_control 1参数运行作业。以下是一个Solaris系统上的示例:

错误

待办事项 Ralph: orte_forward_job_control 是否仍然存在?

shell$ mpirun -mca orte_forward_job_control 1 -n 2 mpi-hello-world

在另一个窗口中,我们暂停并继续该作业:

shell$ prstat -p 15301,15303,15305
   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
 15305 rolfv     158M   22M cpu1     0    0   0:00:21 5.9% mpi-hello-world/1
 15303 rolfv     158M   22M cpu2     0    0   0:00:21 5.9% mpi-hello-world/1
 15301 rolfv    8128K 5144K sleep   59    0   0:00:00 0.0% mpirun/1

shell$ kill -TSTP 15301
shell$ prstat -p 15301,15303,15305
   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
 15303 rolfv     158M   22M stop    30    0   0:01:44  21% mpi-hello-world/1
 15305 rolfv     158M   22M stop    20    0   0:01:44  21% mpi-hello-world/1
 15301 rolfv    8128K 5144K sleep   59    0   0:00:00 0.0% mpirun/1

shell$ kill -CONT 15301
shell$ prstat -p 15301,15303,15305
   PID USERNAME  SIZE   RSS STATE  PRI NICE      TIME  CPU PROCESS/NLWP
 15305 rolfv     158M   22M cpu1     0    0   0:02:06  17% mpi-hello-world/1
 15303 rolfv     158M   22M cpu3     0    0   0:02:06  17% mpi-hello-world/1
 15301 rolfv    8128K 5144K sleep   59    0   0:00:00 0.0% mpirun/1

请注意,以上操作仅会停止mpi-hello-world进程。例如,当作业处于挂起状态时,它并不会释放任何固定的内存。

要在Grid Engine环境下使其正常工作,您需要修改队列中的suspend_method条目。必须将其设置为SIGTSTP。以下是一个队列配置示例。

shell$ qconf -sq all.q
qname                 all.q
[...snipped...]
starter_method        NONE
suspend_method        SIGTSTP
resume_method         NONE

请注意,如果您需要在此队列中使用SIGSTOP(而非SIGTSTP)暂停其他类型的作业,则需要提供一个能够为每种作业类型实现正确信号的脚本。