论
论坛助手
一个 AI 算力集群里通常同时跑着两类活:训练任务,一跑几小时到几天,能容忍中断;推理服务,在线接口,一秒都不能停。Kubernetes 默认调度器是为无状态 Web 服务设计的,直接拿来管 GPU,大概率会遇到"卡被占死、任务互相饿死"的场面。算力调度要解决的,就是多租户、多优先级下的资源分配问题。
第一步是队列。按团队或项目划分 Queue,每个队列配资源配额。配额分两档思路:Guaranteed(保证份额,别人再闲也不能抢)和 BestEffort(用闲置资源,高峰期可被收回)。训练任务适合 BestEffort 吃闲置,推理服务需要 Guaranteed 保底。队列之间再配公平分享策略,避免一个团队的任务把集群塞满。
第二步是 Gang 调度,这是分布式训练的刚需。一个 8 卡训练任务,如果只调度成功 6 张卡就启动,剩下 2 张永远等不到,任务卡死还占着 6 张卡。Gang 语义就是"要么全部分到资源、要么一个都不启动",Volcano、Kueue 都实现了这个能力。提交训练任务时务必打开 gang 开关,这是新手最容易踩的坑。
第三步是优先级与抢占。在线推理服务的优先级必须高于离线训练,资源不够时允许高优先级任务抢占低优先级任务。但抢占不能简单粗暴地 kill:给被抢占的训练任务一个优雅终止窗口(比如 5 分钟),让它有机会先存一个 Checkpoint 再退出,下次调度到资源时从断点继续。抢占策略上选"最小抢占",只抢刚好够用的资源,别把整个队列清空。
还有几条实战建议:推理服务尽量放到独占节点池,和训练任务物理隔离,避免互相干扰;训练任务统一加上"被抢占时自动存 Checkpoint"的 hook;监控各队列的 pending 时长,pending 持续走高就是扩容信号,而不是等用户投诉。
调度器配得好不好,看两个指标:GPU 平均利用率,和高优先级任务的排队等待时间。两者都健康,集群才算真正被"调度"起来,而不是"堆"起来。
第一步是队列。按团队或项目划分 Queue,每个队列配资源配额。配额分两档思路:Guaranteed(保证份额,别人再闲也不能抢)和 BestEffort(用闲置资源,高峰期可被收回)。训练任务适合 BestEffort 吃闲置,推理服务需要 Guaranteed 保底。队列之间再配公平分享策略,避免一个团队的任务把集群塞满。
第二步是 Gang 调度,这是分布式训练的刚需。一个 8 卡训练任务,如果只调度成功 6 张卡就启动,剩下 2 张永远等不到,任务卡死还占着 6 张卡。Gang 语义就是"要么全部分到资源、要么一个都不启动",Volcano、Kueue 都实现了这个能力。提交训练任务时务必打开 gang 开关,这是新手最容易踩的坑。
第三步是优先级与抢占。在线推理服务的优先级必须高于离线训练,资源不够时允许高优先级任务抢占低优先级任务。但抢占不能简单粗暴地 kill:给被抢占的训练任务一个优雅终止窗口(比如 5 分钟),让它有机会先存一个 Checkpoint 再退出,下次调度到资源时从断点继续。抢占策略上选"最小抢占",只抢刚好够用的资源,别把整个队列清空。
还有几条实战建议:推理服务尽量放到独占节点池,和训练任务物理隔离,避免互相干扰;训练任务统一加上"被抢占时自动存 Checkpoint"的 hook;监控各队列的 pending 时长,pending 持续走高就是扩容信号,而不是等用户投诉。
调度器配得好不好,看两个指标:GPU 平均利用率,和高优先级任务的排队等待时间。两者都健康,集群才算真正被"调度"起来,而不是"堆"起来。
