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

相关推荐
东莞市云毅网络有限公司4 小时前
AI 引用句逐条回指原文:让回答可回溯的校验实现
python·数据清洗·rag·企业知识库·文档解析
小和尚同志4 小时前
1.8k star 的开源 token 使用量监控神器— TokenTracker
人工智能·ai编程
极客 - L U5 小时前
神经网络 - 激活函数、损失函数、优化器
人工智能·深度学习·神经网络
数字融合5 小时前
透明化视频三维矿山井下照明重建技术
人工智能·python·数码相机
yi0115 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
xiangzhihong85 小时前
创之星花店多端业务闭环拆解
人工智能
奈落246 小时前
AI 编程从助手到 Agent:基于两份资料看哪些环节可以交出去,哪些必须自己攥住
大数据·人工智能
Joker可视化开发平台6 小时前
AI短剧接棒真人剧:开机量跌七成,普通人进场窗口在收窄
大数据·人工智能
澳鹏Appen6 小时前
澳鹏电子书 | 强化学习环境:为AI智能体打造高保真训练场
人工智能
吴佳浩6 小时前
单卡5090跑125B 大模型:Strata 把服务器级 MoE 拉进普通 PC
人工智能