提交和管理作业¶
选择提交方式¶
| 命令 | 适合场景 |
|---|---|
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"/
先创建日志目录再提交:
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 |
作业失败,需要调整程序或资源 |
取消和修改¶
本地临时盘大小和保留字段不能在排队后修改;如需调整 --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 通信已经工作。