摘要
在高负荷的AI算力平台中,任务排队是影响研发效率的核心瓶颈。本文将深入介绍基于Slurm作业调度系统的优先级调度机制与资源抢占策略,通过实际配置案例展示如何优化计算资源分配,显著减少任务空闲等待时间。
1 Slurm调度系统核心机制
Slurm是一个开源的、高度可扩展的集群管理和作业调度系统,专为大规模计算环境设计。它通过多种策略实现资源的高效利用,主要包括资源分派、作业调度、优先权控制、监控工具、定制化支持和系统最佳化等功能。
在算家云等AI算力平台中,Slurm通过三种任务提交方式满足不同场景需求:交互式适用于任务测试,可实时查看程序输出;批处理式适用于正式计算,计算稳定且与终端连接状态无关;抢占式适用于不想重复提交任务的测试场景。
2 优先级调度策略详解
2.1 先进先出(FIFO)队列
默认情况下,Slurm采用先进先出(FIFO)为基础分配作业优先权。在FIFO队列中,任务的排序依据是它们提交的时间顺序。配置FIFO队列需要在slurm.conf文件中进行以下设置:
# 找到并编辑slurm.conf档案
sudo nano /etc/slurm-llnl/slurm.conf
# 启用抢占模式,并指定基于先进先出优先权的抢占策略
PriorityType=priority/basic
重要提示:变更前请备份原始slurm.conf档案,生产环境中的任何重大改动建议先在测试环境中全面测试。
2.2 多因素作业队列
多因素队列是更先进的任务排队机制,预设备用,它根据多个因素综合计算作业的优先权。Slurm多因素调度通过加权计算以下因子确定任务优先权:
- 作业等待时间:作业等待时间越长,权责越高(
PriorityWeightAge × age_factor) - 关联权责:使用者组/账户的资源使用公平性(
PriorityWeightAssoc × assoc_factor) - 公平共用权责:按资源使用比例调整分值(
PriorityWeightFairshare × fair-share_factor) - 作业大小权责:小/大作业优先(
PriorityWeightJobSize × job_size_factor) - 分区权责:分区优先权(
PriorityWeightPartition × priority_job_factor) - QoS权责:服务品质等级(
PriorityWeightQOS × QOS_factor) - 资源权责:资源类型(CPU/GPU等)权责加权
优先权计算公式如下:
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
2.3 多因素队列典型应用
-
快速完成小作业:设定
PriorityWeightJobSize=-1,大作业的优先权降低,小作业更快被调度 -
保障关键使用者/组:通过
PriorityWeightAssoc和Fair-share_factor确保重要团队的作业优先运行 -
资源饥饿保护:配置
PriorityWeightFairshare=2000,低资源使用量的使用者作业优先权显著提升
3 资源抢占策略配置
3.1 抢占机制概述
Slurm支援任务抢占功能,高优先权任务可抢占低优先权任务资源。被抢占任务可以取消、重设或挂起。如果启用回填调度(预设),系统会按bf_interval周期计算低优任务能否在不延迟高优任务前提下运行。
3.2 分区优先权抢占配置
建立高优先权分区是实现资源抢占的有效方法。以下是详细配置步骤:
首先在集群中开启抢占功能开关,并指定基于分区优先权的抢占策略:
# 编辑slurm.conf档案
sudo nano /etc/slurm-llnl/slurm.conf
# 启用抢占模式,并指定基于分区优先权的抢占策略
PreemptMode=preempt/partition_prio
# 当作业被抢占时的行为
PreemptType=suspend # 或者 "cancel"
关键参数说明:
SelectType: 推荐select/cons_tres,定义资源分派策略SelectTypeParameters: 推荐CR_Core,控制资源分派细节SchedulerType: 推荐sched/backfill,指定调度演算法类型PriorityType: 推荐priority/multifactor,定义任务优先权计算规则
接着,在集群中添加一个高优先权分区:
# 在slurm集群中添加一个高优先权分区
scontrol create partition=hipri PriorityTier=2 nodes=ALL
# 查看当前的集群分区
scontrol show partitions
3.3 抢占策略实践
配置完成后,可以通过向hipri分区提交任务或者将任务更改到高优分区的方式来实现任务抢占:
# 提交高优先权任务
sbatch -p hipri job_script.slurm
# 将运行中任务改为高优先权
scontrol update jobid=<job_id> partition=hipri
4 最佳实践与注意事项
####4.1 调度策略选择
根据实际工作负载特点,可以选择不同的调度策略:
-
FIFO策略:如果队列中的第一个任务无法出队,系统将反复尝试对第一个任务进行出队操作,而不会跳过
-
遍历策略:如果队列中的第一个任务无法出队,则会跳过该任务,然后依次尝试对后续队列中的任务进行出队操作
-
均衡策略:结合FIFO和遍历策略的优点,在第一个任务等待出队时间超过预定时间后,尝试对后续任务进行出队操作
4.2 资源分配优化
-
内存管理:计算节点每个核心默认可用8G内存,计算任务如需要更大的内存空间,需通过
--mem-per-cpu选项申请内存 -
多线程任务:使用
-c参数设置单个任务可使用的核心数 -
多进程任务:使用
-n参数启动多个进程运行计算任务 -
混合任务:结合
-n和-c参数实现多进程+多线程任务提交
4.3 故障诊断与排查
类似于百度百舸AI计算平台提供的智能诊断功能,管理员可以通过以下方式诊断任务排队问题:
- 检查队列配额设置
- 验证节点可用性
- 监控资源余量(GPU、内存、存储等)
- 分析网络配置(EHC、RDMA网卡等)
5 结论
通过合理配置Slurm的优先权调度与资源抢占策略,AI算力平台可以显著提升资源利用效率,减少任务空闲等待时间。算家云平台的实践表明,结合多目标优化算法和容器化技术,能够实现对AI算力资源的弹性调度管理,满足从初学者到专业开发者的多样化需求。
随着AI算力需求的不断增长,先进的调度策略将成为算力平台的核心竞争力。通过本文介绍的Slurm高级调度技巧,平台管理员可以最大化利用计算资源,为用户提供更高效、更稳定的算力服务。
欢迎在评论区分享您在AI任务调度方面的经验和问题!