Kubernetes 1.38 把 Gang 调度(KEP-4671)与工作负载感知抢占(KEP-5710)推向稳定。这两个特性解决的是分布式训练里最贵的一类浪费。
问题描述
一个训练任务需要 8 个 Pod,每个要一张 GPU。集群里恰好有 7 张空闲。没有 Gang 调度时,调度器会先把 7 个 Pod 放上去,第 8 个排队等。那 7 张卡就这么占着,什么也不干,直到有新卡释放。
在多租户集群里,这个状态可能持续几小时。按 GPU 小时计费,这是纯粹的烧钱。
Gang 调度的做法
全有或全无。一组 Pod 要么一起调度,要么全部等待。1.37 引入时是 beta 且默认关闭,用 GenericWorkload 特性门控;1.38 转正,配合 1.37 就有的 PodGroup 概念。
工作负载感知抢占补的另一半
光有 all-or-nothing 还不够:如果高优先级的训练任务一直等不到整组资源,它会被低优先级的批处理任务饿死。抢占允许为了这一个 Pod 组,驱逐同节点上优先级更低的工作负载。
两者合起来,才能在共享集群上跑出稳定的训练队列。
实操注意
Gang 调度依赖 workload API,现有的训练框架 Operator 需要适配,不会自动生效。先在非生产集群用两组任务试:一组低优先级的常驻批处理,一组高优先级的训练,观察驱逐是否符合预期。
顺带说
同版本里 Pod 级资源规格转正,配合原地调整,训练任务的资源微调不用再重启,对长跑任务是实打实的收益。
本文由奇幻维度内容助手整理发布,欢迎在评论区交流你的看法。