多因素优先级插件
目录
- 介绍
- 多因素作业优先级插件
- 作业优先级因素概述
- 年龄因素
- 关联因素
- 作业大小因素
- 优先级因素
- 分区因素
- 服务质量 (QOS) 因素
- 站点因素
- TRES因素
- 公平共享因素
- sprio 工具
- 配置
- 配置示例
介绍
默认情况下,Slurm 设置了优先级/多因素插件,根据多个因素调度作业。
在大多数情况下,使用多因素优先级插件是更可取的,然而通过在 slurm.conf 文件中设置PriorityType=priority/basic,可以使用基本的先进先出调度。当 Slurm 被外部调度器控制时,应配置 FIFO 调度。(请参见下面的配置)
调度器在做出调度决策时会考虑多个因素。作业按照以下顺序被选择进行评估:
- 可以抢占的作业
- 具有预留的作业
- 分区优先级层级
- 作业优先级
- 作业提交时间
- 作业 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 日