提交作业
# 提交作业
# 批处理作业
如果没有交互需求,请使用 yhbatch 提交任务。yhbatch 提交的作业终端关闭时不会受到影响,登陆结点 down 机时也不会受到影响,强烈推荐使用 yhbatch 提 交任务。
yhbatch 向资源管理系统提交一个批处理脚本,yhbatch将在脚本成功提交到资源管理系统控制进程并分配作业JobID后立即退出。
批处理脚本可能不会被立刻分配资源,而是在排队作业队列中等待,直到资源需求得到满足。当批处理脚本被分配资源后,资源管理系统将在所分配的第一个结点上运行批处理脚本。
yhbatch 运行的主要格式如下:
yhbatch [options] program
yhbatch 包括多个选项,用户最常使用的选项如下:
- -n, --ntasks=ntasks : 指定要运行的进程数。请求 yhrun 分配/加载 ntasks 个进程。省缺的情况是每个 CPU 核运行一个进程,但是-c 参数将改变此省缺值。
- -N, --nodes=minnodes[-maxnodes] : 请求为此作业至少分配 minnodes 个结点。调度器可能决定在多于 minnodes 个结点上启动作业。可以通过指定 maxnodes 限制最多分配的结点数(如
-- nodes=2-4
)。最少和最多结点数可以相同以便指定确切的结点数(如--nodes=2-2
将请求两个并且仅仅两个结点)。如果没有指定-N,省缺的行为是分配足够的结点以满足-n 选项的要求。 - -p, --partition=partition : 从分区 partition 请求资源。如未指定,则省缺为默认分区。
- -t, --time=minutes : 设置作业的运行时间限制为 minutes 分钟。省缺值为分区的时间限制值。当到达时间限制时,作业的进程将被发送 SIGTERM 以及 SIGKILL 信号终止执行。完 整格式为--time=days-hours:minutes:seconds,建议包机时用户使用该选项。
- -D, --chdir=path : 加载的作业进程在执行前将工作目录改变到 path 。省缺情况下作业 yhrun 进 程的当前工作目录。
- -l, --label : 在标准输出/标准错误的每行之前添加任务号。通常,远程任务的标准输出和标准错误通过行缓冲直接传递到 yhrun 的标准输出和标准错误。--label 选项将在每行输出前面添加远程任务的 ID。
- -J, --job-name=jobname : 指定作业的名字。省缺值是可执行程序的名字 program 。
- -W, --wait=seconds : 指定在第一个任务退出后,到终止所有剩余任务之前的等待时间。0 表示无限等待(60 秒后将发出一个警告)。省缺值可由系统配置文件中的参数设置。此选项用于确保作业在一个或多个任务提前退出时能够及时终止。
- -w, --nodelist=nodelist|filename : 请求指定列表中的结点。分配给作业的将至少包含这些结点。nodelist 可以是逗号分割的结点列表或范围表达式(如 cn[1-5,7,12])。如果包含“/”字符,则nodelist 将会被当作是一个文件名,其中包含了所请求的结点列表。
- -x, --execlude=nodelist|filename : 排除指定列表中的结点。分配给作业的将不会包含这些结点。
以上选项中,由以 –N ,-n,-p,-w,-x
等选项最常用,-N
指定结点数,-n
指定进程数,-p
指定分区名,-w
指定结点列表,-x
指定不参加分配的结点列表(用于排除自己认为有问题的结点)。
用户在 yhbatch 的参数中指定资源分配的需求约束,编写的作业脚本中,也可以使用 yhrun 命令加载计算作业,此时 yhrun 通过环境变量感知已经分配了资源,从而直接创建作业而不再次提交作业。
批处理作业的脚本为一个文本文件,脚本第一行以“#!”字符开头,并制定脚本文件的解释程序,如 sh,bash,rsh ,csh 等。
这种作业提交方式,适合提交绝大多数作业。如果需要连续执行多个任务的作业,用户可以在脚本中提交多个任务,逐个计算。
如前所述,系统中作业的运行分成两步:资源分配与任务加载。批处理作业使用 yhbatch 提交脚本的方式运行,yhbatch 负责资源分配,yhbatch 获取资源后,会在获取资源的第一个结点运行提交的脚本。
若用户使用包机时分区(如 TH_SR, TH_SR1, TH_SR2),建议在提交作业时加入--time
选项,以限制作业运行的最长时间为指定时间,避免因作业错误计算或长期无人查看导致机时浪费的情况。
# 交互式作业提交
对于交互式作业,资源分配与任务加载两步均通过 yhrun 命令进行:当在登录 shell 中执行 yhrun 命令时,yhrun 首先向系统提交作业请求并等待资源分 配,然后在所分配的结点上加载作业任务。
yhrun 运行的主要格式如下:
yhrun [options] program
yhrun 包括多个选项,与 yhbatch 类似。只是 yhbatch 命令执行的是一个批处理脚本,而 yhrun 命令执行的是一个可执行的程序。用户可以通过 yhrun -h
查看相关选项。
特别注意
- yhrun 基本可以替代 mpirun,使用系统自带的 mpi 实现编译的程序,完全可以使用 yhrun 提交任务,而不需使用 mpirun。
- yhrun 为交互式作业提交方式,用户如需要和程序进行交互,则选择直接使用 yhrun 提交任务,如果不需要交互,则需使用批处理作业提交方式。
- yhrun 提交的任务,如果没有进行输入输出的重定向,在关闭登陆客户端软件时,会导致任务中断,因此如无特殊需要,在直接使用 yhrun 提交任务时,重定向输入输出,并保留相应的 log 文件,方便遇到问题时,技术人员及时解决。重定向举例如下:
yhrun -p TH_NET1 -N 10 -n 120 ./a.out >log 2>&1 &
为重定向符号,2>&1 表示标准错误输出重定向至标准输出,最后的&表示后台提交方式,这样保证了该任务在登陆客户端关闭时依然保持不中断。
- 再次提示,如无特殊需要请使用批处理作业 yhbatch 提交方式,yhbatch 提交的作业终端关闭后不会受到影响。
# 不同并行模式提举例
# MPI程序(系统MPI)
强烈推荐使用系统安装好的MPI版本,支持天河高速互联网络,速度快!
假设用户可执行文件为 a.out,需使用 24 个进程并行计算,编写提交脚本 sub.sh 如下:
#!/bin/bash
yhrun -n 24 -p debug a.out
2
提交批处理命令如下:
yhbatch -n 24 -p debug sub.sh
计算过程中,脚本所在的工作目录中默认会生成以 slurm 开头的 .out 文件,屏幕输出的信息会保存到该文件中。
警告
yhbatch 申请的资源必须不小于 sub.sh 脚本中 yhrun 申请的资源。
# MPI程序(用户自编MPI)
如果用户自行编译MPI并且没有支持slurm作业调度系统接口,那么在提交并行任务时,只能使用 mpirun
命令运行。举例如下:
如果用户需要使用请自行安装。假设用户 A 在个人目录下安装了 openmpi,使用 /vol6/home/A/openmpi
编译生成可执行程序 a.out,则编写脚本 sub.sh 如下:
#!/bin/bash
yhrun -n $SLURM_NPROCS -p debug /bin/hostname > hostlist
/vol6/home/A/openmpi/bin/mpirun -np $SLURM_NPROCS -hostfile hostlist ./a.out
2
3
用户根据该脚本,提交批处理命令如下:
yhbatch -n 24 -p debug ./sub.sh
# OpenMP程序
openMP 支持共享式内存并行,因此单纯的 openMP 多线程并行程序只能在单计算结点上运行。由于每个计算结点是 12 个处理器核心数,因此最大线程数设置 不能超过 12。
如果用户的程序支持该并行方式,若用户可执行文件为 a.out,需使用 12 个openMP 多线程并行计算。编写提交脚本 sub.sh 如下:
#!/bin/bash
export OMP_NUM_THREADS=12
yhrun -n 1 -c 12 -p debug a.out
2
3
提交批处理命令如下:
yhbatch -N 1 -n 1 -p debug ./sub.sh
# MPI+openMP程序
如果用户的程序支持该并行方式,若用户可执行文件为 a.out,需使用 24 个进程并行计算,每个进程下开启 6 个 openMP 线程,则应使用的计算结点数为
24*6/12=12
。编写提交脚本 sub.sh 如下:
#!/bin/bash
export OMP_NUM_THREADS=6
yhrun -N 12 -n 24 -c 6 -p debug a.out
2
3
提交批处理命令如下:
yhbatch -N 12 -n 24 -p debug ./sub.sh
注意:TH-1A 系统上的资源使用抢占式调度方式,即作业在结点上哪怕只运行了一个核的进程,其他作业也无法再分配到该结点上。
特别提示
批处理作业提交模式,试用范围很广,由于手册篇幅限制,不能详述,如果您在提交批处理作业的过程中遇到了任何问题,请联系中心技术人员。
# 实际应用提交举例
# GROMACS
第一步:加载gromacs
module add gromacs
第二步:编写提交脚本sub.sh, 写入
#!/bin/bash
yhrun -N 2 -n 24 -p debug gmx_mpi mdrun
2
第三部:提交任务, 在终端输入:
yhrun -N 2 -n 24 -p debug sub.sh
# LAMMPS
第一步:加载lammps
module add lammps
第二步:编写提交脚本sub.sh, 写入
#!/bin/bash
yhrun -N 2 -n 24 -p debug lmp_mpi < in.lj
2
第三部:提交任务, 在终端输入:
yhrun -N 2 -n 24 -p debug sub.sh