当前位置: 首页 > news >正文

Slurm sbatch 全面指南:所有选项详解

Slurm sbatch 完整全面指南:所有选项详解

Slurm 是高性能计算(HPC)集群中广泛使用的开源作业调度系统。sbatch 命令用于提交批处理脚本到 Slurm 调度器执行。本指南将详尽介绍 sbatch 的所有选项、参数和使用方法。


目录

  1. 基本概念
  2. 命令行选项与 #SBATCH 指令
  3. 完整选项列表
  4. 环境变量
  5. 参数传递
  6. 实用示例

基本概念

sbatch 的工作机制

sbatch 提交一个批处理脚本到 Slurm 控制器。脚本可以通过文件名指定,如果没有指定文件名,sbatch 将从标准输入读取脚本内容。

两种参数指定方式

  1. 命令行选项sbatch --nodes=2 --time=01:00:00 script.sh
  2. 脚本内 #SBATCH 指令:在脚本开头添加 #SBATCH

优先级:命令行选项会覆盖脚本中的 #SBATCH 指令。


命令行选项与 #SBATCH 指令

所有 sbatch 选项都可以通过两种方式使用:

# 方式1:命令行
sbatch --nodes=2 --time=01:00:00 --job-name=myjob script.sh# 方式2:脚本内指令
#!/bin/bash
#SBATCH --nodes=2
#SBATCH --time=01:00:00
#SBATCH --job-name=myjob# 您的命令

完整选项列表

账户和权限管理

选项描述示例
-A, --account=<account>指定计费账户#SBATCH --account=myproject
--qos=<qos>服务质量等级#SBATCH --qos=high
--reservation=<name>使用预约资源#SBATCH --reservation=maintenance

作业基本信息

选项描述示例
-J, --job-name=<name>作业名称#SBATCH --job-name=data_analysis
--comment=<string>作业注释#SBATCH --comment="Data processing job"
--extra=<string>额外字符串(用于节点过滤)#SBATCH --extra="special_config"

时间控制

选项描述示例
-t, --time=<time>最大运行时间#SBATCH --time=2-12:30:00
--time-min=<time>最小运行时间#SBATCH --time-min=1:00:00
-b, --begin=<time>延迟开始时间#SBATCH --begin=16:00
--deadline=<time>截止时间#SBATCH --deadline=2023-12-31T23:59:59

节点和资源分配

节点选择
选项描述示例
-N, --nodes=<minnodes[-maxnodes]>节点数量#SBATCH --nodes=2-4
-w, --nodelist=<node_name_list>指定特定节点#SBATCH --nodelist=node01,node02
-x, --exclude=<node_name_list>排除特定节点#SBATCH --exclude=node03,node04
-C, --constraint=<list>节点特性约束#SBATCH --constraint="intel&gpu"
--prefer=<list>软约束(首选特性)#SBATCH --prefer="haswell"
--contiguous要求连续节点#SBATCH --contiguous
任务和CPU分配
选项描述示例
-n, --ntasks=<number>总任务数#SBATCH --ntasks=32
--ntasks-per-node=<ntasks>每节点任务数#SBATCH --ntasks-per-node=16
--ntasks-per-socket=<ntasks>每插槽任务数#SBATCH --ntasks-per-socket=8
--ntasks-per-core=<ntasks>每核心任务数#SBATCH --ntasks-per-core=1
-c, --cpus-per-task=<ncpus>每任务CPU数#SBATCH --cpus-per-task=4
硬件规格约束
选项描述示例
-B, --extra-node-info=<sockets:cores:threads>硬件规格要求#SBATCH -B 2:8:2
--sockets-per-node=<sockets>每节点插槽数#SBATCH --sockets-per-node=2
--cores-per-socket=<cores>每插槽核心数#SBATCH --cores-per-socket=8
--threads-per-core=<threads>每核心线程数#SBATCH --threads-per-core=2
-S, --core-spec=<num>专用核心数#SBATCH --core-spec=1
--thread-spec=<num>专用线程数#SBATCH --thread-spec=2

内存管理

选项描述示例
--mem=<MB>每节点总内存#SBATCH --mem=8G
--mem-per-cpu=<MB>每CPU内存#SBATCH --mem-per-cpu=2G
--mem-per-gpu=<MB>每GPU内存#SBATCH --mem-per-gpu=4G
--tmp=<MB>临时磁盘空间#SBATCH --tmp=50G

GPU 和 GRES 资源

选项描述示例
-G, --gpus=<list>GPU总数或类型#SBATCH --gpus=4
--gpus-per-node=<list>每节点GPU数#SBATCH --gpus-per-node=2
--gpus-per-socket=<list>每插槽GPU数#SBATCH --gpus-per-socket=1
--gpus-per-task=<list>每任务GPU数#SBATCH --gpus-per-task=1
--gres=<list>通用资源调度#SBATCH --gres=gpu:V100:2
--gres-flags=<type>GRES标志#SBATCH --gres-flags=enforce-binding
--cpus-per-gpu=<ncpus>每GPU的CPU数#SBATCH --cpus-per-gpu=8
--gpu-bind=<type>GPU绑定策略#SBATCH --gpu-bind=closest
--gpu-freq=<frequency>GPU频率#SBATCH --gpu-freq=high

分区和队列

选项描述示例
-p, --partition=<partition_names>分区名称#SBATCH --partition=gpu,compute

共享和独占模式

选项描述示例
--exclusive[=user,mcs,topo]独占模式#SBATCH --exclusive
--oversubscribe允许超额订阅#SBATCH --oversubscribe
-s, --overcommit允许任务数超过CPU数#SBATCH --overcommit

输入输出控制

选项描述示例
-o, --output=<filename>标准输出文件#SBATCH --output=job_%j.out
-e, --error=<filename>标准错误文件#SBATCH --error=job_%j.err
-i, --input=<filename>标准输入文件#SBATCH --input=/dev/null
--open-mode={append,truncate}输出文件打开模式#SBATCH --open-mode=append

工作目录

选项描述示例
-D, --chdir=<directory>工作目录#SBATCH --chdir=/scratch/user

邮件通知

选项描述示例
--mail-type=<type>邮件通知类型#SBATCH --mail-type=END,FAIL
--mail-user=<user>邮件地址#SBATCH --mail-user=user@domain.com

作业依赖

选项描述示例
-d, --dependency=<dependency_list>作业依赖关系#SBATCH --dependency=afterok:12345
--kill-on-invalid-dep={yes,no}依赖失效时杀死作业#SBATCH --kill-on-invalid-dep=yes

依赖类型详解

  • after:job_id - 指定作业开始后
  • afterok:job_id - 指定作业成功完成后
  • afternotok:job_id - 指定作业失败后
  • afterany:job_id - 指定作业结束后(无论成功失败)
  • aftercorr:job_id - 数组作业对应任务完成后
  • afterburstbuffer:job_id - 突发缓冲区操作完成后
  • singleton - 同名作业互斥

作业数组

选项描述示例
-a, --array=<indexes>作业数组索引#SBATCH --array=1-100:2%10

数组语法

  • 1-10 : 索引1到10
  • 1,3,5,7 : 特定索引
  • 1-10:2 : 步长为2(1,3,5,7,9)
  • 1-100%5 : 最多同时运行5个任务

任务分布

选项描述示例
-m, --distribution=<type>任务分布方式#SBATCH --distribution=cyclic

分布类型

  • block : 块分布(默认)
  • cyclic : 循环分布
  • plane=<size> : 平面分布
  • arbitrary : 任意分布

CPU频率控制

选项描述示例
--cpu-freq=<p1[-p2][:p3]>CPU频率设置#SBATCH --cpu-freq=high

环境变量控制

选项描述示例
--export=<environment_variables>导出环境变量#SBATCH --export=ALL,PATH
--export-file=<filename>从文件导出环境变量#SBATCH --export-file=env.txt
--get-user-env[={timeout}[L]]获取用户环境#SBATCH --get-user-env=30L

环境变量导出选项

  • ALL : 导出所有环境变量(默认)
  • NONE : 仅导出SLURM_*变量
  • NIL : 不导出用户环境变量
  • VAR1,VAR2 : 导出特定变量

容器支持

选项描述示例
--container=<path>OCI容器路径#SBATCH --container=/path/to/container
--container-id=<id>容器ID#SBATCH --container-id=mycontainer

突发缓冲区

选项描述示例
--bb=<spec>突发缓冲区规格#SBATCH --bb="create_persistent name=mybuf capacity=1TB"
--bbf=<filename>突发缓冲区脚本文件#SBATCH --bbf=bb_script.txt

集群联邦

选项描述示例
-M, --clusters=<list>目标集群#SBATCH --clusters=cluster1,cluster2
--cluster-constraint=<list>集群约束#SBATCH --cluster-constraint=gpu

重启和容错

选项描述示例
--reboot作业完成后重启节点#SBATCH --reboot
--no-requeue禁止重新排队#SBATCH --no-requeue
--requeue允许重新排队#SBATCH --requeue

其他高级选项

选项描述示例
--delay-boot=<minutes>延迟节点重启#SBATCH --delay-boot=10
--power=<flags>电源管理#SBATCH --power=level=1
--profile=<type>性能分析#SBATCH --profile=energy
--acctg-freq=<datatype>=<interval>监控频率#SBATCH --acctg-freq=task=30,energy=60
--mcs-label=<mcs>MCS标签#SBATCH --mcs-label=sensitive
--nice[=adjustment]优先级调整#SBATCH --nice=100
--priority=<value>作业优先级#SBATCH --priority=1000
--parsable可解析输出命令行使用
--test-only仅测试不提交命令行使用
-v, --verbose详细输出命令行使用
--wait等待作业完成命令行使用
--wckey=<wckey>工作负载特征键#SBATCH --wckey=myproject
--wrap=<args>包装命令sbatch --wrap="echo hello"

环境变量

Slurm 在作业执行时会设置大量环境变量,可以在脚本中直接使用:

作业基本信息

变量名描述
SLURM_JOB_ID作业ID
SLURM_JOB_NAME作业名称
SLURM_SUBMIT_DIR提交目录
SLURM_SUBMIT_HOST提交主机
SLURM_CLUSTER_NAME集群名称

资源分配信息

变量名描述
SLURM_NNODES分配的节点数
SLURM_NPROCS进程总数
SLURM_NTASKS任务总数
SLURM_CPUS_PER_TASK每任务CPU数
SLURM_CPUS_ON_NODE当前节点CPU数
SLURM_MEM_PER_CPU每CPU内存
SLURM_MEM_PER_NODE每节点内存

节点信息

变量名描述
SLURM_NODELIST分配的节点列表
SLURM_NODEID当前节点ID
SLURM_LOCALID节点内本地任务ID
SLURM_PROCID全局进程ID
SLURM_TOPOLOGY_ADDR拓扑地址

作业数组变量

变量名描述
SLURM_ARRAY_JOB_ID数组主作业ID
SLURM_ARRAY_TASK_ID当前数组任务ID
SLURM_ARRAY_TASK_COUNT数组任务总数
SLURM_ARRAY_TASK_MAX最大任务ID
SLURM_ARRAY_TASK_MIN最小任务ID

GPU 相关变量

变量名描述
SLURM_GPUS分配的GPU数量
SLURM_GPUS_ON_NODE当前节点GPU数
SLURM_GPU_BINDGPU绑定信息

时间相关

变量名描述
SLURM_JOB_START_TIME作业开始时间
SLURM_JOB_END_TIME作业结束时间
SLURM_TIMELIMIT时间限制(分钟)

参数传递

基本参数传递

sbatch 脚本传递参数与普通 shell 脚本相同:

# 提交命令
sbatch myscript.sh arg1 arg2 arg3# 脚本内容
#!/bin/bash
#SBATCH --job-name=param_test
#SBATCH --nodes=1echo "参数1: $1"
echo "参数2: $2" 
echo "参数3: $3"
echo "所有参数: $@"
echo "参数个数: $#"

高级参数处理示例

#!/bin/bash
#SBATCH --job-name=advanced_params
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=4
#SBATCH --mem=8G
#SBATCH --time=02:00:00# 参数解析
INPUT_FILE=${1:-"default_input.txt"}
OUTPUT_DIR=${2:-"./output"}
NUM_THREADS=${3:-${SLURM_CPUS_PER_TASK}}echo "=== 作业参数 ==="
echo "输入文件: ${INPUT_FILE}"
echo "输出目录: ${OUTPUT_DIR}"
echo "线程数: ${NUM_THREADS}"
echo "作业ID: ${SLURM_JOB_ID}"
echo "节点列表: ${SLURM_NODELIST}"# 创建输出目录
mkdir -p ${OUTPUT_DIR}# 运行程序
export OMP_NUM_THREADS=${NUM_THREADS}
srun your_program --input ${INPUT_FILE} --output ${OUTPUT_DIR}/result_${SLURM_JOB_ID}.txt

作业数组参数传递

#!/bin/bash
#SBATCH --job-name=array_params
#SBATCH --array=1-10
#SBATCH --nodes=1# 使用数组ID作为参数
INPUT_FILES=(file1.txt file2.txt file3.txt file4.txt file5.txt file6.txt file7.txt file8.txt file9.txt file10.txt)
INPUT_FILE=${INPUT_FILES[$((SLURM_ARRAY_TASK_ID-1))]}echo "处理任务 ${SLURM_ARRAY_TASK_ID}: ${INPUT_FILE}"
srun process_file ${INPUT_FILE}

实用示例

1. 指定特定节点运行作业

#!/bin/bash
#SBATCH --job-name=specific_nodes
#SBATCH --nodelist=node01,node02,node03  # 指定特定节点
#SBATCH --ntasks=3
#SBATCH --ntasks-per-node=1
#SBATCH --time=01:00:00echo "运行在节点: ${SLURM_NODELIST}"
srun hostname

2. 排除某些节点

#!/bin/bash
#SBATCH --job-name=exclude_nodes
#SBATCH --nodes=2
#SBATCH --exclude=node04,node05  # 排除特定节点
#SBATCH --time=01:00:00echo "可用节点: ${SLURM_NODELIST}"
srun hostname

3. GPU 作业示例

#!/bin/bash
#SBATCH --job-name=gpu_job
#SBATCH --nodes=1
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=8
#SBATCH --gres=gpu:V100:2     # 请求2个V100 GPU
#SBATCH --mem=32G
#SBATCH --time=04:00:00
#SBATCH --partition=gpuecho "GPU信息: ${SLURM_GPUS}"
echo "节点GPU数: ${SLURM_GPUS_ON_NODE}"# 运行CUDA程序
srun my_cuda_program

4. 多节点MPI作业

#!/bin/bash
#SBATCH --job-name=mpi_job
#SBATCH --nodes=4
#SBATCH --ntasks-per-node=16
#SBATCH --cpus-per-task=1
#SBATCH --time=02:00:00
#SBATCH --constraint="intel&infiniband"echo "总任务数: ${SLURM_NTASKS}"
echo "节点列表: ${SLURM_NODELIST}"# 加载MPI模块
module load mpi/openmpi# 运行MPI程序
srun my_mpi_program

5. 混合OpenMP+MPI作业

#!/bin/bash
#SBATCH --job-name=hybrid_job
#SBATCH --nodes=2
#SBATCH --ntasks-per-node=2   # 每节点2个MPI进程
#SBATCH --cpus-per-task=8     # 每个MPI进程8个OpenMP线程
#SBATCH --mem-per-cpu=2G
#SBATCH --time=03:00:00export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}echo "MPI进程数: ${SLURM_NTASKS}"
echo "OpenMP线程数: ${OMP_NUM_THREADS}"srun my_hybrid_program

6. 作业依赖链

# 提交第一个作业
JOB1=$(sbatch --parsable preprocessing.sh)# 提交依赖于第一个作业的作业
JOB2=$(sbatch --parsable --dependency=afterok:${JOB1} main_analysis.sh)# 提交清理作业
sbatch --dependency=afterany:${JOB2} cleanup.sh

7. 交互式作业分配

# 分配交互式资源
salloc --nodes=1 --ntasks=4 --time=02:00:00 --partition=debug# 在分配的节点上运行命令
srun my_interactive_program

8. 批处理脚本模板

#!/bin/bash
#SBATCH --job-name=my_analysis
#SBATCH --account=myproject
#SBATCH --partition=compute
#SBATCH --qos=normal# 资源请求
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=16
#SBATCH --cpus-per-task=1
#SBATCH --mem=64G
#SBATCH --time=08:00:00# 输出文件
#SBATCH --output=logs/job_%j.out
#SBATCH --error=logs/job_%j.err# 邮件通知
#SBATCH --mail-type=BEGIN,END,FAIL
#SBATCH --mail-user=user@example.com# 约束条件
#SBATCH --constraint="haswell&infiniband"# 确保输出目录存在
mkdir -p logs# 打印作业信息
echo "=== 作业信息 ==="
echo "作业ID: ${SLURM_JOB_ID}"
echo "作业名: ${SLURM_JOB_NAME}"
echo "节点: ${SLURM_NODELIST}"
echo "开始时间: $(date)"# 加载必要的模块
module load gcc/9.3.0
module load python/3.8.5# 设置环境变量
export OMP_NUM_THREADS=${SLURM_CPUS_PER_TASK}# 运行主程序
srun python my_analysis.py --input data.csv --output results/echo "结束时间: $(date)"

最佳实践建议

  1. 总是指定时间限制:避免作业无限期运行
  2. 合理估算资源:避免过度申请资源
  3. 使用作业数组:处理大量相似任务
  4. 设置邮件通知:及时了解作业状态
  5. 检查依赖关系:确保作业按正确顺序执行
  6. 使用约束条件:确保在合适的硬件上运行
  7. 监控资源使用:优化资源配置

通过本指南,您应该能够充分利用 sbatch 的所有功能,高效地管理和提交 Slurm 作业。记住查阅 man sbatch 或官方文档获取最新信息。

http://www.dtcms.com/a/392121.html

相关文章:

  • 使用SCP命令在CentOS 7上向目标服务器传输文件
  • Kindle Oasis 刷安卓系统CrackDroid
  • 最新超强系统垃圾清理优化工具--Wise Care 365 PRO
  • JeecgBoot权限控制系统解析:以具体模块为例
  • 2025年职场人AI认证与学习路径深度解析
  • 硬件开发_基于STM32单片机的智能垃圾桶系统2
  • CSS Display Grid布局 grid-template-columns grid-template-rows
  • 在 Spring Boot 中,针对表单提交和请求体提交(如 JSON) 两种数据格式,服务器端有不同的接收和处理方式,
  • NL2SQL简单使用
  • 数据结构:二叉树OJ
  • 【Linux手册】生产消费者模型的多模式实践:阻塞队列、信号量与环形队列的并发设计
  • Python + Flask + API Gateway + Lambda + EKS 实战
  • 【OpenGL】openGL常见矩阵
  • DeepSeek大模型混合专家模型,DeepSeekMoE 重构 MoE 训练逻辑
  • 450. 删除二叉搜索树中的节点
  • 实用工具:基于Python的图片定位导出小程序
  • 滚珠螺杆在工业机器人关节与线性模组的智能控制
  • 【AI】coze的简单入门构建智能体
  • Python数据分析:函数定义时的装饰器,好甜的语法糖。
  • Java数据结构——包装类和泛型
  • 【C++进阶】C++11的新特性 | 列表初始化 | 可变模板参数 | 新的类功能
  • 广东省省考备考(第一百零三天9.20)——言语(强化训练)
  • 面试编程题(四)
  • OpenHarmony之充电振动定制
  • 前端单元测试入门:使用 Vitest + Vue 测试组件逻辑与交互
  • 泛英国生物样本库全基因组关联分析
  • 【LeetCode 每日一题】2785. 将字符串中的元音字母排序
  • 游戏开发中的友好提示,错误信息,异常描述等数据管理的必要性
  • 总线协议(Bus Protocol)如何支持总线错误条件?
  • simuilink 中的引用模型(reference model)的作用? 它和子系统的区别? 如何生成引用模型?