相关文章推荐
欢快的围巾  ·  张子豪 - 知乎·  1 年前    · 
愉快的柚子  ·  《Excel ...·  1 年前    · 
奔放的排球  ·  c# - Async ...·  1 年前    · 

将整个计算过程,写到脚本中,通过sbatch指令提交到计算节点上执行;

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

首先是一个简单的例子;

假设我们的计算过程为:在计算节点上运行 hostname 指令,那么就可以这么编写作业脚本;

#!/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       # 作业在调度系统中的作业名为myFirstJob;
--nodes=1           # 申请节点数为1,如果作业不能跨节点(MPI)运行, 申请的节点数应不超过1;
--ntasks-per-node=1 # 每个节点上运行一个任务,默认一情况下也可理解为每个节点使用一个核心,如果程序不支持多线程(如openmp),这个数不应该超过1;

-p \ 指定作业的运行分区,提交作业时必须指定分区,每个分区有不同的属性,如未名一号上C032M0128G分区,每个节点核心数为32,内存为128G,通过以下命令可以查看对应集群可用分区,也可以通过sinfo查看分区的空闲状态;

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, --ntasks=<number>    # sbatch并不会执行任务,当需要申请相应的资源来运行脚本,默认情况下一个任务一个核心,--cpus-per-task参数可以修改该默认值;
-c, --cpus-per-task=<ncpus>      # 每个任务所需要的核心数,默认为1;
--ntasks-per-node=<ntasks>    # 每个节点的任务数,--ntasks参数的优先级高于该参数,如果使用--ntasks这个参数,那么将会变为每个节点最多运行的任务数;
-o, --output=<filename pattern>    # 输出文件,作业脚本中的输出将会输出到该文件;
-p, --partition=<partition_names>    # 将作业提交到对应分区;
-q, --qos=<qos>    # 指定QOS;
-t, --time=<time>    # 允许作业运行的最大时间,目前未名一号和生科一号为5天,教学一号为两天;
-w, --nodelist=<node name list>  # 指定申请的节点;
-x, --exclude=<node name list>   # 排除指定的节点;

其中-A指定计费账户,每个上机账号至少关联一个缴费账户(项目负责人持有),用于作业计费,通常情况下,提交作业不需要指定账户,通过以下命令可以查询上机账号所关联的账户,如果一个上机账号对应了多个缴费账户,那么可以在提交作业时指定缴费账户;

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

接下来是一个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卡

最后是一个跨节点多核心的例子;

假设我们想用两个节点,每个节点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
# 生成 machinefile
srun hostname -s | sort -n >slurm.hosts
# 执行MPI并行计算程序
mpirun -n 64 -machinefile slurm.hosts vasp_std > log