跳转至

提交和管理作业

选择提交方式

命令 适合场景
sbatch script.sh 可复现的批处理、训练和长任务
srun ... command 短测试或作业内启动并行任务
salloc ... 需要连续运行多条命令的交互调试

生产任务优先使用 sbatch,把资源需求保存在脚本中。

批处理模板

train.sh
#!/usr/bin/env bash
#SBATCH --job-name=train
#SBATCH --account=project-example
#SBATCH --partition=gpu-full
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1
#SBATCH --cpus-per-task=16
#SBATCH --mem=128G
#SBATCH --gres=gpu:h20:2
#SBATCH --tmp=200G
#SBATCH --time=04:00:00
#SBATCH --output=logs/%x-%j.out
#SBATCH --error=logs/%x-%j.err

set -euo pipefail

mkdir -p logs "$LOCAL_SCRATCH/dataset" "$LOCAL_SCRATCH/output"
cp -a /project/example/dataset/. "$LOCAL_SCRATCH/dataset/"

srun python train.py \
  --data "$LOCAL_SCRATCH/dataset" \
  --output "$LOCAL_SCRATCH/output"

mkdir -p /project/example/results/"$SLURM_JOB_ID"
cp -a "$LOCAL_SCRATCH/output/." \
  /project/example/results/"$SLURM_JOB_ID"/

先创建日志目录再提交:

mkdir -p logs
sbatch train.sh

Slurm 不创建输出目录

#SBATCH --output=logs/... 中的 logs/ 必须在提交前存在,否则作业可能无法写日志。

交互调试

申请一张完整 GPU,获得 shell 后运行测试:

salloc --account=project-example \
  --partition=gpu-full \
  --gres=gpu:h20:1 \
  --cpus-per-task=8 \
  --mem=64G \
  --time=00:30:00

srun --pty bash -l
nvidia-smi -L
exit
exit

不用时立即退出两层 shell,释放分配。

查看状态

squeue --me
squeue --me -o "%.18i %.12P %.28j %.10T %.10M %.10l %R"
scontrol show job JOB_ID
sacct -X -j JOB_ID --format=JobID,JobName,Partition,State,Elapsed,ExitCode,AllocTRES

常见状态:

状态 含义
PENDING 等待资源或策略条件,查看 Reason
RUNNING 正在运行
COMPLETING 正在执行收尾,短暂出现通常正常
COMPLETED 调度层完成,仍要检查 ExitCode 和应用日志
FAILED / OUT_OF_MEMORY / TIMEOUT 作业失败,需要调整程序或资源

取消和修改

scancel JOB_ID
scancel --name=train --user="$USER"

本地临时盘大小和保留字段不能在排队后修改;如需调整 --tmp,取消后重新提交。 不要使用范围过宽的取消命令,执行前先用 squeue --me 确认目标。

多节点作业

sbatch \
  --account=project-example \
  --partition=gpu-full \
  --nodes=2 \
  --ntasks-per-node=1 \
  --gres=gpu:h20:8 \
  --time=00:30:00 \
  multi-node.sh

/project 在节点间共享,但每个节点的 $LOCAL_SCRATCH 是独立目录。多节点程序必须 用 srun 启动任务,并显式设计数据分发、通信后端与结果汇总;成功分配多节点并不 等于 NCCL/RoCE 通信已经工作。