多因素优先级插件

目录

介绍

默认情况下,Slurm 设置了优先级/多因素插件,根据多个因素调度作业。

在大多数情况下,使用多因素优先级插件是更可取的,然而通过在 slurm.conf 文件中设置PriorityType=priority/basic,可以使用基本的先进先出调度。当 Slurm 被外部调度器控制时,应配置 FIFO 调度。(请参见下面的配置

调度器在做出调度决策时会考虑多个因素。作业按照以下顺序被选择进行评估:

  1. 可以抢占的作业
  2. 具有预留的作业
  3. 分区优先级层级
  4. 作业优先级
  5. 作业提交时间
  6. 作业 ID

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

多因素“因素”

多因素作业优先级插件中有九个因素影响作业优先级:

年龄
作业在队列中等待的时间,符合调度条件
关联
与每个关联相关的因素
公平共享
已承诺的计算资源与已消耗资源之间的差异
作业大小
分配给作业的节点或 CPU 数量
优先级
用户可以控制的因素,以优先处理自己的作业。
分区
与每个节点分区相关的因素
QOS
与每个服务质量相关的因素
站点
由管理员或站点开发的 job_submit 或 site_factor 插件规定的因素
TRES
每个 TRES 类型都有其自身的作业因素,表示在给定分区中请求/分配的 TRES 类型数量

此外,可以为上述每个因素分配一个权重。这提供了实施政策的能力,可以根据所需的比例混合上述任何因素的组合。例如,站点可以配置公平共享为主导因素(例如 70%),将作业大小和年龄因素各设置为 15%,并将分区和 QOS 影响设置为零。

作业优先级因素概述

在任何给定时刻,作业的优先级将是 slurm.conf 文件中启用的所有因素的加权总和。作业优先级可以表示为:

Job_priority =
	site_factor +
	(PriorityWeightAge) * (age_factor) +
	(PriorityWeightAssoc) * (assoc_factor) +
	(PriorityWeightFairshare) * (fair-share_factor) +
	(PriorityWeightJobSize) * (job_size_factor) +
	(PriorityWeightPartition) * (priority_job_factor) +
	(PriorityWeightQOS) * (QOS_factor) +
	SUM(TRES_weight_cpu * TRES_factor_cpu,
	    TRES_weight_<type> * TRES_factor_<type>,
	    ...)
	- nice_factor

此公式中的所有因素都是浮点数,范围从 0.0 到 1.0。权重是无符号的 32 位整数。作业的优先级是一个整数,范围在 0 到 4294967295 之间。数字越大,作业在队列中的位置越高,调度的时间越早。作业的优先级,因此其在队列中的顺序,可能会随时间变化。例如,作业在队列中等待的时间越长,当年龄权重非零时,其优先级将越高。

默认行为是 slurmctld “规范化” 优先级值,以最高值为基准。这使得作业从任何因素获得的最高优先级等于该因素的PriorityWeight*值。以分区为例,如果“PartitionA”的PriorityJobFactor为 20,而“PartitionB”的PriorityJobFactor为 10,并且PriorityWeightPartition设置为 5000,则任何作业在该分区获得的优先级计算如下:

# PartitionA
5000 * (20 / 20) = 5000

# PartitionB
5000 * (10 / 20) = 2500
您可以更改默认行为,使其不规范化优先级值,而是使用原始的PriorityJobFactor值,设置PriorityFlags=NO_NORMAL_PART。在这种情况下,分区基础优先级的计算如下:
# PartitionA
5000 * 20 = 100000

# PartitionB
5000 * 10 = 50000
有关您可以配置为不进行规范化的其他优先级因素,请参见文档中的PriorityFlags部分。

重要: 权重值应足够高,以获得良好的有效数字,因为所有因素都是从 0.0 到 1.0 的浮点数。例如,一个作业的公平共享因素可能为 .59534,而另一个作业的公平共享因素可能为 .50002。如果公平共享权重仅设置为 10,则两个作业将具有相同的公平共享优先级。因此,设置权重足够高,以避免这种情况,建议从 1000 或更高的值开始,针对您希望使其占主导地位的因素。

年龄因素

注意: 计算年龄因素需要安装和运行Slurm 计费数据库

年龄因素表示作业在队列中等待的时间,符合运行条件。一般来说,作业在队列中等待的时间越长,其年龄因素越大。然而,依赖作业在等待其依赖的作业完成时,年龄因素不会改变。此外,当调度因作业的节点或时间限制超过集群当前限制而被延迟时,年龄因素也不会改变。

在某个可配置的时间长度(PriorityMaxAge)后,年龄因素将达到最大值 1.0。

关联因素

每个关联可以分配一个整数优先级。数字越大,请求该关联的作业优先级就越高。该优先级值被规范化为所有关联中最高的优先级,以成为关联因素。

作业大小因素

作业大小因素与作业请求的节点或 CPU 数量相关。该因素可以配置为根据 slurm.conf 文件中的PriorityFavorSmall 布尔值来优先考虑较大的作业或较小的作业。当PriorityFavorSmall为 NO 时,作业越大,其作业大小因素就越大。请求机器上所有节点的作业将获得 1.0 的作业大小因素。当PriorityFavorSmall 布尔值为 YES 时,单节点作业将获得 1.0 的作业大小因素。

PriorityFlags值为SMALL_RELATIVE_TO_TIME会改变此行为如下。作业大小以 CPU 数量除以时间限制(以分钟为单位)。结果再除以系统中的 CPU 总数。因此,具有时间限制为 1 的全系统作业将获得 1.0 的作业大小因素,而具有较大时间限制的小作业将获得接近 0.0 的作业大小因素。

优先级因素

用户可以通过设置作业的优先级值来调整自己作业的优先级。与系统优先级一样,正值会对作业的优先级产生负面影响,而负值则会提高作业的优先级。只有特权用户可以指定负值。调整范围为 +/-2147483645。

分区因素

每个节点分区可以分配一个整数优先级。数字越大,请求在该分区运行的作业优先级就越高。该优先级值随后被规范化为所有分区中最高的优先级,以成为分区因素。

服务质量 (QOS) 因素

每个 QOS 可以分配一个整数优先级。数字越大,请求该 QOS 的作业优先级就越高。该优先级值随后被规范化为所有 QOS 中最高的优先级,以成为 QOS 因素。

站点因素

站点因素是可以通过 scontrol、job_submit 或 site_factor 插件设置的因素。一个示例用例可能是一个 job_submit 插件,根据请求的资源数量设置特定优先级。

TRES因素

每个 TRES 类型都有其自身的作业优先级因素,表示在给定分区中请求/分配的 TRES 类型数量。对于全局 TRES 类型,例如许可证和突发缓冲区,该因素表示在整个系统中请求/分配的 TRES 类型数量。请求/分配的 TRES 类型越多,作业的优先级就越高。

公平共享因素

注意: 计算公平共享因素需要安装和运行Slurm 计费数据库,以提供分配的份额和已消耗的计算资源。

作业优先级中的公平共享组件影响用户排队作业的调度顺序,基于他们已分配的计算资源份额和作业已消耗的资源。公平共享因素不涉及固定配额,用户对机器的访问不会在达到该配额后被切断。

相反,公平共享因素用于优先调度排队作业,使得那些收费账户服务不足的作业优先调度,而收费账户服务过多的作业则在机器闲置时调度。

Slurm 的公平共享因素是一个介于 0.0 和 1.0 之间的浮点数,反映用户已分配的计算资源份额和用户作业已消耗的计算资源数量。值越高,等待调度的作业在队列中的位置越高。

默认情况下,计算资源是机器提供的计算周期,以分配的_cpus*秒为单位。可以通过配置分区的 TRESBillingWeights 选项来考虑其他资源。TRESBillingWeights 选项允许您通过为不同的可追踪资源 (TRES) 分配不同的计费权重来考虑除 CPU 之外的消耗资源,例如 CPU、节点、内存、许可证和通用资源 (GRES)。例如,当仅对 CPU 计费时,如果作业请求 1CPU 和 64GB 内存在一个 16CPU、64GB 的节点上,该作业将仅按 1CPU 计费,而实际上使用了整个节点。

默认情况下,当配置 TRESBillingWeights 时,作业按每个使用的 TRES 计费。可计费的 TRES 计算为所有 TRES 类型的总和乘以其对应的计费权重。

例如,以下在配置为 TRESBillingWeights=CPU=1.0、Mem=0.25G 和 16CPU、64GB 节点的分区上的作业将按以下方式计费:

      CPUs       Mem GB
Job1: (1 *1.0) + (60*0.25) = (1 + 15) = 16
Job2: (16*1.0) + (1 *0.25) = (16+.25) = 16.25
Job3: (16*1.0) + (60*0.25) = (16+ 15) = 31

另一种计算可计费 TRES 的方法是取节点上各个 TRES(例如 CPU、内存、GRES)的最大值,加上全局 TRES(例如许可证)的总和。例如,上述作业的可计费 TRES 将计算为:

          CPUs      Mem GB
Job1: MAX((1 *1.0), (60*0.25)) = 15
Job2: MAX((15*1.0), (1 *0.25)) = 15
Job3: MAX((16*1.0), (64*0.25)) = 16
此方法通过在 slurm.conf 中定义 MAX_TRES 优先级标志来启用。

您还可以通过取节点上各个 TRES(例如 CPU、内存)的最大值,加上可计费的 GRES(GPU),再加上全局 TRES(例如许可证)的总和来计算可计费 TRES。 此方法通过在 slurm.conf 中定义 MAX_TRES_GRES 优先级标志来启用。

“公平树”公平共享

自 19.05 版本以来,“公平树”公平共享算法已成为默认设置。有关更多详细信息,请参见公平树公平共享文档。

“经典”公平共享

自 19.05 版本以来,“经典”公平共享算法不再是默认设置,仅在明确配置PriorityFlags=NO_FAIR_TREE时使用。描述该算法的文档已移至单独的经典公平共享文档页面。

sprio 工具

sprio 命令提供了组成每个作业调度优先级的六个因素的摘要。虽然squeue具有显示作业复合优先级的格式选项 (%p 和 %Q),但 sprio 可用于显示每个作业的优先级组件的详细信息。此外,sprio -w选项显示当前配置的每个因素的权重(PriorityWeightAge、PriorityWeightFairshare 等)。

配置

以下 slurm.conf 参数用于配置多因素作业优先级插件。有关更多详细信息,请参见 slurm.conf(5) 手册页。

PriorityType
将此值设置为“priority/multifactor”以启用多因素作业优先级插件。
PriorityDecayHalfLife
这决定了历史使用对复合使用值的贡献。数字越大,过去的使用对公平共享的影响越长。如果设置为 0,则不会应用衰减。如果您想对每个关联强制执行硬时间限制,这将很有帮助。如果设置为 0,则必须将 PriorityUsageResetPeriod 设置为某个间隔。单位为时间字符串(即 min,hr:min:00,days-hr:min:00,或 days-hr)。默认值为 7-0(7 天)。
PriorityCalcPeriod
以分钟为单位的时间段,在此期间将重新计算半衰期衰减。默认值为 5(分钟)。
PriorityUsageResetPeriod
在此间隔内,关联的使用将重置为 0。如果您想对每个关联强制执行硬时间使用限制,则使用此选项。如果 PriorityDecayHalfLife 设置为 0,则不会发生衰减,这是重置由运行作业累积的使用的唯一方法。默认情况下,此选项关闭,建议使用 PriorityDecayHalfLife 选项,以避免在集群上没有任何作业运行,但如果您的架构设置为仅允许在系统上使用特定时间,则这是实现此目的的方法。仅适用于 PriorityType=priority/multifactor。单位为时间字符串(即 NONE、NOW、DAILY、WEEKLY)。默认值为 NONE。
  • NONE: 永不清除历史使用。默认值。
  • NOW: 立即清除历史使用。在启动和重新配置时执行。
  • DAILY: 每天午夜清除。
  • WEEKLY: 每周日 00:00 清除。
  • MONTHLY: 每月第一天 00:00 清除。
  • QUARTERLY: 每季度第一天 00:00 清除。
  • YEARLY: 每年第一天 00:00 清除。
PriorityFavorSmall
一个布尔值,设置作业大小因素的极性。默认设置为 NO,这导致较大节点大小具有较大的作业大小因素。将此参数设置为 YES 意味着作业越小,作业大小因素越大。
PriorityMaxAge
指定年龄因素达到最大值的队列等待时间。单位为时间字符串(即 min,hr:min:00,days-hr:min:00,或 days-hr)。默认值为 7-0(7 天)。
PriorityWeightAge
一个无符号整数,缩放年龄因素的贡献。
PriorityWeightAssoc
一个无符号整数,缩放关联因素的贡献。
PriorityWeightFairshare
一个无符号整数,缩放公平共享因素的贡献。
PriorityWeightJobSize
一个无符号整数,缩放作业大小因素的贡献。
PriorityWeightPartition
一个无符号整数,缩放分区因素的贡献。
PriorityWeightQOS
一个无符号整数,缩放服务质量因素的贡献。
PriorityWeightTRES
TRES 类型和权重的列表,缩放每个 TRES 类型因素的贡献。
PriorityFlags
修改优先级行为的标志。仅适用于 PriorityType=priority/multifactor。
  • ACCRUE_ALWAYS: 如果设置,优先级年龄因素将增加,尽管作业依赖或保持。累积限制被忽略。
  • CALCULATE_RUNNING: 如果设置,优先级将不仅为待处理作业重新计算,还包括正在运行和挂起的作业。
  • DEPTH_OBLIVIOUS: 如果设置,优先级将根据正常的多因素计算进行计算,但树中关联的深度不会对其优先级产生不利影响。此选项会自动启用 NO_FAIR_TREE。
  • NO_FAIR_TREE: 禁用“公平树”算法,并恢复为“经典”公平共享优先级调度。
  • INCR_ONLY: 如果设置,优先级值只会增加。作业优先级永远不会降低。
  • MAX_TRES: 如果设置,按节点上各个 TRES(例如 CPU、内存、GRES)的最大值加上所有全局 TRES(例如许可证)的总和来计算加权 TRES 值(例如 TRESBillingWeights)。
  • NO_NORMAL_ALL: 如果设置,所有 NO_NORMAL_* 标志均被设置。
  • NO_NORMAL_ASSOC: 如果设置,关联因素不按最高关联优先级进行规范化。
  • NO_NORMAL_PART: 如果设置,分区因素不按最高分区 PriorityJobFactor 进行规范化。
  • NO_NORMAL_QOS: 如果设置,QOS 因素不按最高 QOS 优先级进行规范化。
  • NO_NORMAL_TRES: 如果设置,TRES 因素不按作业的分区 TRES 计数进行规范化。
  • SMALL_RELATIVE_TO_TIME: 如果设置,作业的大小组件将基于作业大小除以其时间限制,而不是仅仅基于作业大小。

注意:如上所述,六个优先级因素的范围为 0.0 到 1.0。因此,PriorityWeight 项可能需要设置为足够高的值(例如 1000),以解决优先级因素之间非常微小的差异。尤其是在公平共享因素中,两个作业的优先级可能相差仅 .001(甚至更少!)

配置示例

以下是多因素作业优先级插件的示例 slurm.conf 文件设置。

第一个示例是运行插件,应用衰减以减少使用。可以在此配置中使用硬限制,但由于使用会随时间衰减,因此效果会较小。

# 启用具有衰减的多因素作业优先级插件
PriorityType=priority/multifactor

# 2 周半衰期
PriorityDecayHalfLife=14-0

# 作业越大,作业大小优先级越高。
PriorityFavorSmall=NO

# 作业的年龄因素在队列中等待 2 周后达到 1.0。
PriorityMaxAge=14-0

# 下一组确定多因素作业优先级插件各个组件的权重。
# 以下每个的默认值为 1。
PriorityWeightAge=1000
PriorityWeightFairshare=10000
PriorityWeightJobSize=1000
PriorityWeightPartition=1000
PriorityWeightQOS=0 # 不使用 QOS 因素

此示例用于运行插件,不对使用进行衰减,因此需要重置使用。

# 启用多因素作业优先级插件,不进行衰减
PriorityType=priority/multifactor

# 不应用衰减
PriorityDecayHalfLife=0

# 1 个月后重置使用
PriorityUsageResetPeriod=MONTHLY

# 作业越大,作业大小优先级越高。
PriorityFavorSmall=NO

# 作业的年龄因素在队列中等待 2 周后达到 1.0。
PriorityMaxAge=14-0

# 下一组确定多因素作业优先级插件各个组件的权重。
# 以下每个的默认值为 1。
PriorityWeightAge=1000
PriorityWeightFairshare=10000
PriorityWeightJobSize=1000
PriorityWeightPartition=1000
PriorityWeightQOS=0 # 不使用 QOS 因素

最后修改于 2023 年 8 月 3 日