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

相关推荐
AI创界者19 分钟前
【开源硬核】comfyUI MiniMax H3 融合模型本地部署一键整合包!单卡撬动 2K 影音全模态输出,附避坑指南
人工智能·aigc
2601_9637491022 分钟前
越华环保集团|河湖工况下数字化污水治理云边协同采集架构实现
人工智能·架构
闪学it27 分钟前
小滴课堂-AI大模型小龙虾-OpenClaw-0基础从入门到实战
人工智能
代码方舟27 分钟前
零信任架构实战:基于天远手机携号转网V即时版构建自动化营销风控网关
人工智能·智能手机·架构·自动化
会周易的程序员28 分钟前
企业私有 AI 算力服务器架构设计:异构四节点 + QUIC 微服务
运维·服务器·c++·人工智能·微服务·架构
闪学it30 分钟前
AE影视后期特效-遮罩/调色/抠像/MG动画/3D/Vlog制作
人工智能
Shulex35 分钟前
电商 AI 客服接管率怎么提升?从指标口径到转人工规则
大数据·人工智能·智能客服·跨境电商
海盗123435 分钟前
AI新闻日报_2026-08-24——AI 安全从理论风险变成现实事件——Coding Agent 越狱与具身机器人运动会共塑“干活即合规“新基线
人工智能·安全·机器人
科技研学社43 分钟前
2026-2028全球工作服夹克智能制造发展趋势与海外工厂布局报告
大数据·人工智能