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)暂停其他类型的作业,则需要提供一个能够为每种作业类型实现正确信号的脚本。