跳到主要内容

⭐️sbatch

简介

sbatch是Slurm系统中用于提交批处理作业的命令:

  • 提交后立即返回命令行(后台运行)
  • 资源满足时自动在计算节点执行(非登录节点)
  • 适用场景:所有不需要交互的任务

常用参数

参数说明示例
-p, --partition=partition指定分区-p gpu
-J, --job-name=jobname设置作业名-J my_job
-o, --output=out 输出日志路径-o /path/output.log
-e, --error=err错误日志路径-e /path/error.log
-N, --nodes=N节点数量-N 2(2个节点)
-n, --ntasks=ntasks总CPU核数-n 8(8核)
-c, --cpus-per-task=ncpus每任务核数-c 4(每任务4核)
-t, --time=minutes 时间限制-t 1:30:00(1小时30分)
-w, --nodelist=hosts...指定节点-w node[1-3]
-x, --exclude=hosts...排除节点-x node5
-W, --wait 等待任务结束sbatch -W ...
--wckey=wckey指定wckey--wckey="project1"
--wrap[=command string]将命令字符串封装在sh脚本中并提交--wrap "hostname"
-h, --help查看完整帮助sbatch -h

使用示例

执行单条命令

sbatch -p compute -o make.log --wrap "make test"

效果:在compute分区运行make test,日志保存到make.log

⚠️ 注意:添加-W参数可等待任务完成(适合脚本中串联任务)

通过脚本提交任务

脚本示例 (myjob.sh):

#!/bin/bash
echo "任务开始于 $(date)"
hostname
sleep 10
echo "任务结束于 $(date)"

用户sbatch命令如下:

sbatch -p compute -o job.log myjob.sh

此提交命令将mybash.sh脚本提交到compute分区中,并将make命令的标准输出和错误打印至make.log

将常用参数写入脚本头

📌 提示:建议将常用参数写入脚本头(mybash.sh如下示例):

#!/bin/bash
#SBATCH -J my_job
#SBATCH -p compute
#SBATCH -N 2
#SBATCH -o %j.out
#SBATCH -e %j.err
srun your_program

%j为文件名模式替换,请查看下方文档

用户sbatch命令如下:

sbatch mybash.sh

文件名模式替换

在输出文件命名中可以使用以下替换符号(需在双引号内使用):

常用替换符号

符号说明示例
%j作业IDjob-%j.outjob-12345.out
%x作业名称%x-%j.outmyjob-12345.out
%u用户名%u-%j.outuser1-12345.out
%a作业数组索引output-%a.outoutput-1.out
%N短主机名每个节点生成独立文件

数字填充示例

# 生成 job0123.out(4位填充)
sbatch -o "job%4j.out" script.sh

# 生成 job123-01.out(2位任务ID填充)
sbatch -o "job%j-%2t.out" script.sh

💡 提示:更复杂的模式替换请参考 Slurm 官方文档或 man sbatch

常用环境变量

输入环境变量

一些选项可通过环境变量来设置,命令行的选项优先级高于设置的环境变量,将覆盖掉环境变量的设置。环境变量与对应的参数如下:

变量名对应参数示例
SBATCH_PARTITION-pexport SBATCH_PARTITION=gpu
SBATCH_JOB_NAME-Jexport SBATCH_JOB_NAME=myjob
SBATCH_TIME-texport SBATCH_TIME=1:00:00
SBATCH_OUTPUT-oexport SBATCH_OUTPUT=job-%j.out

输出变量

Slurm将在作业脚本中输出以下变量,作业脚本可以使用这些变量:

变量名说明
SLURM_JOB_ID当前作业ID
SLURM_JOB_NAME作业名称
SLURM_JOB_NODELIST分配的节点列表
SLURM_SUBMIT_DIR作业提交目录
SLURM_CPUS_PER_TASK每任务CPU数
SLURM_GPUS分配的GPU数量