MPI作业#
运行MPI作业时,节点与CPU应由SkyForm AIP调度获得,而不是在命令行中指定。当节点工作不正常或节点上CPU被其他作业占用时,作业会等待而不能及时运行。另外,由SkyForm AIP调度的MPI作业,当节点失败时,作业可以有选择地自动在其他节点上重启。所以,除非万不得已,MPI运行的节点应该由调度器来动态决定,而不是作业提交命令行中指定,或者在mpirun的命令行中指定。
可喜的是,很多常用的MPI能够自动识别AIP调度所分配的节点,用户的mpirun/mpiexec命令行可以变的很简单。
通过AIP运行MPI可以无需设置免密ssh,确保系统安全并省去不必要的设置和排错。除此之外,对于跨节点的MPI作业,AIP随时监控远程MPI任务的进程以及MPI任务进程的资源(CPU、内存、IO、文件读写、GPU等)使用情况,以便执行系统设置的资源使用上限。当用户需要杀掉MPI作业时,AIP也会保证自动清理远程MPI任务的所有进程。
AIP包含一个名为rsh的远程MPI任务分发和控制工具,该工具只能在AIP的作业中运行。MPI启动时只要定义使用rsh(而不是缺省的ssh)作为远程任务分发工具,就可以实现MPI进程在AIP里的资源使用监控和结束是的清理功能。
下表列出各种MPI与AIP的集成支持:
MPI |
MPI自 动识别AIP分配 的节点和CPU |
不 依赖免密ssh |
** 监控并在杀作业 是自动清理所有 MPI远程进程** |
---|---|---|---|
Intel MPI |
支持 |
支持 |
支持 |
MPICH |
支持 |
支持 |
支持 |
MVAPICH |
支持 |
支持 |
支持 |
OpenMPI |
MPI启动脚本 |
支持 |
支持 |
P latform/HP/IBM MPI |
MPI启动脚本 |
支持 |
支持 |
很多商业软件如Fluent、Abaqus、StarCCM+等内含Intel MPI,求解程序在AIP里可以实现深度集成。
提交MPI作业前先设置MPI环境,如使用module load或source环境文件。在提交前设置的环境会自动复制到作业运行的环境中。然后在作业提交命令中指定需要的资源。作业提交时的资源请求描述常用的两个参数
-n 指定CPU核数
-R span[ptile=x] 指定每个节点上的核数
例子:提交一个需要总数为128个核,每个节点上32个核的MPI作业 (LSF兼容命令,下同)。
module load mpi/mpich-x86_64
bsub -n 128 -R span[ptile=32] mpirun myprogram
以上例子中,mpirun的命令行中无需定义-hostfile、-machinefile、-np等不用调度器时必须定义的参数,MPI可以自动识别AIP为作业分配的节点和CPU。这样就不需要编写MPI作业提交命令。只要熟悉命令行就可以灵活的直接提交MPI。
-R参数定义AIP作业所需的资源,-R参数中的其他语法参考man csub里-R的说明。
备注
-R span[ptile=32]不是必须的,若不指定,AIP会先把一个节点的CPU分配完,然后再分配其他节点上的CPU。如bsub -n 64 的作业在每个节点含56个核的系统中会在第一个节点上分配56个核,在第二个节点上分配8个核。加上-R span[ptile=32]后就能保证两个节点上各分配32个核。
当作业运行后,“cjobs -l 作业号”可以看到mpirun通过AIP rsh启动远程任务的命令,如下方红框所示。

另外,通过命令“aip j i -p作业号”可以看到作业在每个节点给上每个进程的资源使用情况:
Intel MPI#
Intel MPI使用内置的Hydra分发和管理远程MPI任务。Hydra能自动识别AIP为作业分配的节点和CPU核。
备注
由于Intel MPI中Hydra的调度器集成bug,对于超过1024个核的MPI,需要使用AIP脚本impi-mpirun来替代mpirun。
例子:
bsub -n 1024 impi-mpirun myprogram
Intel MPI 2018和以前的版本#
Intel MPI 2018和以前的版本自动识别到AIP环境后,会自动使用AIP的远程任务分发工具(rsh)分发和管理远程MPI任务。为确认所有版本使用AIP的rsh为不是其他的工具,在mpirun命令行里定义rsh:
bsub -n 128 -R span[ptile=32] mpirun -bootstrap rsh myprogram
或者直接使用AIP脚本impi-mpirun代替mpirun:
bsub -n 128 -R span[ptile=32] impi-mpirun myprogram
Intel MPI 2019、2020和Intel oneAPI#
Intel MPI 2019以后的版本指定远程进程控制工具的参数略有变化,为-launcher。在mpirun命令行里定义rsh:
bsub -n 128 -R span[ptile=32] mpirun -launcher rsh myprogram
或者直接使用AIP脚本impi-mpirun代替mpirun:
bsub -n 128 -R span[ptile=32] impi-mpirun myprogram
MPICH和MVAPICH#
备注
由于Hydra的调度器集成bug,对于超过1024个核的MPI,需要使用AIP脚本impi-mpirun来替代mpirun。例子:csub -n 1024 impi-mpirun myprogram
与Intel MPI 2019一样,使用-launcher指定rsh。
bsub -n 128 -R span[ptile=32] mpirun -launcher rsh myprogram
或者直接使用AIP脚本impi-mpirun代替mpirun:
bsub -n 128 -R span[ptile=32] impi-mpirun myprogram
OpenMPI和Platform/HP/IBM MPI#
这几种MPI需要编写作业脚本,把AIP分配的节点名转换生成host文件,并告诉mpirun总核数。以下的例子为名字是ompi的脚本。这个脚本可用于OpenMPI、Platform/HP/IBM MPI。
#!/bin/bash
# For running OpenMPI, IBM MPI in SkyForm AIP
WORKDIR=`dirname ${CB_JOBFILENAME}`
rm -f ${WORKDIR}/mpi_machines.* # cleanup previous mpi_machines files
MACHFILE=${WORKDIR}/mpi_machines.${CB_JOBID}
# Make the Open MPI machine file by the using AIP tool
hostlist -o > ${MACHFILE}
mpirun -np $CB_DJOB_NUMPROC -machinefile ${MACHFILE} \
--mca plm_rsh_agent rsh $*
以上脚本中,红色部分是指定总核数,蓝色部分是指定运行节点,橙色部分是指定使用AIP的rsh。
提交作业命令:
bsub -n 128 -R span[ptile=32] ./ompi myprogram
AIP里面包含了脚本ompi-mpirun实现以上的功能,可以用于作业提交:
bsub -n 128 -R span[ptile=32] ompi-mpirun myprogram
MPI和OpenMP混合作业#
若MPI的任务进程是多线程的OpenMP,提交作业时需要定义3个参数
(1)-n m参数制定作业总CPU核数,m值等于:
节点数 * 每节点任务数 * 每任务CPU核数
(2)-R spen[ptile=x] 其中x为每个节点上的分配的核数,等于:
每节点任务数 * 每任务CPU核数
(3)-ENV OMP_NUM_THREADS=y其中 y值等于:每任务CPU核数
例子:
bsub -n 128 -ENV OMP_NUM_THREADS=8 -R span[ptile=32] ompi-mpirun ./myprog
这个OpenMPI作业一共用4个节点,每个节点上4个任务,每个任务8个核。
使用SLURM兼容命令提交MPI作业#
SkyForm AIP提供与SLURM兼容的作业提交命令,支持一部分SLURM常用参数,例子:
sbatch
#!/bin/bash
#SBATCH --ntasks-per-node=4
#SBATCH --ntasks=16
#SBATCH --cpus-per-task=8
ompi-mpirun ./myprog
