调度器
概述
调度器负责两项相关任务:
- 扩容: 为新模型实例选择最佳 Worker/GPU 放置位置。
- 缩容: 对已有模型实例进行排序,在减少副本时移除优先级最低的实例。
两个方向的调度均分为两个阶段:
- 筛选:找到实际能够运行模型的候选方案,即建立候选列表。
- 评分:为各候选方案评分,再选择最符合当前目标的方案。
扩容调度
1. Worker 基础筛选
调度器先对 Worker 列表进行基础筛选。此步骤主要检查非资源约束:集群、标签、后端兼容性、指定 GPU 以及本地路径可用性。
筛选链按以下顺序执行:
- 集群筛选器 仅保留模型目标集群内的 Worker。
- GPU 匹配筛选器 在模型明确指定 GPU 时,缩小 Worker 范围。
- 标签匹配筛选器 仅保留标签满足模型标签选择器条件的 Worker。
- 状态筛选器 仅保留处于
READY状态的 Worker。 - 后端框架筛选器 移除加速器或运行时能力与所选后端不匹配的 Worker。
- 本地路径筛选器 适用于明确指定 GPU 的
LOCAL_PATH模型,移除不存在所配置模型路径的 Worker。
仅通过基础筛选的 Worker 才会进入基于资源的筛选阶段。
2. 基于资源的候选方案筛选
此步骤同样属于筛选,但依据的是资源,而非元数据或 Worker 状态:该 Worker 或放置方案是否实际能提供足够的 RAM/VRAM 来运行模型?
不同模型类型采用不同方式确定资源需求:
- GGUF 模型: 使用 GGUF parser 估算资源需求。
- 其他模型类型: 由相应后端估算资源需求,例如 vLLM、SGLang、MindIE 或 VoxBox。
各后端能力不同,可用的回退方案也不同:
- vLLM、SGLang、MindIE: 主要使用基于 GPU 的放置方案,此处不采用纯 CPU 或部分卸载回退方案。
- GGUF、自定义后端、VoxBox: 使用 GGUF parser 估算模型资源需求,支持 GPU 卸载、部分卸载或 CPU 执行。
- 自定义后端、VoxBox: 支持 GPU 卸载或 CPU 执行。
随后依次评估候选方案,只要某项策略返回可运行方案,便停止尝试后续策略。通常按以下顺序执行:
- 单 Worker、单 GPU 一个 Worker 上的单个 GPU 足以满足模型需求。
- 单 Worker、多 GPU 单个 GPU 不足时,组合使用同一 Worker 上的多个 GPU。
- 跨 Worker 分布式推理 后端支持分布式执行时,可以使用多个 Worker 上的 GPU。
- 部分卸载或 CPU 执行 仅在模型类型及后端支持这些回退模式时使用。
需要注意以下细节:
- 资源匹配筛选在第一个产生候选方案的策略处停止。
- 分布式候选方案除了主 Worker 外,还可能包含从属 Worker。
- 在 Worker 基础筛选和资源匹配筛选阶段,均会遵循明确指定的 GPU 选择。
3. 候选方案评分
找到可运行的候选方案后,调度器通过评分器链对其评分,并选择总分最高的方案。
当前扩容评分包含:
- 放置评分器
- 模型文件本地性评分器
候选方案总分是所有已启用评分器分数之和。
放置评分器
扩容时始终启用放置评分器。
- Binpack 此策略旨在将尽可能多的模型实例“打包”到尽可能少的“箱子”(例如 Worker/GPU)中,优化资源利用率。目标是尽量减少使用的箱子数量,提高资源效率,在不超出容量的前提下尽可能充分利用每个箱子。模型实例会放置到剩余空间最少的箱子中,以减少各箱子的闲置容量。
- Spread 此策略尽量将多个模型实例均匀分散到不同 Worker 上,提高系统容错能力和负载均衡效果。
其他行为:
- 对于 GPU 放置方案,VRAM 压力的权重高于 RAM 压力。
- 对于纯 CPU 放置方案,仅考虑 RAM 利用率。
模型文件本地性评分器
模型文件本地性评分器倾向于选择已有所需模型文件、且文件处于 READY 状态的 Worker。
具体行为如下:
- 查找主模型文件已就绪的 Worker。
- 如果配置了推测解码,也会查找草稿模型文件已就绪的 Worker。
- 根据参与 Worker 中已持有这些文件的比例,为候选方案评分。
- 主模型文件本地性的权重高于草稿模型文件本地性。
4. 最终选择
评分后,调度器选择总分最高的候选方案,并将模型实例分配到该位置。
缩容调度
当期望副本数少于现有模型实例数时,控制器会对当前实例排序,优先删除排名最低的实例。
缩容使用独立的评分器链,对已有模型实例评分:
- 状态评分器
- 卸载层评分器
- 放置评分器
实例按得分升序排列,优先移除得分最低的实例。
状态评分器
状态评分器优先保留健康副本,因此不健康或尚未就绪的副本会优先成为移除候选。
卸载层评分器
对于上报 total_layers 和 offload_layers 的 GGUF 模型,此评分器倾向于保留已卸载更多层的实例:
- 完全卸载获得最高分。
- 部分卸载按比例评分。
- 没有卸载层元数据的实例从此评分器获得
0分。
缩容模式下的放置评分器
缩容复用同一放置评分器,但从移除角度评估已有放置方案,而不是选择新放置位置。评分仍体现模型的 binpack 或 spread 策略,但得分表示保留优先级,因此放置得分越低,越可能优先被移除。