slurm 使用

龙讯旷腾大约 5 分钟

slurm 使用

使用环境

用户注册, 登录 mcloud 后:

  • 测试 slurm 资源调度
srun -p 3080ti --mem=1 --time=1 --gres=gpu:1 hostname
sbatch -p 3080ti --mem=1 --time=1 --gres=gpu:1 --output=%j.out --error=%j.err --wrap="hostname"

--mem=1 请求 1 MB 内存

--time=1 作业总的运行时间限制为 1 分钟

--gres=gpu:1 请求 1 块 gpu 卡

hostname 为要执行的作业命令

--output=%j.out 为作业的输出

--error=%j.err 为作业的错误输出

  • 查看存储空间
[pengg@login ~]$ mmlsquota --block-size auto
                         Block Limits                                    |     File Limits
Filesystem type         blocks      quota      limit   in_doubt    grace |    files   quota    limit in_doubt    grace  Remarks
hpc        USR          17.95M       500G       800G          0     none |       45       0        0        0     none

其中: 软限制为: 500G, 硬限制为 800G

  • 软件环境

集群预装了大量软件,通过 module 来管理, 用户也可以在自己家目录下安装其它软件

[pengge@login ~]$ module ava

------------------------------------------------------------------------------------------------------------------------- /share/app/modulefiles -------------------------------------------------------------------------------------------------------------------------
atat/3.36                   calypso_pwmat_interface/2.0 cuda/11.3                   emc/1.0                     intel/2016                  nvhpc-byo-compiler/22.2     pwmat/2022.01.30            pwmat/2022.03.29            python/3.8.3
Auger_Decay_Rate/latest     Cross_Section/latest        cuda/11.6                   gui/2022.03.03              intel/2020                  nvhpc-nompi/22.2            pwmat/2022.02.28            pwmat/2022.04.22
bandup/latest               cuda/10.1                   disorder/latest             gui/2022.04.08              lammps/29Sep2021            openmpi/2.1.0               pwmat/2022.03.02            pypwmat/1.0.9               yambo/4.3.0
Boltzman-NAMD/latest        cuda/11.0                   ELPWmat/1.0.0               gui/test                    nvhpc/22.2                  plot_interp_2nd/latest      pwmat/2022.03.25            python/2.7.15

---------------------------------------------------------------------------------------------------------------- /share/app/intel/oneapi/2022/modulefiles ----------------------------------------------------------------------------------------------------------------
advisor/2022.0.0             compiler32/2022.0.2          debugger/2021.5.0            dnnl-cpu-iomp/2022.0.2       icc/2022.0.2                 intel_ippcp_ia32/2021.5.1    itac/2021.5.0                oclfpga/2022.0.2             vtune/2022.0.0
advisor/latest               compiler32/latest            debugger/latest              dnnl-cpu-iomp/latest         icc/latest                   intel_ippcp_ia32/latest      itac/latest                  oclfpga/latest               vtune/latest
ccl/2021.5.1                 compiler-rt/2022.0.2         dev-utilities/2021.5.2       dnnl-cpu-tbb/2022.0.2        icc32/2022.0.2               intel_ippcp_intel64/2021.5.1 mkl/2022.0.2                 tbb/2021.5.1
ccl/latest                   compiler-rt/latest           dev-utilities/latest         dnnl-cpu-tbb/latest          icc32/latest                 intel_ippcp_intel64/latest   mkl/latest                   tbb/latest
clck/2021.5.0                compiler-rt32/2022.0.2       dnnl/2022.0.2                dpct/2022.0.0                init_opencl/2022.0.2         intel_ipp_ia32/2021.5.2      mkl32/2022.0.2               tbb32/2021.5.1
clck/latest                  compiler-rt32/latest         dnnl/latest                  dpct/latest                  init_opencl/latest           intel_ipp_ia32/latest        mkl32/latest                 tbb32/latest
compiler/2022.0.2            dal/2021.5.3                 dnnl-cpu-gomp/2022.0.2       dpl/2021.6.0                 inspector/2022.0.0           intel_ipp_intel64/2021.5.2   mpi/2021.5.1                 vpl/2022.0.0
compiler/latest              dal/latest                   dnnl-cpu-gomp/latest         dpl/latest                   inspector/latest             intel_ipp_intel64/latest     mpi/latest                   vpl/latest

slurm 使用

资源请求


--ntasks-per-node 或 -N  # Slurm Node = Physical node

--ntasks-per-socket      # Slurm Socket = Physical Socket/CPU/Processor

-c, --cpus-per-task      # Slurm CPU = Physical CORE
OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK:-1} # Default to 1 if SLURM_CPUS_PER_TASK not set

资源一:
--nodes=2 --gres=gpu:2   # 请求 2 个节点, 每个节点 2块 gpu 卡, 总请求 4 块 gpu 卡

资源二:
#SBATCH --partition=cpu      # 使用 cpu 队列
#SBATCH --nodes=2            # 需要 2 个节点
#SBATCH --ntasks=4           # 共需要 4 个 cpu 进程, 缺省每个进程 1个核, 共需要 4个 cpu 核
#SBATCH --ntasks-per-node=2  # 每个节点 2 个 cpu 进程

资源三:
#SBATCH --partition=cpu      # 使用 cpu 队列
#SBATCH --nodes=2            # 需要 2 个节点
#SBATCH --ntasks=4           # 共需要 4 个 cpu 进程, 每个进程 32 个核, 共需要 128 个 cpu 核
#SBATCH --ntasks-per-node=2  # 每个节点 2 个 cpu 进程
#SBATCH --cpus-per-task=32   # 每个 cpu 进程需要 32 个核
OMP_NUM_THREADS=32           # openmp 配置

资源四:
#!/bin/sh
#SBATCH --partition=3090     # 使用 3090 队列
#SBATCH --job-name=pwmat
#SBATCH --nodes=1            # 使用 1 个节点
#SBATCH --ntasks-per-node=4  # 每个节点 4 个 cpu 核 (缺省每个进程 1个核)
#SBATCH --gres=gpu:4         # 每个节点使用 4 块 gpu 卡
#SBATCH --gpus-per-task=1    # 每个 cpu 核 使用 1 块 gpu 卡

module load intel/2020
module load cuda/11.6
module load pwmat/2022.01.30

mpirun -np $SLURM_NPROCS -iface ib0 PWmat | tee output

资源五:
#!/bin/bash
#SBATCH -N 1
#SBATCH -n  96
#SBATCH --ntasks-per-node=96
#SBATCH --partition=9242
#SBATCH --output=%j.out
#SBATCH --error=%j.err
source /data/app/intel/bin/compilervars.sh intel64
ulimit -s unlimited
export PATH=/data/app/vasp.5.4.4/bin:$PATH
#!/bin/bash

#SBATCH --job-name=sim_1        # job name (default is the name of this file)
#SBATCH --output=log.%x.job_%j  # file name for stdout/stderr (%x will be replaced with the job name, %j with the jobid)
#SBATCH --time=1:00:00          # maximum wall time allocated for the job (D-H:MM:SS)
#SBATCH --partition=gpXY        # put the job into the gpu partition
#SBATCH --exclusive             # request exclusive allocation of resources
#SBATCH --mem=20G               # RAM per node
#SBATCH --threads-per-core=1    # do not use hyperthreads (i.e. CPUs = physical cores below)
#SBATCH --cpus-per-task=4       # number of CPUs per process

## nodes allocation
#SBATCH --nodes=2               # number of nodes
#SBATCH --ntasks-per-node=2     # MPI processes per node

## GPU allocation - variant A
#SBATCH --gres=gpu:2            # number of GPUs per node (gres=gpu:N)

## GPU allocation - variant B
## #SBATCH --gpus-per-task=1       # number of GPUs per process
## #SBATCH --gpu-bind=single:1     # bind each process to its own GPU (single:<tasks_per_gpu>)

# start the job in the directory it was submitted from
cd "$SLURM_SUBMIT_DIR"

# program execution - variant 1
mpirun ./sim

# program execution - variant 2
#srun ./sim

交互式作业

方法一:

srun  --time=00:10:00 --mem=200 --gres=gpu:1 --pty /bin/bash
echo $SLURM_NODELIST

方法二:

salloc -p cpu -N 1 -n 6 -t 2:00:00 # salloc
#申请成功后会返回申请到的节点和作业ID等信息,假设申请到的是 cn1 节点,作业ID为 12667
ssh cn1           # 直接登录到刚刚申请到的节点 cn1 调试作业
scancel 12667     # 计算资源使用完后取消作业
squeue -j 12667   # 查看作业是否还在运行,确保作业已经退出

或:

salloc  --time=01:00:00 --mem=500 --gres=gpu:2
srun --pty /bin/bash
scancel JOBID

批处理作业

编写作业脚本 pwmat.sh

#!/bin/sh
#SBATCH --partition=3090
#SBATCH --job-name=pwmat
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=4
#SBATCH --gres=gpu:4
#SBATCH --gpus-per-task=1

module load intel/2020
module load cuda/11.6
module load pwmat/2022.01.30

mpirun -np $SLURM_NPROCS -iface ib0 PWmat | tee output

提交作业

sbatch pwmat.sh

作业监控

squeue
scontrol show --detail jobid=<JobID>

查看完成的作业

sacct
sacct -j <JobID> --format=User,JobID,Jobname,partition,state,time,start,end,elapsed,MaxRss,MaxVMSize

sacct  --starttime=2022-01-1 --endtime=2022-05-1
sacct  --starttime=2022-01-1 --endtime=2022-05-1 --format=User,JobID,Jobname,partition,state,time,start,end,elapsed,MaxRss,MaxVMSize
sacct --help

作业修改

  • 更改作业属性
#增加作业时间限制
scontrol update JobId=$JobID timelimit=<new timelimit>

#更改作业依赖
scontrol update JobId=$JobID_1 dependency=afterany:$JobID_2
  • 控制作业
scontrol hold <job_id>     # 防止挂起作业, 获得调度机会, 开始执行
scontrol release <job_id>  # 把原来 'hold' 状态的排队作业, 释放出来
scontrol requeue <job_id>  # 取消作业, 重新排队
  • 取消作业
scancel <job_id>   # 取消运行或挂起的作业
scancel -u <user>  # 取消用户所有的作业, 包括运行的作业
scancel -u <user> --state=PENDING # 取消用户所有挂起的作业

slurm 环境变量

变量描述
$SLURM_JOB_ID此作业 JobID
$SLURM_SUBMIT_DIR作业提交目录的路径
$SLURM_SUBMIT_HOST作业提交节点的主机名
$SLURM_JOB_NODELIST分配给作业的节点列表
$SLURM_GPUS分配 GPUs 数量
$SLURM_MEM_PER_GPU每个 GPU 内存
$SLURM_MEM_PER_NODE每个节点的内存 Same as --mem
$SLURM_NTASKSSame as --ntasks. The number of tasks.
$SLURM_NTASKS_PER_GPUNumber of tasks requested per GPU.
$SLURM_NTASKS_PER_NODENumber of tasks requested per node.
$SLURM_NTASKS_PER_CORENumber of tasks requested per core.
$SLURM_NPROCSSame as --ntasks. See $SLURM_NTASKS.
$SLURM_NNODESTotal number of nodes in the job’s resource allocation.
$SLURM_TASKS_PER_NODENumber of tasks to be initiated on each node.
$SLURM_ARRAY_JOB_IDJob array’s master job ID number.
$SLURM_ARRAY_TASK_IDJob array ID (index) number.
$SLURM_ARRAY_TASK_COUNTTotal number of tasks in a job array.
$SLURM_ARRAY_TASK_MAXJob array’s maximum ID (index) number.
$SLURM_ARRAY_TASK_MINJob array’s minimum ID (index) number.