账上还有两张空卡,训练为何仍在排队?
第 07 课的调度器决定哪个请求先做 prefill、哪些 decode 合在一起。集群调度器面对的是另一层:哪一个作业或服务实例可以占用哪台节点的设备、CPU 和内存。作业得到 GPU 后,内部仍有自己的请求队列。把在线请求优先级调高,不会让一个还没拿到设备的副本凭空启动。
节点是承载工作负载的机器;分配设备前,调度系统先筛掉不满足条件的节点,再从候选位置中选择。条件可能包括设备类型、空闲数量、主机内存、数据可达性和互联拓扑。Pending 表示尚未被安排运行,原因可以是容量不足,也可以是条件冲突。只汇总“空闲 GPU=2”,会把放置约束藏起来。
把准入、放置与请求调度分开问
准入先判断作业能否进入当前可运行集合;放置再决定具体位置;运行时调度决定已获资源如何服务内部工作。配额是租户使用资源的政策边界,不是立刻可拿到的设备预留。租户上限之和可以超过物理容量,但这不意味着这些上限都被同时保证。若确实承诺最低保障,就必须为其配置可满足的容量和争用规则。
第 05 课的同步训练还需要组语义。gang 是将一个作业达到最低规模所需的成员作为一组准入,避免只启动一部分 rank 就长期互等。它不表示进程在同一微秒启动,也不保证组内没有故障。最低规模、等待上限、部分启动失败如何清理,都应由使用的调度系统明确处理。
| 现象 | 主要观察对象 | 不能替代它的动作 |
|---|---|---|
| 租户已到资源上限 | 配额、借用与准入记录 | 修改模型 token 调度优先级 |
| 数量够,节点条件不匹配 | 节点、设备与拓扑分布 | 只增加队列重试频率 |
| 部分训练 rank 已启动但互等 | 组状态、进程日志与通信顺序 | 只看其中一个进程健康 |
| 服务实例已就绪,请求仍堆积 | 到达率、队列、KV 与运行时 | 把 Pending 当作唯一瓶颈 |
三租户、四张卡:先把每一个位置写出来
下面完全是教学安排,不模拟 Kubernetes 的所有策略。两台节点 N0、N1 各有两张完整独占 GPU;本例不允许把半张空闲算作可用设备。租户 A 的在线服务正在峰值时段,使用两个副本;B 提交双卡同步训练,因已验证的互联要求必须在同一节点;C 运行一张卡的可排队研究作业。使用上限分别为 A=2、B=2、C=1,这些是上限,不是合计五卡的容量承诺。
t=0 时只剩 N1 的一张卡,B 必须等待。t=10 分钟 C1 完成,空卡变成 N0、N1 各一张;两张加起来够,但 B 仍不能按同节点条件运行。这叫拓扑碎片:剩余资源的组合不满足任务。它与显存分配碎片不是同一个问题。
一份有条件的可行安排
在 t=10 确认进入低峰,且已有测试证明 A1 单副本在该负载下满足约束,才允许排空 A2。本例假设排空用 2 分钟,并确认没有在途请求后释放设备。t=12,B 两个 rank 同时被准入 N1,两卡共运行 20 分钟,到 t=32 释放。此时 A1 仍在 N0,N0 的另一张卡可供 C 的后续单卡作业。若低峰或单副本容量条件不成立,就不能执行这份安排,B 继续等或另找资源。
排程记录应逐时刻检查四张卡是否超配、A 是否守住服务约束、B 是否满足同节点和组规模、C 是否被说明等待原因。这里没有默认允许迁移正在运行的进程。把 A2 “挪过去”涉及新实例启动、预热、流量转移与旧实例排空,不能在纸面地图上挪一个方块就视为完成。
抢占能腾资源,但不能让已做的工作自动保存
抢占是为了更高优先级工作而终止或中断较低优先级工作,释放其资源。公平性决定谁应该获得多少机会,优先级决定冲突时谁先获得资源;两者都不能由单一利用率数字代替。短作业不断插队可能使长作业饥饿,因此还要说明最长等待、借用回收和人工升级条件。
在本例中即使抢占 C1,也只会提前形成“两节点各空一张”的局面,仍解决不了 B 的同节点约束。盲目抢占既损失 C 的工作,也没有启动 B。若确实要中断可恢复训练,应先确认最近完整 checkpoint、剩余退出时间及恢复入口;突然故障可能不给保存机会,计划内抢占也不保证应用在宽限期内写完。
安排到设备,不等于租户已经隔离
配额限制数量,不自动限制租户能读哪个数据集、使用哪个凭据或连接哪个服务。共享平台还要给作业绑定可审计身份,限制数据与制品访问,约束网络路径,并清楚规定日志与临时文件的归属。设备独占也不消除节点 CPU、内存、存储与网络竞争;时间共享或硬件分区还要单独验证性能和故障影响范围。
一个具体负例比一句“已做多租户”更有用:用 C 的身份尝试读取 A 的私有模型制品,预期拒绝并留下审计记录;C 占满自身额度后再提交,预期按策略排队或拒绝;同时增加 C 的存储负载,观察 A 的时延是否越线。这些需要真实平台验证,本课纸面安排只检查资源与政策逻辑,不宣称已经形成安全隔离。
为每个等待写一个可验证原因
依次查租户是否获准、整组是否满足规模、设备和节点条件是否匹配,再查进程是否就绪;请求层问题最后回到服务队列。保留提交条件和调度事件,区分“还没有尝试安排”“尝试但无位置”和“安排后启动失败”。观察到全局低利用率时,也可能是严格隔离、拓扑碎片或组等待,不能据此直接放松安全边界。
提交排程,以及被拒绝的备选方案
- 按 t=0、10、12、32 四个时刻列出四张卡的租户、作业和释放条件,指出 B 每次等待的具体原因。
- 陌生约束:A 必须始终跨两节点保持两个副本,B 又必须同节点双卡。在不改变四卡硬件且不抢占 A 的条件下,能否安排?
- 把 B 的要求改为允许跨节点,其他条件不变。说明最早可何时启动,以及第 05 课的哪项测量必须重做。
参考与验收
原安排中 t=0 容量不足,t=10 为拓扑碎片;t=12 只有已验证并排空 A2 才可把 N1 给 B,t=32 B 完成。陌生约束无解,应报告容量与约束冲突,不能只重试。允许跨节点时,C1在 t=10 完成后可用两张空卡组启动,但须验证跨节点通信、步时与恢复,不沿用同节点性能承诺。验收要求每一步占用不超过物理容量,同时说清谁在等待、为什么、等待会怎样结束。
把概念映射到实际调度器
阅读 Kubernetes 调度、抢占与驱逐,先区分 Pod 到 Node 的放置与终止工作负载的动作。读后选择你使用版本的组调度与设备资源文档,核对是否支持本例的最低组规模、拓扑条件和清理语义。不要把教学排程误当成一份复制即可部署的 Kubernetes 配置。
下一步:资源拿到了,哪个版本能接流量?
第 10 课继续处理获得资源之后的事情:模型制品如何加载、何时算就绪,以及新版本出现问题时哪些证据支持回退、限流或降级。
留下本课的产出
本课产出:三租户资源安排与拒绝理由。写下条件、证据、结果和仍不确定的事。保存不代表自动通过,下面的状态由你按验收条件自检。
记录只保存在当前浏览器。