ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Slurm如何使用

Slurm如何使用 目录最近组内引入了Slurm 这个脚本所以来简单记录一下方便我使用正式训练Debug模式最后的流程最近组内引入了Slurm 这个脚本所以来简单记录一下方便我使用.slurm是什么本质是Bash脚本文件Slurm的资源申请说明比如我们创建train.slurm正式训练#!/bin/bash 这个命令表示这个脚本应该由/bin/bash来解释执行 #SBATCH --job-nametrain #SBATCH --partitionnormal #normal是正式和稳定训练(不会被抢占) #SBATCH 是给Slurm的sbatch指令相当于Slurm 请让后面的--gres:gpu:1生效如果是bash就可能理解为注释但是是Slurm先看如果是Slurm先看那么他会记录后面的参数,等待资源资源分配到之后slurm执行剩余内容) #SBATCH --gresgpu:1 我要申请一张GPU #SBATCH --time1-00:00:00 #1 天 - 00小时 : 00分钟 : 00秒 #SBATCH --outputslurm-%x-%j.out #输出日志 #SBATCH --errorslurm-%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 --partitiondebug --gresgpu:1 --time00:30:00 --pty bash此时我们应该技术拥有一个GPU交互的Bash,此时可以手动nvidia-smiconda activate myenvpython train.pyexit (最后)debug最长30分钟不可长期训练debug 理解为 “先给我一张 GPU我进去手动敲命令测试。”sbatch train.slurm “我把整个训练脚本交给你你有资源了自己帮我跑。”最后的流程例如你准备跑train.py第一步在项目目录创建train.slurm 内容 #!/bin/bash #SBATCH --job-nameexp1 #SBATCH --partitionnormal #SBATCH --gresgpu:1 #SBATCH --time1-00:00:00 #SBATCH --outputslurm-%x-%j.out #SBATCH --errorslurm-%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 PDPDPending排队。资源到了以后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不要写--qosGPU 必须明确用--gresgpu:N申请。#SBATCH 这个我的理解就是相当于包比如F.normalize()里面的F,只是一个固定写法放在这里意思就是后面的参数生效可以这么类比着理解但要稍微修正一下#SBATCH确实可以先当成一种固定前缀/固定标记告诉 Slurm“后面这一串不是普通注释而是给 sbatch 的参数。”比如#SBATCH --gresgpu:1你可以读成#SBATCH ↓ “这是 Slurm 配置” --gresgpu:1 ↓ “我要 1 张 GPU”所以整体就是“Slurm请让后面的--gresgpu:1生效。”你拿它和F.normalize(...)里面的F类比帮助记忆是可以的但严格来说两者性质不一样F.normalize里的F是 Python 里的一个模块别名通常来自import torch.nn.functional as F而#SBATCH不是一个“包”也不是 Bash 里的对象。它是Slurm 规定的特殊指令前缀。所以更准确地说F.normalize(...) → 调用 F 模块里的 normalize 函数 #SBATCH --gresgpu:1 → Slurm 看到 #SBATCH就知道后面是提交参数你可以把#SBATCH先记成一句“下面这行是给 Slurm 看的配置不是给 Bash 正常执行的命令。”比如#SBATCH --job-nametrain #SBATCH --partitionnormal #SBATCH --gresgpu:1 #SBATCH --time1-00:00:00统一翻译就是任务名叫 train 用 normal 分区 申请 1 张 GPU 最长运行 1 天你这个理解方向是对的主要就是别把#SBATCH真的当成 Python 那种“包名”就行。
返回列表