跳转至

sbatch

sbatch 指令用于提交作业,用户先将计算过程写成脚本文件,再通过 sbatch 指令提交。

为什么需要通过 sbatch 提交作业

高性能计算集群将众多服务器组成的一个系统,用户登录集群后,是在登录节点上,必须通过作业调度系统申请指定的计算资源,将计算过程提交到指定计算节点上运行。

先介绍一个简单的例子,随后介绍例子中涉及的参数,接着介绍sbatch其他一些常见参数,最后再介绍GPU和MPI跨节点作业案例。

使用案例

单节点单核心案例

job.sh
#!/bin/bash
#SBATCH -o job.%j.out
#SBATCH -p C032M0128G
#SBATCH --qos=low
#SBATCH -J myFirstJob
#SBATCH --nodes=1 
#SBATCH --ntasks-per-node=1

hostname

假如上面作业脚本的文件名为 job.sh,通过以下命令提交:

sbatch job.sh

上面脚本中参数作用为:

-o job.%j.out       # 脚本执行的输出将被保存在当 job.%j.out 文件下,%j 表示作业号;
-p C032M0128G       # 作业提交的指定分区为 C032M0128G,不通集群分区不同;
--qos=low           # 指定作业的 QOS 为 low,不同优先级排队快慢村子啊区别 ;
-J myFirstJob       # 作业在调度系统中的显示的作业名,这里定义Wie myFirstJob;
--nodes=1           # 申请节点数为 1, 如果作业不能跨节点(MPI)运行, 申请的节点数应不超过 1;
--ntasks-per-node=1 # 每个节点上运行一个任务,默认一情况下也可理解为每个节点使用一个核心,
                    # 如果程序不支持多线程(如openmp),这个数不应该超过1;

其中,有几个参数需要根据集群的具体情况指定:

-p <partition> 用于指定作业的运行分区,提交作业时需要指定计算节点的分区,不同分区有不同的属性,如未名一号上 C032M0128G 分区,每个节点核心数为 32,内存为 128G,通过以下命令可以查看对应集群的可用分区:

sacctmgr show ass user=`whoami` format=part | uniq

--qos 用于指定作业的服务质量 ,不同 qos,作业排队的优先级和收费也不同,通过以下命令可以查询 每个用户在每个分区下可用的 qos:

sacctmgr show ass user=`whoami`  format=user,part,qos

通过以上命令可以查看不同 qos 作业优先级大小、作业允许最大运行时间、每个用户最多可提交作业数、最多可用核心数等。

除此之外,还有一些常见的参数:

--help                      # 显示帮助信息;
-A <account>                # 指定计费账户;
-D, --chdir=<directory>     # 指定工作目录;
--get-user-env              # 获取当前的环境变量;
--gres=<list>               # 使用gpu这类资源,如申请两块gpu则--gres=gpu:2
-J, --job-name=<jobname>    # 指定该作业的作业名;
--mail-type=<type>          # 指定状态发生时,发送邮件通知,
                            # 有效种类为(NONE, BEGIN, END, FAIL, REQUEUE, ALL);
--mail-user=<user>          # 发送给指定邮箱;
-N, --nodes=<nymber>        # 申请的节点数,默认为1,程序不支持跨节点的情况下不应超过 1 ;
-n, --ntasks=<number>       # sbatch并不会执行任务,当需要申请相应的资源来运行脚本,
                            # 默认情况下一个任务一个核心,--cpus-per-task参数可以修改该默认值;
-c, --cpus-per-task=<ncpus> # 每个任务所需要的核心数,默认为1;
--ntasks-per-node=<ntasks>  # 每个节点的任务数,--ntasks参数的优先级高于该参数,
                            # 如果使用--ntasks这个参数,那么将会变为每个节点最多运行的任务数;
-o, --output=<filename>     # 输出文件,作业脚本中的输出将会输出到该文件;
-p, --partition=<partition> # 将作业提交到对应分区;
-q, --qos=<qos>             # 指定QOS;
-t, --time=<time>           # 允许作业运行的最大时间,目前未名一号和生科一号为5天,教学一号为两天;
-w, --nodelist=<nodes>      # 指定申请的节点;
-x, --exclude=<nodes>       # 排除指定的节点;

注意

上述参数中,-A 用于指定作业的计费账户,正常情况是不需要指定的,也不推荐用户指定作业的计费账户,这是因为很多用户不了解自己的计费账户,指定计费账户反而会导致作业提交失败,只有这种情况下需要指定:那就是一个学生(上机账号),同时关联到了多个项目负责人的计费账户下。以下命令查询自己可用的计费账户:

sacctmgr show ass user=`whoami` format=account%15 |uniq

单节点 GPU 案例

以下脚本为 GPU 作业的使用案例,假设我们想要申请一块 GPU 卡,并通过指令 nvidia-smi 来查看申请到 GPU 卡的信息,那么可以这么编写作业脚本:

#!/bin/bash
#SBATCH -o job.%j.out
#SBATCH --partition=GPU
#SBATCH --qos=low
#SBATCH -J myFirstGPUJob
#SBATCH --nodes=1             
#SBATCH --ntasks-per-node=6
#SBATCH --gres=gpu:1             

nvidia-smi

脚本中的一些参数说明如下

#SBATCH --partition=GPU      # 作业提交的指定分区为GPU;
#SBATCH --gres=gpu:1         # 每个节点上申请一块GPU卡

并不是所有的分区或节点都有 GPU 卡,可以通过以下命令查看哪些分区有 GPU 卡、分区中每个节点有多少块卡:

sinfo -o "%P %G" | grep "gpu"

警告

通常情况下,分区是具有相同硬件属性节点的集合,但并不是绝对的,比如通过以上指令查询时可能发现,一个分区中可能出现单节点 4 块 GPU 卡和单节点 3 块GPU卡的情况,这种现象是正常的,只不你在该分区申请 4 块卡时,你的作业不会被分配到 3 块卡的节点上。

多节点多核心案例

假设我们想用两个节点,每个节点32个核心来运行 vasp,那么可以这么编写作业脚本:

未名一号环境
#!/bin/bash
#SBATCH -o job.%j.out
#SBATCH --partition=C032M0128G
#SBATCH --qos=low
#SBATCH -J myFirstMPIJob
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=32

# 导入 MPI 运行环境
module load intel/2017.1

# 导入 MPI 应用程序
module load vasp/5.4.4-intel-2017.1

# 执行 MPI 并行计算程序
mpirun -n 64 vasp_std > log

其他使用技巧

申请资源量参数

申请多少资源涉及到的的参数有:

-n, --ntasks=<number>           # 最多运行几个任务
-N, --nodes=<nymber>            # 申请几个节点  
--ntasks-per-node=<ntasks>      # 每个节点运行几个任务
-c, --cpus-per-task=<ncpus>     # 每个任务使用几个核心,默认每个任务 1 个核心

这些参数默认都是 1 ,即如果都不指定的话,作业调度系统会分配一个节点,一个核心去运行任务;

-N 加上 --ntasks-per-node 的优先级高于 -n, 如:

#!/bin/bash
#SBATCH -n 60
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=32

这个例子中,通过 -n 申请了 60 个核心(每个任务一个核心),但是又用过 -N 和 --ntasks-per-node 申请了 64 个核心(每个任务一个核心),这时候因为后者的优先级高,所以最终结果是,申请 2 个节点,每个节点 32 个核心。

总结: 通常情况下建议用户通过 -N 和 --ntasks-per-node 这两个参数申请资源。

警告

对于不支持跨节点(通常情况下为使用 mpirun 执行的程序)的任务,申请的节点数不能大于 1

关于核心与内存

通过以下指令可以查询现有分区,以及每个分区可以申请多少个 CPU 核心和多少内存:(分区中如果出现星号,表示分区为默认分区,即提交作业不指定分区时会被提交到默认分区)

sinfo -o "%P %m %c"

比如在未名一号中,C032M0128G 分区可查到,节点可用 124000M,32个 CPU 核心,因此如果在该分区申请一个核心的话,可用的内存为大概 4G,如果作业在运行的时候出现内存超了,如 OMM kill,这时候就需要多申请核心,或者换到单节点更大内存的分区上执行。

申请 GPU 注意事项

警告

申请 GPU 时需要注意,GPU 分区上的 GPU 卡和 CPU 核心数量是绑定的,比如未名二号的 GPU40G 分区,单节点是 4 块 GPU 卡 64 个 CPU 核心,那么申请一个 GPU 卡的同时,最多能申请 16 个 CPU 核心,如果申请 17 个 CPU 核心,会按照两块 GPU 卡进行收费。