slurm调度策略(sjf作业调度算法)

作者:电脑培训网 2024-05-02 11:12:09 444

[集群]Slurm作业调度系统的使用最近使用集群进行实验,记录并学习集群系统进行深度学习的实验过程。集群所使用的作业调度系统为Slurm,这里记录下使用的常用命令和一些注意事项。

Slurm简介

slurm调度策略(sjf作业调度算法)

Slurm是一个开源的、容错的、高度可扩展的集群管理和作业调度系统,适用于大大小小的Linux集群。Slurm的运行不需要修改内核,并且相对独立。作为集群工作负载管理器,Slurm具有三个关键功能。

1它为用户分配一段时间内对资源的独占和/或非独占访问权限,以便他们可以执行工作。

2它提供了一个框架,用于在一组分配的节点上启动、执行和监视作业。

3它通过管理待处理工作队列来仲裁资源争用。

相关的名词

1资源

作业运行过程中使用的可量化实体是资源;

包括硬件资源和软件资源

2集群

包括计算、存储、网络等相互关联的资源实体的资源集合;

物理上一般由计算处理、互联通信、I/O存储、操作系统、编译器、运行环境、开发工具等多个软硬件子系统组成;

节点是集群的基本单位。从角色上来说,一般可以分为管理节点、登录节点、计算节点、存储节点等。一般用户可以访问管理节点和计算节点,而登录和存储节点一般用户不能直接访问。

3工作

物理组成,一组相关的资源分配请求,以及一组相关的处理过程;

交互方式可分为交互任务和非交互任务;

资源使用可分为串行操作和并行操作;

4分区

命名作业容器;

用户访问控制;

资源使用限制;

5工作排班系统

负责监控和管理集群中的资源和作业的软件系统;

通常由资源管理器、调度器、任务执行器以及用户命令和API组成;

调度系统主要作用

单系统映像

解决簇结构松散的问题;统一用户界面并简化其使用;

系统资源整合

管理异构资源和异构系统;

多任务管理

统一管理任务,避免冲突;

资源访问控制

基于策略的资源访问控制;

简单地说,调度系统是一个面向集群的操作系统。

Slurm三种模式

1批处理作业

对于批处理作业使用sbatch命令提交作业脚本。安排作业运行后,作业脚本将在分配的第一个节点上执行。您还可以使用srun命令在作业脚本中加载作业任务。提交过程中使用的命令行终端的终止不会影响作业的运行。

2交互式作业提交

资源分配和任务加载这两个步骤都是通过srun命令来完成的:当在登录shell中执行srun命令时,srun首先向系统提交作业请求并等待资源分配,然后在分配的资源上加载作业任务节点。在该模式下,用户需要等待终端中的任务结束后才能继续其他操作。作业结束前,如果提交时命令行终端断开,则任务将被终止。一般用于短期小作业测试。这种方法类似于通过命令行正常运行程序。需要时刻保持联系

3实时分配模式作业

分发作业模式类似于交互式作业模式和批处理作业模式的融合。用户需要指定所需的资源条件,并向资源管理器提出作业的资源分配请求。提交后,作业将排队。当用户请求的资源满足时,用户指定的命令将在用户提交作业的节点上执行。执行指定命令后,运行结束,用户请求的资源被释放。作业结束前,如果提交时命令行终端断开,则任务终止。典型的用途是分配资源并启动shell,然后使用srun在该shell中运行并行作业。

笔记

(1)如果salloc后没有相应的脚本或可执行文件,则默认选择/bin/sh,用户将获得具有适当环境变量的shell环境。

salloc和sbatch的主要区别在于,当salloc命令的资源请求满足时,直接在提交作业的节点上执行相应的任务,而sbatch当资源请求满足时,相应的任务在分配的第一个节点上执行。

(3)Salloc分配资源,然后执行相应的任务。非常适合需要指定操作节点等资源限制、有特定命令的作业。

常用命令

sbatch:提交作业脚本。该脚本通常包含一个或多个srun命令来启动并行任务

sinfo:显示分区或节点状态,可以通过参数选项进行过滤和排序

squeue:显示队列的作业和作业状态

scancel:取消排队或正在运行的作业

scontrol:显示或设置slurm作业、分区、节点等的状态。

sacctmgr:显示和设置与帐户关联的QOS和其他信息

sacct:显示历史作业信息

srun:运行并行作业,有多个选项,例如:最大和最小节点数、处理器数量、是否

指定和排除节点。

命令详情

(1)查看分区——sinfo

(2)查询作业——squeue的排队和运行状态

(3)删除作业命令——scancel

(4)控制作业命令——scontrol

常用术语

用户:用户名

节点:一般指计算节点

核心:CPU核心

工作:工作

jobstep:作业步骤,单个作业可以有多个作业步骤

partition:分区。作业需要在特定分区中运行。一般来说,不同分区之间的资源是不同的。

QOS:服务质量,可以理解为用户可以使用的CPU、内存等资源的限制

任务:任务数量。默认情况下,一个任务使用1个CPU核,可以理解为该作业所需的CPU核数。

socket:CPU插槽,可以理解为物理CPU的数量

stdout:标准输出文件,程序正常运行时输出信息的文件,一般指输出到屏幕的信息。

stderr:标准错误文件,程序运行时出现错误时输出信息的文件,一般指输出到屏幕的信息。

常用环境变量

SLURM_NODELIST当前作业分配到的节点列表SLURM_JOB_NODELIST当前作业分配到的节点列表SLURM_JOB_NAME当前作业的作业名称SLURMD_NODENAME当前作业执行任务的主机名SLURM_NODE_ALIASES的主机别名当前作业执行节点SLURM_ARRAY_JOB_ID当前组号作业的ID号SLURM_ARRAY_TASK_ID当前阵列作业的任务ID号SLURM_ARRAY_TASK_COUNT当前阵列作业的任务总数SLURM_ARRAY_TASK_MAX当前阵列作业的最大任务ID号SLURM_ARRAY_TASK_MIN当前阵列作业的最小任务ID号SLURM_ARRAY_TASK_STEP当前阵列作业任务ID号的增长步长SLURM_NNODES当前作业使用的节点数SLURM_JOBID当前作业ID号SLURM_JOB_ID当前作业ID号SLURM_TASKS_PER_NODE每个节点当前作业任务数SLURM_JOB_USER当前作业执行用户SLURM_JOB_UID当前作业执行用户的UIDSLURM_NODEID当前作业执行主机号SLURM_SUBMIT_DIR当前作业提交的目录SLURM_TASK_PID当前任务执行时的进程号SLURM_CPUS_ON_NODE节点使用的CPU数量SLURM_PROCID当前作业执行时的CPU编号SLURM_LOCALID当前作业节点上本地任务的ID号SLURM_JOB_GID当前作业执行时用户的GIDSSLURM_JOB_CPUS_PER_NODE当前作业执行时每个节点使用的CPU数量SLURM_CLUSTER_NAME当前作业执行的slurm集群的名称SLURM_GTIDS当前作业在该节点运行时的全局任务ID号,以0为原点,用逗号分隔SLURM_SUBMIT_HOST的名称当前作业的提交主机SLURM_JOB_PARTITION当前作业提交时使用的分区SLURM_JOB_NUM_NODES当前作业使用的节点总数SLURM_MEM_PER_NODE当前作业每个节点使用的内存SLURM_MEM_PER_CPU当前作业各节点上每个CPU占用的内存大小

作业提交

这里记录使用sbatch进行作业调度。

使用sbatch命令提交作业。sbatch命令在脚本正确传递到作业调度系统后立即退出,同时获取作业号。当作业等所需资源满足后,作业开始运行。通用脚本的格式是.sh或.script文件。

sbatch向调度系统提交批处理作业脚本。批处理脚本名称可以在命令行上传递给sbatch,也可以在批处理脚本中定义。如果未指定文件名,sbatch将从标准输入获取脚本内容。

脚本文件的基本格式:

第一行以#开头!/bin/bash等指定更改脚本的解释器。/bin/bash可以更改为/bin/sh、/bin/csh等。

每行可执行命令之前带有“#SBATCH”前缀的参数用作作业调度系统的参数。

默认情况下,标准输出和标准错误都定向到同一个文件slurm-%j.out,并且“%j”将被作业号替换。

作业脚本的基本结构如下:

1第一行是脚本语言解释器的路径。一般选择bash作为解释器。

#!/bin/bash

2由#SBATCH引导的几行Slurm设置选项,例如

#SBATCH--partition=hpxg#申请分区`hpxg`的计算资源#SBATCH--nodes=1#申请1个节点#SBATCH--ntasks-per-node=1#每个节点申请一个任务node)#SBATCH--time=06:00:00#计划运行最多6小时

3.计算运行程序需要设置的环境变量,如

#可以查看GPU的运行和使用情况#nvidia-smi#nvidia-smi#nvidia-smiconda激活环境cd/home/codeDir/

4运行程序的命令,例如

蟒蛇mycode.py

完整示例:

编辑脚本文件

维泰斯特

文本内容示例

#!/bin/bash-l#SBATCH--job-name='myTest'#SBATCH--partition=Pnamw#SBATCH--nodes=1#SBATCH--ntasks-per-node=1#SBATCH--cpus-每个任务=1#SBATCH--output=/home/testWorks.%j.out#SBATCH--error=/home/testWorks.%j.err#SBATCH--gpus=2#nvidia-sminvidia-smiwhichnvidia-sminvidia-smiconda激活环境pythonmai.py

提交运行脚本文件

批量测试.sh

脚本常用命令

-J,--job-name指定作业名称-N,--nodes节点数-n,--ntasks使用的CPU核数--mem指定每个节点上使用的物理内存-t,---time运行时间,超过时间限制的作业将被终止-p,--partition指定分区--reservation执行资源预留名称-w,--nodelist指定具体节点-x,--排除分配到的节点作业不包含指定节点--ntasks-per-node指定每个节点使用多少个CPU核心--begin指定作业开始时间-D,--chdir指定脚本/命令的工作目录--export-file=通过文件文件名设置设置环境变量。文件中环境变量的格式为NAME=value,变量之间用空格分隔。-o,--output=使用--output将其重定向到同一个文件--gpus运行程序所需的GPU数量

squeue命令结果详情

结果列标题信息

JOBID:工作编号

PARITION:分区名称

名称:职位名称

用户:用户名

ST:状态,常见状态包括

NODELIST(REASON):分配给的节点名称列表

常见的ST状态包括:

PD、Q:正在排队、PENDINGR:正在运行、RUNNINGCA:已取消、CANCELLEDCG:正在完成、COMPLETIONGF:失败、FAILEDTO:超时、TIMEOUTNF:节点故障、NODEFAILURECD:已完成、COMPLETEDNODELIST:分配给节点名称列表公共信息:

AssociationJobLimit:作业已达到允许的最大作业数量限制AssociationResourceLimit:作业已达到允许的最大资源限制AssociationTimeLimit作业:作业已达到其时间限制资源:作业等待期间所需的资源可用QOSJobLimit:QOSQOSResourceLimit:作业的QOS已达到最大资源限制QOSTimeLimit:作业的QOS已达到最大时间限制PartitionNodeLimit:作业所需的节点数超过当前限制使用的分区PartitionTimeLimit:作业所需的分区已达到时限Priority:作业所需的分区有高级别作业或预留NodeDown:作业所需的节点已宕机JobHeldUser:作业被用户自己挂起InvalidQOS:作业的QOS无效

工作所需的节点是在更高的优先级分区中用于工作的下降,排干或保留的:工作所需的节点已被关闭,精疲力尽或保留在更高优先级分区中的工作scancel取消任务

用户使用Scancel命令来取消他或取消他的命令她的工作。命令格式如下:

扫描作业

jobid可以通过squeue获取。对于排队作业,取消作业只会将作业标记为CANCELED状态并结束作业。对于正在运行或挂起的作业,取消作业将终止该作业的所有作业步骤,包括批处理作业脚本,将作业标记为CANCELED状态,并回收分配给该作业的节点。

挂起作业

scontrol持有job_list

scontrolHoldjob_list命令可以使队列中尚未运行的作业暂停分配运行。被挂起的作业将不会被执行,以便其他作业可以优先运行并占用资源。当使用squeue命令查询显示挂起的作业时,NODELIST状态标志为JobHelduser或JobheldAdmin。使用scontrolreleasejob_list取消暂停。

其他常用命令

1查看节点状态

中信信息

PARRITION:节点所在的分区。

AVAIL:分区状态,up标志可用,down标志不可用。

TIMELIMIT:程序可以运行的最长时间,无限表示没有限制。

限制格式为天-小时:分钟:秒。

节点:节点数。

NODELIST:节点名称列表。

STATE:节点状态,可能的状态包括

1已分配,alloc:已分配

2完成,comp:完成

3停机:停机

4耗尽,流失:失去活力

5失败:失败

6空闲:空闲

7混合:混合,节点正在运行作业,但一些空闲的CPU核心可以接受新的作业

8、reserved,resv:资源预留

9未知,unk:未知原因

注:如果状态带有*后缀,则表示节点没有响应

2主要参数

-a,全部

显示所有分区信息

-d,死

仅显示无响应或关闭的节点

-我

以秒为间隔持续自动更新显示信息

-我

显示详细资料

-n

显示指定节点信息

-N

一行一个节点显示信息,即显示每个节点的信息

-p

显示分区信息

-r

只显示响应节点信息

-R

显示节点不响应的原因

-o

按照格式输出信息,type[:[.]size],

默认为“%#P%5a%.101%.6D%.6t%N”

1%all:所有字段信息。

2%a:分区的状态以及是否可用。

3%A:以“已分配/空闲”格式显示状态对应的节点信息

4%B:分区中每个节点可以分配给作业的核心数。

5%c:每个节点的核心数。

6%C:以“allocated/idle/other.total”的格式显示核心数。

7%D:节点数。

8%e:节点可用内存。

9%E:节点无效的原因。

10%g:可以使用该节点的用户组。

11%n:节点主机名。

12.表示右对齐,默认左对齐。

13size:最小字段大小,如果不指定,最大为20个字符

查看节点信息

scontorl显示节点[节点]$:scontrol显示节点node4CPUAlloc=0CPUErr=0CPUTot=32CPULoad=44.09AvailableFeatures=(null)ActiveFeatures=(null)Gres=(null)NodeAddr=node4NodeHostName=node4RealMemory=64000AllocMem=0FreeMem=72333套接字=32个板=1State=DOWN*ThreadsPerCore=1TmpDisk=0权重=1所有者=N/AMCS_label=N/APartitions=batchBootTime=无SlurmdStartTime=NoneCfgTRES=cpu=32,mem=62.50G,billing=32AllocTRES=CapWatts=n/aCurrentWatts=0LowestJoules=0ConsumedJoules=0ExtSensorsJoules=n/sExtSensorsWatts=0ExtSensorsTemp=n/sCPUAlloc:分配给节点的核心数CPUTot:分配给节点CPULoad的核心总数:节点的负载NodeHostName:节点的主机名Partitions:节点属于哪个分区RealMemory:节点的内存大小State:节点的状态值

查看分区信息

scontrolshowpartition$:scontrolshowpartitionPartitionName=batchAllowGroups=ALLAllowAccounts=ALLAllowQos=ALLAllocNodes=ALL默认=YESQoS=N/ADefaultTime=NONEDisableRootJobs=NOExclusiveUser=NOGraceTime=0Hidden=NOMaxNodes=UNLIMITEDMaxTime=UNLIMITEDMinNodes=1LLN=NOMaxCPUsPerNode=UNLIMITEDNodes=node4PriorityJobFactor=1PriorityTier=1RootOnly=NOReqResv=NOOverSubscribe=NOOverTimeLimit=NONEPreemptMode=OFFState=UPTotalCPUs=32TotalNodes=1SelectTypeParameters=NONEDefMemPerNode=UNLIMITEDMaxMemPerNode=UNLIMITEDDisableRootJobs:根不是允许提交作业Maxtime:最大运行时间LLN:是否按照最小负载节点调度Maxnodes:最大节点数Hidden:是否为隐藏分区Default:是否为默认分区OverSubscribe:是否允许超时ExclusiveUser:排除用户

相关推荐