Slurm是一个用于Linux的开源集群管理与作业调度系统。它负责调度超过65%的TOP500系统的作业。大多数运行大规模AI训练的组织在Slurm作业脚本、公平共享策略和计费工作流方面已有多年投入。挑战在于,如何在无需维护两个独立环境的情况下,将Slurm的调度能力引入Kubernetes——大规模管理GPU基础设施的标准平台。
Slinky是一个由SchedMD(现为某机构的一部分)开发的开源项目,它通过两种方法实现这种集成:
本文聚焦于 slurm-operator,这也是某机构在Kubernetes上为大规模GPU训练集群运行Slurm的方式。文章将介绍该算子的架构、如何将Slurm守护进程映射到Kubernetes原语,然后涵盖部署——包括Slinky slurm-operator如何与现有基础设施集成。同时还会介绍使该模型实用的Kubernetes生态系统集成。最后,分享在某机构生产环境中运行Slinky的经验,该环境拥有超过1,000个GPU工作节点和8,000多个GPU。
Slinky slurm-operator将每个Slurm组件(用于调度的slurmctld、用于计费的slurmdbd、用于计算工作器的slurmd、用于API访问的slurmrestd)表示为一个Kubernetes自定义资源定义(CRD)。使用自定义资源定义Slurm集群,Slinky会创建容器化的Slurm守护进程,这些进程运行在各自的Pod中,并被配置为归属于各自的集群。
图1. Slinky CRD及其引用关系
Slinky通过Pod重建确保Slurm控制平面(slurmctld)的高可用性(HA),无需依赖Slurm原生的HA机制。配置更改会自动传播:Kubernetes将挂载的配置(ConfigMaps和Secrets)同步到控制平面Pod,该Pod检测到更改并将新配置传播给其工作器(slurmd),且调度器零停机。
借助Slurm原生的OpenMetrics支持和Prometheus监控(自Slurm v25.11起),可以根据集群指标和所需的扩缩策略,通过水平Pod自动扩缩器(HPA)对工作器进行自动扩缩,范围从单个Pod到每个可用的工作节点。在缩容时,Slinky会在终止Pod之前完全排空Slurm节点,确保正在运行的工作负载首先完成。Slinky会优先选择工作负载即将最快完成的Pod进行缩容。相同的“先排空后终止”流程也适用于滚动更新工作器Pod镜像(例如更新Slurm版本或操作系统补丁),因此升级不会中断正在运行的作业。
在Kubernetes上使用Slinky部署的Slurm集群与非容器化部署类似。Slinky slurm-operator会自动启用容器化操作所需的Slurm功能:
use_client_ids实现集群范围用户身份验证,无需每节点身份服务。图2. 使用Slinky在Kubernetes上部署的完整Slurm集群,包括登录Pod、工作器Pod自动扩缩、作业计费以及与身份和数据库服务的集成
Slinky可与现有数据库和身份基础设施配合使用。Slurm计费(slurmdbd)连接到任何兼容MySQL或MariaDB的数据库,无论该数据库是运行在集群内部还是作为外部托管服务。登录Pod的身份管理通过SSSD工作,因此Active Directory、LDAP或任何其他受支持的后端无需更改即可集成。Slurm 25.11允许slurmd在其容器内强制执行资源隔离(cgroups v2)。这意味着同一工作器上的多用户并发工作负载是完全隔离的。
Slinky为每个Slurm组件提供了参考容器镜像和Docker文件。可以直接使用这些镜像,用自有库和依赖项进行扩展,或者构建完全自定义的镜像,只要它们包含可运行的Slurm安装即可。
在Kubernetes上运行Slurm的操作收益来自于生态系统。无需为GPU管理、监控、网络和节点生命周期构建和维护单独的工具链,而是可以使用已经解决这些问题的Kubernetes工具。平台团队通过声明式YAML、Helm部署、滚动更新以及Prometheus或Grafana进行可观测性来管理集群。
某机构GPU Operator可自动执行GPU驱动程序安装、容器运行时配置和设备插件部署,使工作器Pod能够自动访问GPU。
某机构GPU Operator还会部署DCGM Exporter(一个GPU遥测收集器)。借助Slinky DCGM集成和HPC作业映射支持,可以启用按Slurm作业ID标记的每作业GPU指标,从而实现跨集群的工作负载级GPU监控。
要启用此功能,请在NVIDIA GPU Operator Helm值中添加以下内容:
dcgmExporter:
hpcJobMapping:
enabled: true
directory: /var/lib/dcgm-exporter/job-mapping工作器Pod挂载相同的目录,允许Slurm prolog/epilog脚本(在作业启动和完成时运行)写入作业映射文件,DCGM Exporter会自动拾取这些文件。
对于像某机构GB200 NVL72这样的GPU架构(其中GPU通过多节点NVLink跨节点通信),Slinky支持访问ComputeDomains。这是由某机构DRA驱动提供的Kubernetes抽象,用于动态管理节点间内存交换(IMEX)域,以实现高带宽GPU到GPU连接。
在某机构的部署中,Slinky使用集群范围的ComputeDomain(numNodes: 0),该域会随着节点加入或离开集群而自动将节点添加或移出IMEX域。这提供了:
SwitchType = switch/nvidia_imex以使用某机构IMEX进行跨节点GPU通信。TopologyParam=BlockAsNodeRank和TopologyPlugin=topology/block,确保分配经过排序,以便应用程序能够通过节点秩发现段。分布式训练作业在跨节点边界时实现完整的NVLink带宽,而ComputeDomains会在工作负载运行完成后自动创建和拆除IMEX域。
Slinky在Kubernetes和Slurm之间双向同步状态。Slurm节点状态(Idle、Allocated、Mixed、Down、Drain、Completing、Not Responding)会反映为Pod的条件,使操作员能够通过标准的Kubernetes工具了解Slurm状态。
当使用kubectl drain将节点移出进行维护时,排空状态和原因会自动同步到Slurm。运行活动工作负载的Pod受PodDisruptionBudgets保护,因此正在进行的作业不会被意外驱逐。
某机构在生产环境中跨多个集群运行Slinky slurm-operator,部分部署扩展到超过8,000个GPU。这些集群每天运行大规模LLM训练和多节点推理工作负载。GPU通信基准测试(NCCL all-reduce和all-gather)与非容器化Slurm部署的性能相匹配,Slinky所运行的Kubernetes层没有带来可测量的性能影响。使用Helm chart和声明式配置,新集群可以在数小时内从零开始运行作业,无需手动配置。在此规模下,在Kubernetes上运行Slurm的操作收益体现在:
kubectl。Pod条件暴露Slurm状态(Idle、Allocated、Drain),无需访问Slurm CLI,这意味着值班工程师可以使用他们用于其他所有任务的相同工具来排查Slurm问题。需要注意的一个限制:Slinky的slurm-operator目前假设每个节点一个工作器Pod。如果工作负载完全是单节点Slurm作业,这将相对于实际需求过度配置,轻量级集成(或slurm-bridge)可能更合适。Slinky部署模型在多节点作业调度中才能发挥最大价值。
最近发布的slurm-operator v1.1.0解决了生产部署相关的几个关键问题:
在更长远的规划中,团队正在致力于优雅的Slurm集群升级、计划内停机工作流、配置回滚以及结构化的守护进程日志记录。目标是使Slinky的操作模型符合平台团队对任何生产级Kubernetes工作负载的期望:声明式、自愈和可观测。
Slinky是开源的,现已可用。通过Helm安装slurm-operator,将Slurm集群定义为自定义资源,即可在一小时内让作业在Kubernetes上运行。slurm-operator快速入门指南将引导完成完整设置。
Kubernetes是GPU计算的正确基础设施基板,而Slurm是运行于其上的工作负载的一个极其强大的作业调度层。Slinky使这种组合在生产环境中无缝工作。我们计划持续投入,简化运行大规模AI训练基础设施的流程。如有疑问或想分享正在构建的内容,请访问GitHub上的SlinkyProject。FINISHED
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。