ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Kubernetes + Ray + Volcano:云原生AI训练调度体系

Kubernetes + Ray + Volcano:云原生AI训练调度体系 Kubernetes Ray Volcano云原生AI训练调度体系的工程实践引言当大模型遇上Kubernetes的“能力边界”千亿参数大模型的训练动辄需要数百张GPU连续运行数周每秒TB级的AllReduce通信单次checkpoint可达数百GB。这种计算密集型、通信密集型、状态敏感、容错成本高的工作负载对调度系统提出了远超传统微服务的严苛要求。在这里插入图片描述Kubernetes已成为云原生基础设施的事实标准但默认调度器在面对AI训练任务时暴露出了三个致命短板不支持Gang Scheduling分布式训练要求一组Pod“要么全部启动要么一个都不启动”。默认调度器逐个调度Pod部分Worker启动后Head未调度即导致整个训练任务死锁拓扑感知缺失默认策略倾向于打散PodSpread而AI训练恰恰需要亲和性调度将通信频繁的Worker集中在同一机架甚至同一节点以减少跨节点通信延迟调度吞吐量不足当集群规模达到数千节点、数万Pod时默认调度器Pending队列堆积任务启动延迟达到分钟级Volcano KubeRay的组合正是为解决这三个问题而生的系统性方案。Volcano是CNCF首个且唯一的官方容器批处理系统提供Kubernetes原生调度器所不具备的批量调度、Gang调度和网络拓扑感知调度等能力KubeRay则是在Kubernetes上自动化部署和管理Ray集群的Operator。三者的分工清晰明确Kubernetes提供资源底座Ray执行分布式计算Volcano负责高性能调度。一、环境搭建从零部署KubeRay Volcano1.1 环境要求部署前确保满足以下条件已安装Volcano的Kubernetes集群正常运行Kubernetes 1.35及以上版本具备集群管理员权限1.2 安装Volcano# 使用Helm安装Volcanohelm repoaddvolcano https://volcano-sh.github.io/helm-charts helminstallvolcano volcano/volcano-nvolcano-system --create-namespace验证Volcano调度器是否正常运行kubectl get pods-nvolcano-system1.3 安装支持Volcano的KubeRay Operator从KubeRay v1.5.1版本开始所有KubeRay资源RayJob、RayCluster和RayService均支持Volcano的高级调度特性。安装时需通过--set batchScheduler.namevolcano启用Volcano集成helminstallkuberay-operator kuberay/kuberay-operator\--version1.5.1\--setbatchScheduler.namevolcano1.4 部署RayCluster下载官方示例配置并部署curl-LOhttps://raw.githubusercontent.com/ray-project/kuberay/v1.5.1/ray-operator/config/samples/ray-cluster.volcano-scheduler.yaml kubectl apply-fray-cluster.volcano-scheduler.yaml验证部署状态kubectl get pods-lray.io/clusterraycluster-volcano二、调度原理Volcano为Ray带来了什么2.1 Gang Scheduling解决“All or Nothing”的死锁困境Gang调度是Volcano最核心的能力。它要求一个作业的所有任务同时启动适用于分布式训练、大数据等场景。在KubeRay与Volcano的集成中gang调度的实现逻辑如下启用自动扩缩容时使用minReplicas进行gang调度禁用自动扩缩容时使用期望的副本数进行gang调度这确保了在支持灵活扩缩容行为的同时gang调度约束能够得到正确维护。在KubeRay中通过以下标签配置Volcano调度标签描述ray.io/priority-class-name为Pod调度分配Kubernetes优先级类volcano.sh/queue-name指定资源提交的Volcano队列volcano.sh/network-topology-mode配置网络拓扑感知调度模式volcano.sh/network-topology-highest-tier-allowed设置调度允许的最高网络层级一个典型的配置示例apiVersion:ray.io/v1kind:RayClustermetadata:name:raycluster-volcanolabels:volcano.sh/queue-name:training-queuespec:rayVersion:2.40.0headGroupSpec:rayStartParams:dashboard-host:0.0.0.0template:spec:containers:-name:ray-headimage:rayproject/ray:2.40.0resources:limits:nvidia.com/gpu:1workerGroupSpecs:-groupName:worker-groupreplicas:3minReplicas:3rayStartParams:{}template:spec:containers:-name:ray-workerimage:rayproject/ray:2.40.0resources:limits:nvidia.com/gpu:12.2 网络拓扑感知调度NVL72场景的杀手锏在NVL72等超大规模分布式训练场景中多个GPU通过NVLink域互联要求同一训练任务的Worker必须部署在同一个低延迟域内而非分散到集群各处。Volcano v1.14引入了subgroup-level的二级分组能力支持将PodGroup内的Pod划分为多个子组配置子组级别的gang调度确保子组内的Pod调度到同一个网络拓扑域如同一个HyperNode在Volcano调度体系中针对NVL72这类拓扑/块级作业调度分为三个层次Gang层Head和Worker一起启动作业级拓扑整个分配落在同一个粗粒度层级内分段级拓扑每个Worker段必须落在同一个NVLink域内KubeRay已经通过PodGroup和network-topology支持了前两层而第三层per-segment topology正在通过subGroupPolicy字段的引入来实现。对于高性能组可以要求特定工作组调度到同一HyperNode内以保证低延迟通信标准组则可能只需要同区域或同可用区即可。这种差异化的拓扑约束使得调度器能够独立满足每个组特定的性能域要求。2.3 Gang粒度抢占v1.15的里程碑Volcano v1.15.0引入的Gang-Aware Preemption解决了AI训练场景下最棘手的资源抢占问题。在传统Kubernetes调度中抢占以单个Pod为单位决策。当资源紧张时调度器可能从多个正在运行的训练任务中各抢一个Pod——表面上释放了资源实际上既打断了多个任务发起抢占的Gang也未必能凑齐minAvailable成功启动。v1.15.0的改进体现在两个层面被抢占方侧以Job/Gang为粒度组织被抢占候选区分冗余副本超出minAvailable的部分和关键副本优先驱逐冗余副本——驱逐它们不会打断任务。抢占方侧逐步累计可释放的资源当累计量足以覆盖抢占方Gang的整体需求时先做放置模拟——在释放后的资源视图上验证抢占方Gang能否整体调度成功——只有模拟通过才真正执行驱逐。这一机制从根本上避免了“抢了一堆Pod但谁都没跑起来”的尴尬局面。2.4 Volcano Job方式另一种部署选择除了KubeRay Operator方式Volcano还提供了通过Volcano Job配合Ray插件直接部署Ray集群的方式。Ray插件负责三件事配置Ray集群中Head和Worker节点的启动命令为Ray Head节点开放GCS、Ray Dashboard和Client Server三个端口创建映射到Ray Head节点容器端口的Service部署示例apiVersion:batch.volcano.sh/v1alpha1kind:Jobmetadata:name:ray-cluster-jobspec:minAvailable:3schedulerName:volcanoplugins:ray:[]svc:[]policies:-event:PodEvictedaction:RestartJobqueue:defaulttasks:-replicas:1name:headtemplate:spec:containers:-name:headimage:rayproject/ray:latest-py311-cpuresources:{}restartPolicy:OnFailure-replicas:2name:workertemplate:spec:containers:-name:workerimage:rayproject/ray:latest-py311-cpuresources:{}restartPolicy:OnFailure两种方式都可以充分利用Volcano的gang调度和网络拓扑感知调度能力。KubeRay Operator方式更适合需要自动化管理Ray集群生命周期的场景而Volcano Job方式则更轻量、更适合一次性任务。三、生产实践常见问题与调优3.1 多调度器共存如果需要某些Job使用Volcano、其他Job使用默认调度器必须部署多个独立的KubeRay Operator实例每个配置不同的batchScheduler.name# 部署使用Volcano的Operatorhelminstallkuberay-operator-volcano kuberay/kuberay-operator\--namespacevolcano-ray\--setbatchScheduler.namevolcano# 部署使用默认调度器的Operatorhelminstallkuberay-operator-default kuberay/kuberay-operator\--namespacedefault-ray\--setbatchScheduler.name3.2 RayJob的PodGroup生命周期管理当RayJob到达终态Complete/Failed时VolcanoBatchScheduler会删除PodGroup以释放队列资源。需要注意的是目前存在一个已知问题RayJob挂起时可能导致Volcano PodGroup泄漏占用队列资源生产环境中需关注此问题并及时清理。3.3 不同Worker组的差异化优先级对于不同的Worker组可以配置不同的Pod优先级workerGroupSpecs:-groupName:worker-high-priorityreplicas:2template:metadata:labels:ray.io/priority-class-name:high-priorityspec:containers:-name:ray-workerimage:rayproject/ray:2.40.0resources:limits:nvidia.com/gpu:1-groupName:worker-low-priorityreplicas:2template:metadata:labels:ray.io/priority-class-name:best-effortspec:containers:-name:ray-workerimage:rayproject/ray:2.40.0resources:limits:nvidia.com/gpu:13.4 队列与资源配额管理Volcano支持多层级队列结构和资源继承apiVersion:scheduling.volcano.sh/v1beta1kind:Queuemetadata:name:training-queuespec:weight:1reclaimable:truecapability:cpu:100memory:200Ginvidia.com/gpu:50通过队列可以实现多租户资源隔离和优先级控制确保不同团队的训练任务互不干扰。四、总结Kubernetes Ray Volcano的技术组合是针对大规模、高性能AI工作负载的系统性解决方案组件职责核心价值Kubernetes资源底座容器编排、服务发现、声明式APIRay分布式计算引擎分布式训练、超参数调优、模型服务Volcano高性能调度器Gang调度、拓扑感知、队列管理、Gang粒度抢占三者通过KubeRay Operator实现深度集成KubeRay负责Ray集群的自动化生命周期管理Volcano负责提供高性能调度能力。从Gang调度解决死锁困境到网络拓扑感知优化NVL72等超大规模训练再到v1.15的Gang粒度抢占——Volcano正在从批处理工具演进为AI-Native的统一调度平台。对于正在构建云原生AI基础设施的团队而言这套组合的价值已经过CNCF社区和大量生产环境的验证。它不是简单的“三个开源项目堆叠”而是一个定位清晰、分工明确、协同高效的AI工作负载运行平台。
返回列表