加载中...

Slurm简单使用


Slurm

批作业文件示例

#!/bin/bash
#SBATCH --job-name='submit_command_job1'      # 作业名
#SBATCH --chdir=/home/test/test_jobs/output   # 工作目录,(也是作业日志的输出目录)
#SBATCH --partition=queue2                    # 队列名
#SBATCH --nodes=1                             # 占用节点数量
#SBATCH --mincpus=64                          # 每节点占用cpu的数量
#SBATCH --gres=gpu:2                          # 每节点使用gpu的个数

uuid=`uuidgen`
echo "==> SLURM_CPUS_ON_NODE: ${SLURM_CPUS_ON_NODE}"
echo "$uuid : $(date)" >> /home/test/test_jobs/a.log

sleep 360000

echo "$uuid : $(date)" >> /home/test/test_jobs/a.log

提交任务参数

【】中的内容属于个人补充!!!

sbatch

--array=0-5             # 提交数组作业,作业实际job_id就是job_id,数组id为arraytaskid,具体看restapi释义
--cpus-per-gpu=<cpus>   # 作业步骤将需要每个分配的 GPU 的ncpus处理器。 与cpus-per-task不兼容
--cpus-per-task=<cpus>  # 每个任务的处理器数量
	# NOTE: Beginning with 22.05, srun will not inherit the --cpus-per-task value requested by salloc or sbatch. It must be requested again with the call to srun or set with the SRUN_CPUS_PER_TASK environment variable if desired for the task(s).
	
--mincpus=<cpus>  # 指定每个节点的最小逻辑 CPU/处理器数;【指定多少就分配多少个cpu,不会超出】
    # 补充:如果指定了cpus-per-task,此参数无效

--exclusive        # 独占节点,将分配全部cpu核数

--mem=<size>[units] # 指定每个节点所需的实际内存。默认单位是兆字节。可以使用后缀 [K|M|G|T] 指定不同的单位。--mem 、--mem -per-cpu和--mem-per-gpu 选项是互斥的。
--mem-per-cpu =<大小>[单位]  # 每个可用的已分配 CPU 所需的最小内存。默认单位是兆字节。
--mem-per-gpu =<大小>[单位]  # 每个分配的 GPU 所需的最小内存。默认单位是兆字节。可以使用后缀 [K|M|G|T] 指定不同的单位。

--nodes=<num>  # 分配的节点数; 【当只有nodes参数时,默认每节点只分配1个cpu】

-n, --ntasks=<num>      # Slurm 控制器在分配中运行的作业步骤将启动最大数量的 任务并提供足够的资源;【当只有tasks参数时,如果num未超过节点可运行cpu数,则分配1个节点,如果超过节点可运行的最大cpu数,则会分配多个节点】
--ntasks-per-core=<ntasks>    # 请求在每个核心上调用最大的ntasks
--ntasks-per-node=<ntasks>    # 请求在每个节点上调用ntasks
--ntasks-per-socket=<ntasks>  # 请求在每个套接字上调用最大的ntasks
--ntasks-per-gpu =< ntasks >  # 请求为每个 GPU 调用ntasks任务。

--threads-per-core=<threads>  # 将节点选择限制为每个内核至少具有指定线程数的节点。在任务布局中,使用每个核心指定的最大线程数。


--gpus=[类型:]<数字>             # 指定作业所需的 GPU 总数。注意:分配必须包含每个节点至少一个 GPU。
--gpus-per-node =[类型:]<数字>   # 指定作业资源分配中包含的每个节点上作业所需的 GPU 数量。
--gpus-per-socket =[类型:]<数字> # 指定作业资源分配中包含的每个插槽上作业所需的 GPU 数量。
--gpus-per-task =[类型:]<数字>   # 在作业的资源分配中指定要在每个任务上生成的作业所需的 GPU 数量。此选项需要明确的任务计数,例如 -n、--ntasks 或“--gpus=X --gpus-per-task=Y”,而不是带有 -N、--nodes 的模糊节点范围。
--gpu-freq=[<type]=value>[,<type=value>][,verbose]  # 请求分配给作业的gpu配置为特定的频率值。

srun

-c , --cpus-per-task=<cpus>         # 请求为每个进程分配的cpus。
-N , --nodes=<minnodes>[-maxnodes]  # 分配的节点数; 【当只有nodes参数时,默认每节点只分配1个cpu】
-n , --ntasks=<数字>                 # 指定要运行的任务数。
--ntasks-per-core=<ntasks>          # 请求在每个核心上调用最大的ntasks 
--ntasks-per-node=<ntasks>          # 请求在每个节点上调用ntasks 。如果与--ntasks选项一起使用, -- ntasks选项将优先,--ntasks-per-node将被视为每个节点的 最大任务数。

作业命令及状态

scontrol show job [job_id] # 查看作业详情,默认查所有

scontrol suspend [job_id]   # 挂起作业
scontrol resume [job_id]    # 恢复作业(与 suspend 配合使用)

scontrol hold  [job_id]     # 阻止作业运行,作业等待时才可使用
scontrol release [job_id]   # 允许作业运行(与 hold 配合使用)

scontrol requeue [job_id]   # 重新排队   命令行:Restarts=1    RestAPI:restart_cnt=1
scontrol show jobs  | grep -E '^JobId|Priority' # 查看作业优先级

scancel job_id            # 取消所有作业
scancel jobid_arrayid     # 取消数组作业中的具体某一个,例:scancel 83_3

# 挂起恢复后的作业会在原节点运行,如果该节点资源不足,作业将报错退出(slurm-69.out)
srun: error: c1: task 0: Killed
srun: Force Terminated StepId=70.0

sacct --help --helpformat
sacct --format jobid,jobname,partition,submit,start,end,user,state,allocnodes,alloccpus,nodelist,workdir,elapsed,allocgres,exitcode,maxvmsize,maxrss -j <scheduler_id>  # 计费查看,可以查看历史作业数据
状态 命令行 RestAPI
运行中 RUNNING RUNNING
完成 COMPLETED COMPLETED
队列中 PENDING PENDING
运行失败(资源不足) FAILED FAILED
( state_reason : BadConstraints)
挂起 suspend SUSPENDED SUSPENDED
终止作业 scancel CANCELLED CANCELLED
正在终止 scancel COMPLETING COMPLETING

作业优先级

官方文档:https://slurm.schedmd.com/priority_multifactor.html#config

默认情况下,Slurm 按照先进先出 (FIFO) 的原则分配作业优先级。当 Slurm 由外部调度程序控制时,应配置 FIFO 调度。

slurm.conf 文件中的PriorityType参数选择优先级插件。此变量的默认值PriorityType=priority/basic,它支持简单的 FIFO 调度。(见下面的配置

在大多数情况下,最好使用 Multifactor Priority 插件,该插件通过设置PriorityType=priority/multifactor启用。这提供了一种非常通用的方法,可以根据多种因素对等待调度的作业队列进行排序。

调度程序在做出调度决策时会考虑几个因素。调度程序按以下顺序选择要评估的作业:

  1. 可以抢占的工作
  2. 提前预订的工作
  3. 分区优先级
  4. 作业优先级
  5. 作业提交时间
  6. 作业编号

记住这一点很重要,因为具有最高优先级的作业可能不是第一个被调度程序评估的作业。当有多个作业可以同时评估时,例如作业请求具有相同 PriorityTier 的分区时,会考虑作业优先级。

scontrol show jobs  | grep -E '^JobId|Priority' # 查看作业优先级

# 设置作业优先级 (作业的优先级在0到4294967295之间,数值越大优先级越高)
# 优先级为0时:Job is in held state, pending scheduler release for job 850  # 0时hold时的状态
# 优先级为4294967294,95时: scontrol:error: Invalid Priority value: 4294967294
scontrol update job=818 Priority=4294967293    # maxvalue=4294967293   minvalue=1
scontrol update job=819,817 Priority=4294967293 

scontrol top 851          # 单个调整优先级到最顶部(同时会调整队列任务其它的优先级) (不建议使用)
scontrol top 851,852,853  # 多个调整                                           (不建议使用)

# 可能出现的错误提示;【提示】:作业运行中也能修改优先级成功!!!  程序错误 rc:1
Access/permission denied for job 219573 # 权限不足
Invalid job id specified for job 20000  # 无效的作业id
Invalid Priority value: 50000000000000  # 无效的优先级

批量提交作业

#!/bin/bash
int=1
while(( $int<=100 ))
do
    job_name="command_testjob4_$int"
    echo $int $job_name
    sbatch --job-name="$job_name" test1.slurm
    let "int++"
done

# lsf:
bsub -J $job_name < job.lsf
# pbs:
qsub -N $job_name test.pbs

文章作者: 无夜
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 无夜 !
评论
  目录