Slurm如何使用

目录

[最近组内引入了Slurm 这个脚本,所以来简单记录一下,方便我使用](#最近组内引入了Slurm 这个脚本,所以来简单记录一下,方便我使用)

正式训练

Debug模式

最后的流程


最近组内引入了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.py

train.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,排队。

资源到了以后:

复制代码
R

Running。

然后 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 那种"包名"就行。

相关推荐
hhzz2 分钟前
【OpenCV 入门到精通 10】视频分析与光流跟踪:背景减除与运动检测
人工智能·python·opencv·性能优化
蓝胖的四次元口袋3 分钟前
Python基础语法入门
python
昇腾知识体系5 分钟前
K8s 调度昇腾 NPU:device-plugin 部署、Volcano 与 vNPU 切分
人工智能·华为·知识图谱
海带紫菜菠萝汤5 分钟前
本周 AI 观察:嘴上喊着降速,手上全踩油门
人工智能·深度学习·ai·开源·大模型
东风破_16 分钟前
把 Elasticsearch 全文检索讲明白:倒排索引、IK 分词器和 BM25
人工智能
远翔调光芯片^1382879887217 分钟前
ECP5702能芯科技PD取电芯片在市场上的优势有哪些?
开发语言·人工智能·单片机·嵌入式硬件·智能家居
东风破_18 分钟前
从 RAG 到 Agentic RAG:第三步,本地知识不够就去网络搜索
人工智能
Patrick在香港22 分钟前
Python 抓 0.91 GB 香港法例:Agent 的进度该写进磁盘,不是写进上下文
爬虫·python·api·claude·香港
桃西西呀22 分钟前
别被"秒回"骗了:推理模型背后那只"吞金兽",吃的是你看不见的预算
人工智能·llm·ai编程
ClinicTech39 分钟前
实验室洗瓶机的清洗系统架构与自动化控制解析
java·python