LabHub
学习 学习路径 课程

HPC 与 Slurm

靠口头约定分 GPU 会出什么事

在 LabHub 中继续学习

一句话总结

排程器是不是通过人的共识而是通过政策来决定“谁什么时候做什么”的系统

概念图: 不是通过人的共识而是通过政策来决定“谁什么时候做什么”的系统 · OOM · 资源分配没有被管理为状态 · 节点间认证

为什么需要这个?

GPU服务器一台的时候是这样做的。“现在在用吗?”“不,请用。”运行得很好。

如果两台,用户达到五人,Slack就会出现预约线程。如果三台,用户达到十人,就会发生这种情况。

这些问题的共同点是资源分配没有被管理为状态。调度器将其转换为队列和策略。

怎么行动

Slurm的组成要素

组成要素 角色 无论在哪里
slurmctld 中央控制器。队列管理、调度决定 1台管理节点(HA时2台)
slurmd 每个计算节点的代理。执行工作 所有计算节点
slurmdbd 账户·使用量数据库(选择) 管理节点
munge 节点间认证 所有节点

munge在这幅画中最经常引起问题。聚类的所有节点必须具有相同的munge键,时间表也必须正确(基本允许误差为分钟)。键不同或时间表不一致的话Munge decode failed离开后节点无法通信。

ls -l /etc/munge/munge.key      # 0400, munge:munge 여야 한다

如果权限稍微松懈一点,munged就完全不会弹出。

日程安排的基本概念

背填(backfill)

基本调度器按优先级顺序安排工作。但是,当大型工作等待资源时,节点可能会闲逛。Backfill在“不延迟前一个工作的开始时间范围内”先填充后面的小工作。

白笔要正常运行,用户必须**--time必须诚实**地写。如果每个人都写最大的值,日程安排器就无法计算空闲时间。所以成熟的群集将“写短一点就能赚快钱”的激励措施作为政策。

请求资源的意义

sbatch --nodes=1 --ntasks=1 --cpus-per-task=8 --mem=64G --gres=gpu:a100:2 --time=04:00:00 train.sh

**无法使用未请求的资源。**因为是强制用cgroup,--gres=gpu:1收到后,如果想在代码中使用2张,第二张就完全看不见了。

阅读Q不动的理由的方法

安装排程器后,最常听到的话就是“我的工作不正常”。 Slump会用状态字符串告诉你原因,所以只要知道表格,大部分都可以自己解决。

squeue -u $USER -o "%.10i %.9P %.20j %.8T %.10M %R"
scontrol show job <작업번호> | grep -E 'JobState|Reason|NodeList'
理由 意思 大部分解决
Resources 请求的资源现在不空 正在等待。减少请求会加快速度。
Priority 前面有优先级高的工作 公正共享政策的问题
QOSMaxJobsPerUserLimit 那个QoS的同步执行上限 绑定到阵列操作
AssocGrpCPUMinutesLimit 账户的分配量用完了 给管理员
ReqNodeNotAvail 该节点正在预约·停止中 解除节点指定
PartitionTimeLimit 请求的时间比分区上限长 --time减少

**要求越大,等待的时间就越长。**如果请求4台节点8小时,就会有相应的 等待出现空窗。backfill Scheduler 短小的工作 因为塞进缝隙里,所以--time诚实地(虽然充足但不要过分)写出来的话 开始得要快得多。把上限写得尽可能高,这种习惯会让自己推迟。

节点是drain里面写着理由。

sinfo -R          # drain 사유 목록
scontrol show node <노드> | grep -E 'State|Reason'

大部分是磁盘不足、GPU错误、健康检查失败。没有删除原因,只有节点 恢复的话,在下次检查中会再次被排除。

**如果工作停滞不前,不知道原因时,可以查看会计记录。**标准输出中没有任何内容。 没有留下消失的情况,sacct和结束代码一起OUT_OF_MEMORYTIMEOUT告诉你。

sacct -j <작업번호> --format=JobID,State,ExitCode,MaxRSS,Elapsed,ReqMem

MaxRSSReqMem粘在上面的话,是内存的原因。

在现场相遇的样子

**在家庭实验室中也有意义。**即使是两块GPU的服务器,如果要依次进行多次实验,则Scheduler会更好。如果放在队列中过夜,就会自动连续运行。而且这种经验会直接转化为大规模群集。

**节点掉入DRAIN。**如果检测到硬件错误或GRES不一致,Slurm会自动删除该节点。修复原因后scontrol update NodeName=... State=RESUME必须将其恢复到。不会自动返回——如果不知道这一点,一个节点就会玩几天。

在下次确认中看到的东西

在接下来的测验中,分区、白笔、资源请求分别做出什么样的日程安排决定。 先确认。通过那个标准后,从下一个模块开始slurm.conf撰写,GPU GRES定义, 按照顺序练习sbatch脚本和破损设置诊断。