目录
[最近组内引入了Slurm 这个脚本,所以来简单记录一下,方便我使用](#最近组内引入了Slurm 这个脚本,所以来简单记录一下,方便我使用)
最近组内引入了Slurm 这个脚本,所以来简单记录一下,方便我使用
.slurm是什么,本质是Bash脚本文件+Slurm的资源申请说明
比如,我们创建train.slurm
正式训练
#!/bin/bash 这个命令表示,这个脚本应该由/bin/bash来解释执行 #SBATCH --job-name=train #SBATCH --partition=normal #normal是正式和稳定训练(不会被抢占) #SBATCH 是给Slurm的sbatch指令,相当于Slurm 请让后面的--gres:gpu:1生效(如果是bash就可能理解为注释,但是是Slurm先看,如果是Slurm先看,那么他会记录后面的参数,等待资源,资源分配到之后,slurm执行剩余内容) #SBATCH --gres=gpu:1 我要申请一张GPU #SBATCH --time=1-00:00:00 #1 天 - 00小时 : 00分钟 : 00秒 #SBATCH --output=slurm-%x-%j.out #输出日志 #SBATCH --error=slurm-%x-%j.err #错误日志 set -euo pipefail source /path/to/conda.sh conda activate owdfa python train.py 后面可能很多都直接写了个sh文件,所以,我们(可以删除前面的python那行,而是直接用下面的这个) bash run_cub.sh ------------------------------------- 你: 流程 sbatch train.slurm ↓ Slurm: 收到申请 ↓ 等待 GPU ↓ 分配 GPU ↓ 自动执行 train.slurm ↓ train.slurm 里面自己执行 python train.pytrain.slurm
│
├── 上半部分
│ #SBATCH ...
│ ↓
│ 告诉 Slurm:
│ 我要几张GPU?
│ 用哪个分区?
│ 最长跑多久?
│ 日志放哪里?
│
└── 下半部分
conda activate ...
python train.py
↓
真正要执行的 Linux 命令
Debug模式
与正式训练还不一样,这个是看一下程序能不能启动
srun --partition=debug --gres=gpu:1 --time=00:30:00 --pty bash此时我们应该技术拥有一个GPU交互的Bash,此时可以手动
nvidia-smi
conda activate myenv
python train.py
exit (最后)
debug最长30分钟,不可长期训练
debug 理解为: "先给我一张 GPU,我进去手动敲命令测试。" sbatch train.slurm "我把整个训练脚本交给你,你有资源了自己帮我跑。"
最后的流程
例如你准备跑:
train.py第一步,在项目目录创建:
train.slurm 内容 #!/bin/bash #SBATCH --job-name=exp1 #SBATCH --partition=normal #SBATCH --gres=gpu:1 #SBATCH --time=1-00:00:00 #SBATCH --output=slurm-%x-%j.out #SBATCH --error=slurm-%x-%j.err set -euo pipefail source /你的conda/conda.sh conda activate myenv cd /你的项目目录 python train.py然后
sbatch train.slurm然后 Slurm 返回类似:
Submitted batch job 12345再:
squeue -u "$USER" 查看自己的Slurm任务状态的命令可能看到:
JOBID PARTITION NAME STATE 12345 normal exp1 PD
PD:Pending,排队。
资源到了以后:
RRunning。
然后 Slurm 自动执行:
python train.py你不需要再手动执行一次。
所以你现在可以把整个 Slurm 思路压缩成:
train.py = 真正的训练程序 train.slurm = "我要什么资源 + 拿到资源后怎么启动 train.py" sbatch train.slurm = 把这个任务交给 Slurm Slurm = 排队 → 分GPU → 自动执行 train.slurm → 自动运行 python train.py而你作为硕士 master ,目前最重要的限制就是:normal 每台服务器同时最多 2 张 GPU;不要写
--qos;GPU 必须明确用--gres=gpu:N申请。#SBATCH 这个我的理解,就是相当于包,比如F.normalize()里面的F,只是一个固定写法,放在这里,意思就是后面的参数生效
可以这么类比着理解,但要稍微修正一下:
#SBATCH确实可以先当成一种固定前缀/固定标记 ,告诉 Slurm:"后面这一串不是普通注释,而是给 sbatch 的参数。"比如:
#SBATCH --gres=gpu:1你可以读成:
#SBATCH ↓ "这是 Slurm 配置" --gres=gpu:1 ↓ "我要 1 张 GPU"所以整体就是:
"Slurm,请让后面的
--gres=gpu:1生效。"你拿它和:
F.normalize(...)里面的
F类比,帮助记忆是可以的,但严格来说两者性质不一样:
F.normalize里的
F是 Python 里的一个模块别名,通常来自:
import torch.nn.functional as F而:
#SBATCH不是一个"包",也不是 Bash 里的对象。
它是 Slurm 规定的特殊指令前缀。
所以更准确地说:
F.normalize(...) → 调用 F 模块里的 normalize 函数 #SBATCH --gres=gpu:1 → Slurm 看到 #SBATCH,就知道后面是提交参数你可以把
#SBATCH先记成一句:"下面这行是给 Slurm 看的配置,不是给 Bash 正常执行的命令。"
比如:
#SBATCH --job-name=train #SBATCH --partition=normal #SBATCH --gres=gpu:1 #SBATCH --time=1-00:00:00统一翻译就是:
任务名叫 train 用 normal 分区 申请 1 张 GPU 最长运行 1 天你这个理解方向是对的,主要就是别把
#SBATCH真的当成 Python 那种"包名"就行。