集群工作负载分配:基于自然语言处理的语义软亲和性调度 Cluster Workload Allocation: Semantic Soft Affinity Using Natural Language Processing
用 LLM 将自然语言调度偏好翻译成 Kubernetes 软亲和性规则,实现意图驱动的集群调度
前置知识
Kubernetes 调度器与亲和性机制
Kubernetes 调度器(kube-scheduler)负责将 Pod 分配到合适的节点上运行。它使用两阶段决策:首先通过「过滤(Filter)」阶段排除不满足硬性约束的节点(如资源不足、有 NoSchedule 污点),然后在「打分(Prioritize)」阶段对剩余节点评分,选择得分最高的节点。亲和性(Affinity)分为硬亲和性(requiredDuringScheduling,必须满足)和软亲和性(preferredDuringScheduling,尽量满足),用户通过编写 YAML 配置文件中的 nodeAffinity、podAffinity、podAntiAffinity 和 topologySpreadConstraints 等字段来表达调度偏好。这些配置语法复杂、字段众多,对非专家用户构成显著的使用门槛。
本文的核心目标就是用自然语言替代这些复杂的 YAML 配置,理解 Kubernetes 调度机制是理解论文价值主张的基础。
语义解析(Semantic Parsing)
语义解析是自然语言处理(NLP)中的一个核心任务,目标是将非结构化的自然语言文本转换为结构化的、机器可执行的表示。传统方法包括基于规则的模板匹配、序列到序列模型(Seq2Seq)、以及基于草图(sketch-based)的槽位填充方法。近年来,大语言模型(LLM)在零样本或少样本设置下展现出强大的语义解析能力,能够直接将自由文本翻译为 JSON、SQL 等结构化格式,无需大量标注数据和模型微调。本文将这一技术应用于集群调度领域,将用户的自然语言调度偏好解析为结构化的意图(Intent)对象。
论文的核心技术贡献就是将 LLM 用作语义解析器,理解语义解析的任务定义和挑战是评估本文方法优劣的关键。
调度器扩展器(Scheduler Extender)
Kubernetes 提供了 Scheduler Extender 机制,允许用户通过 Webhook 方式在调度器的过滤和打分阶段注入自定义逻辑。扩展器暴露 /filter 和 /prioritize 两个 REST 端点,kube-scheduler 在自身插件执行完毕后,将候选节点列表发送给扩展器,扩展器返回每个节点的评分(0-100)。扩展器的权重(weight)可以设为最高值 100,使其评分在最终决策中占据主导地位。本文利用这一机制将 LLM 驱动的意图分析逻辑集成到 Kubernetes 调度流程中,无需修改 kube-scheduler 的源码。
理解 Scheduler Extender 的工作原理是理解本文系统架构如何与 Kubernetes 集成的关键,也是评估该方案可移植性的基础。
多目标优化与标量化
多目标优化(Multi-Objective Optimization, MOO)处理的是同时优化多个可能相互冲突的目标函数的问题。在集群调度中,最大化容错(将 Pod 分散到不同区域)与最小化网络延迟(将 Pod 集中在同一节点)就是典型的冲突目标。求解 MOO 问题的两种主要策略是:进化算法寻找 Pareto 前沿,以及标量化(Scalarization)——将多目标问题转化为单目标问题,最常见的是加权和方法。本文采用线性标量化策略,将多个调度意图的评分通过加权求和合并为一个总分,每个意图的权重由 LLM 的置信度和用户语义强度共同决定。
论文的评分模型本质上是一个加权和标量化方案,理解这一数学框架是读懂其评分公式和冲突解决机制的前提。
意图驱动系统(Intent-Based Systems)
意图驱动系统(IBS)是一类将高层人类目标自动翻译为底层系统配置的架构范式,最早广泛应用于意图驱动网络(IBN)和软件定义网络(SDN)领域。IBS 的典型闭环包括:意图摄取(捕获目标)、翻译(转换为正式策略)、验证(确保策略可执行)、执行(通过控制器编排策略)和保障(持续监控状态)。传统 IBS 使用领域特定语言(DSL)作为意图输入,虽然比直接配置更高级,但仍需要专业培训。本文提出用自然语言作为意图输入,利用 LLM 作为「通用翻译器」,将 IBS 范式引入集群调度领域。
本文的工作可以看作是 IBS 范式在集群调度领域的具体实例化,理解 IBS 的设计哲学有助于把握论文的定位和贡献。
研究动机
在大规模计算环境中,无论是云数据中心还是超算集群,调度器都是最关键的核心组件之一。现有的主流调度系统(如 Google Borg、Apache Mesos、SLURM、Kubernetes)虽然在资源管理和公平性方面已经相当成熟,但它们都有一个共同的痛点:用户必须使用严格的、机器可读的语法来表达调度偏好。以 Kubernetes 为例,一个开发者想表达「在欧洲的高性能节点上运行这个机器学习作业,最好不过载」这样的直觉需求,需要编写复杂的 YAML 文件,涉及 nodeAffinity、topologySpreadConstraints 等多个字段和加权值的配置。这个过程耗时、容易出错,且要求用户对系统有深入了解。论文通过一个具体场景说明了这一问题:在实验的基线配置中,实现一个「将 Pod 均匀分散到不同可用区」的行为就需要编写包含 maxSkew、topologyKey、whenUnsatisfiable、labelSelector 等多层嵌套结构的 topologySpreadConstraints 配置;而实现一个「与 database 和 cache 部署同区域但不与 logging-agent 同节点」的复合策略,则需要同时配置 podAffinity 和 podAntiAffinity 的多条规则,配置文件长达数十行。这种「语义鸿沟」——即人类意图与机器配置之间的巨大差距——是本文要解决的核心问题。
本文的目标是本文的具体目标是设计并实现一个基于大语言模型(LLM)的语义调度原型系统,使 Kubernetes 用户能够用自然语言(如英语、西班牙语、德语)表达调度偏好,系统自动将其翻译为结构化的调度指令并执行。论文提出了三个具体的、可衡量的目标:第一,验证 LLM 在将自然语言调度提示解析为结构化意图对象时的准确率,目标是在标准评估数据集上达到高 Subset Accuracy;第二,证明基于意图的调度器在放置质量上至少与传统 Kubernetes 配置相当,在某些场景下(如涉及量化元数据和冲突偏好)能够超越传统配置;第三,通过六个精心设计的场景全面验证系统在拓扑分散、资源亲和性、复杂共置、快速突发、量化偏好和冲突意图等典型调度场景中的有效性。
与已有工作不同的是,本文的独特切入点在于它不是在调度算法层面做创新(如强化学习调度策略),也不是在 LLM 模型层面做创新(如微调专用模型),而是在系统集成层面提出了一个全新的「语义软亲和性」范式。已有工作如 Decima(强化学习调度)和 DeepRM 等使用固定量化输入,没有自然语言用户界面;OpenDevin 等虽然展示了 LLM 解释 DevOps 命令的能力,但未涉及延迟敏感的调度路径;意图驱动网络(IBN)领域虽然有 NLP 翻译用户命令的研究,但尚未扩展到集群调度场景。本文抓住的被忽视的点是:调度偏好的表达本质上是一个「软」需求(soft affinity),而不是「硬」约束——用户说「最好在欧洲」不是「必须在欧洲」,这种软性的、带有强度和置信度的语义信息,正是 LLM 擅长提取而传统规则引擎难以处理的。论文通过将 LLM 的语义理解能力与 Kubernetes 的 Scheduler Extender 机制相结合,实现了从自然语言到调度决策的端到端管道,这是一个此前未被充分探索的方向。
核心方法
本文的方法可以用一个翻译比喻来理解:想象一个会议翻译员坐在开发者和 Kubernetes 调度器之间。开发者用自然语言说「把这个机器学习训练任务放在有 GPU 的节点上,最好分散到不同区域以保证高可用」,翻译员(LLM)将其拆解为两个结构化指令:「prefer_gpu(置信度 0.98,强度 1.5)」和「spread_zones(置信度 0.95,强度 1.0)」,然后调度器根据这些指令对候选节点打分并做出最优选择。技术路线上,系统由四个核心组件构成:一个本地 Kubernetes 集群(基于 Minikube 的 9 节点测试环境,模拟多区域多机架拓扑)、一个集群状态缓存(实时维护集群状态的内存镜像)、一个评分扩展器服务(Python Flask 微服务,实现自定义打分逻辑)、以及一个意图分析器(调用 AWS Bedrock 上的 LLM 进行语义解析)。整个流程是:用户在 Pod 注解中写入自然语言 allocation_hint → 扩展器在 /prioritize 阶段提取该提示 → 发送给意图分析器 → LLM 返回结构化 JSON → 扩展器根据意图对每个候选节点计算加权得分 → 归一化后返回给 kube-scheduler。
本文最核心的创新点是提出了「语义软亲和性(Semantic Soft Affinity)」的概念,这与已有的硬亲和性/反亲和性机制有本质区别。传统 Kubernetes 的软亲和性(preferredDuringScheduling)虽然也允许用户表达偏好,但它是语法层面的——用户必须用精确的 YAML 语法指定标签选择器、拓扑键和权重值。本文的语义软亲和性则是在语义层面工作的:用户用自然语言表达意图,LLM 负责理解语义并提取出意图类别、置信度和强度。更关键的是,系统为每个意图同时输出三个维度的信息——意图类型(如 prefer_gpu)、置信度(0.0-1.0,表示 LLM 对解析结果的确信程度)和强度(0.5/1.0/1.5,对应用户语言中的「也许」「一般」「必须」等修饰词)。这三个维度的乘积决定了该意图对最终评分的贡献权重,使得系统能够区分「必须在有 GPU 的节点上」和「最好在有 GPU 的节点上」这两种语义上相似但重要程度不同的需求。这种设计将人类语言中的模糊性和优先级差异转化为可计算的数值,是已有调度系统所不具备的能力。
方法步骤详情
系统的工作流程可以分为以下步骤:第一步,用户在 Kubernetes Deployment 的 Pod 模板中添加 allocation_hint 注解,写入自然语言调度偏好(如「这是一个关键的 ML 训练作业,必须在有 GPU 的节点上运行」)。第二步,当 kube-scheduler 为该 Pod 进行调度时,内置的过滤插件(如 NodeResourcesFit)先排除资源不足的节点,然后将候选节点列表发送给评分扩展器的 /prioritize 端点。第三步,扩展器从 Pod 注解中提取 allocation_hint 文本,先经过消毒函数去除潜在的恶意字符(防止提示注入攻击),然后发送给意图分析器。第四步,意图分析器将消毒后的文本嵌入到一个精心设计的提示模板(Prompt Template)中,该模板包含角色定义(「你是一个专家 AI 助手」)、关键指令(8 条详细规则)、意图列表(25 种预定义意图及其描述和元数据要求)、以及 JSON 输出示例,然后调用 AWS Bedrock 上的 LLM(默认使用 Amazon Nova Pro)。第五步,LLM 返回一个 JSON 对象,包含检测到的意图、每个意图的置信度、强度和元数据(如 prefer_gpu_cores: 4.0)。第六步,扩展器解析该 JSON,为每个候选节点计算评分:对每个意图,根据其类别应用不同的评估逻辑(二值偏好返回 0/1,避让惩罚返回 -2,分散逻辑返回基于最少负载的归一化分数),然后乘以基权重 $\beta = 100/|\mathcal{I}|$、置信度 $C_i$ 和强度 $W_i$。第七步,所有意图的评分求和得到每个节点的原始分,然后归一化到 [0,100] 区间,得分最高的节点被确定性地赋值为 100 分(平局时按字母序选择),其余节点限制在 [1,99]。第八步,评分返回给 kube-scheduler,调度器选择得分最高的节点放置 Pod。同时,该放置决策被写入本地短期缓存(TTL 10 秒),以便后续突发调度请求能够感知到尚未持久化到 etcd 的待处理放置。
技术新颖性
本文的技术新颖性体现在三个层面。第一,在概念层面,「语义软亲和性」是一个新的调度范式。已有工作要么关注硬约束(如 Kubernetes 的 requiredDuringScheduling),要么关注基于标签的软偏好(如 preferredDuringScheduling),但都没有引入「语义理解」这一维度。本文首次将 LLM 的自然语言理解能力嵌入到调度决策路径中,使得调度器能够理解「高性能」「关键任务」「最好在欧洲」这类模糊的、带有语义色彩的表达。第二,在系统设计层面,论文提出了「三维度意图评分」机制(类型 × 置信度 × 强度),这与传统的单一权重打分不同。置信度和强度的引入使得系统能够区分 LLM 的解析不确定性和用户的语义优先级,为调度决策提供了更丰富的信息维度。第三,在工程实践层面,论文实现了「有效 Pod 集合」(Effective Pod Set)的概念 $\mathcal{P}_{eff} = \mathcal{P}_{api} \cup \mathcal{P}_{local}$,通过将 API 确认状态与本地短期缓存合并,解决了突发调度场景下的竞态条件问题。这种混合状态模型在传统调度器中并不常见,是为适配 LLM 的异步特性而专门设计的。
实验结果
论文的实验评估分为两个主要部分。第一部分是意图识别准确率测试,使用一个包含 314 条提示的评估数据集(涵盖四个类别:分类与改写、组合复杂提示、强度与细微差异、噪声与无关输入)对 11 个 LLM 和一个正则表达式基线引擎进行了系统比较。结果表明,顶级模型表现卓越:Amazon Nova Premier 达到 97.45% 的 Subset Accuracy,Mistral Pixtral Large 达到 95.86%,Amazon Nova Pro 和 Claude 3 Sonnet 均达到 93.63%,Macro F1 分数均在 0.95 以上。相比之下,正则表达式引擎仅达到 29.62% 的 Subset Accuracy 和 0.38 的 Macro F1,且有 240 个假阴性(漏检意图),证明了 LLM 在语义理解上的不可替代性。较小的模型如 Nova Micro(78.03%)、Claude 3 Haiku(75.80%)和 Mistral 7B(68.79%)表现明显较差。在元数据提取准确率方面,Claude 3 Sonnet 最高(95.22%),Nova Pro 为 94.40%。系统还验证了多语言能力,西班牙语(47 条提示)准确率 93.62%,德语(62 条提示)准确率 90.32%。第二部分是调度质量测试,通过六个场景评估。场景 A(拓扑分散):基线和意图调度器均实现 3:3 的完美区域分散。场景 B(资源亲和性):两者均将全部 6 个 Pod 放置在有 GPU 标签的节点上(100%)。场景 C(复杂共置与反亲和性):两者均正确放置全部 6 个 Pod,避免了 logging-agent 节点。场景 D(突发共置):两者均将 20 个副本成功放置在同一节点。场景 E(量化资源偏好)是关键差异场景:基线调度器仅将 1/6(16.7%)的 Pod 放置在正确的高速网络节点上,而意图调度器成功放置了 6/6(100%),因为其高扩展器权重有效覆盖了其他默认评分插件的影响。场景 F(冲突意图):基线调度器因硬约束冲突导致 Pod 处于 Pending 状态无法调度,而意图调度器通过加权求和找到了最佳拟合解决方案,成功完成了调度。
查看结构化数据
| 任务 | 指标 | 本文 | 基线 | 提升 |
|---|---|---|---|---|
| 意图分类 - Subset Accuracy | Subset Accuracy | Nova Premier: 97.45%, Nova Pro: 93.63% | Regex 引擎: 29.62% | Nova Premier 比 Regex 提升 67.83 个百分点 |
| 意图分类 - Macro F1 | Macro F1 Score | Nova Premier: 0.98, Nova Pro: 0.95 | Regex 引擎: 0.38 | Nova Premier 比 Regex 提升 0.60 |
| 元数据提取准确率 | Metadata Accuracy | Claude 3 Sonnet: 95.22%, Nova Pro: 94.40% | Regex 引擎: 78.67% | Claude 3 Sonnet 比 Regex 提升 16.55 个百分点 |
| 量化资源偏好调度(场景E) | 正确放置率 | 意图调度器: 100%(6/6) | Kubernetes 默认调度器: 16.7%(1/6) | 提升 83.3 个百分点 |
| 冲突意图解析(场景F) | Pod 调度成功率 | 意图调度器: 成功调度 | Kubernetes 默认调度器: Pending(失败) | 从不可调度变为可调度 |
| 多语言意图识别 - 西班牙语 | Accuracy | Nova Pro: 93.62% | N/A | 验证多语言能力 |
| 多语言意图识别 - 德语 | Accuracy | Nova Pro: 90.32% | N/A | 验证多语言能力 |
局限与改进
论文在结论部分坦诚地指出了多个局限性。首先,最大的性能瓶颈是 LLM 调用的同步延迟:在当前原型中,LLM 调用嵌入在 /prioritize 的同步路径中,不同模型的 P95 延迟从 0.87 秒到 5.34 秒不等,这在生产环境中是不可接受的。其次,强度解读是最薄弱的环节:即使是表现最好的 Nova Premier 和 Mistral Pixtral Large,Overall Strength Accuracy 也仅为 71.79%,意味着约三分之一的情况下模型无法正确区分「必须」和「最好」这类语义修饰词。第三,元数据提取仍存在非平凡错误率:顶级模型如 Claude 3 Sonnet(95.22%)和 Nova Pro(94.40%)在复杂列表提取上仍有失误,例如将「avoid us-east-1a and us-east-1b」错误解析为 ['us-east-1'],或将「high memory」赋予默认值 1.0 使得 prefer_memory_gb 意图失效。第四,假阳性和假阴性问题:顶级模型仍有 10-17 个聚合假阳性(幻觉出用户未表达的意图)和 9-18 个假阴性(漏检用户明确表达的意图)。从我自己的观察来看,评估数据集的规模(314 条)相对较小,可能不足以充分暴露模型在极端情况下的失败模式;此外,所有实验都在 Minikube 模拟环境中进行,9 个节点的规模远小于真实生产集群,系统的可扩展性尚未得到验证。
独立分析的弱点
从独立分析的角度,本文存在以下几个值得改进的弱点。第一,加权和标量化策略在处理冲突意图时过于简单:论文在场景 F 中展示了系统能够「解决」冲突——但实际上它只是将冲突的软偏好简单求和,找到一个折中的节点,而不是真正理解冲突并做出有原则的权衡。例如,当用户同时说「集中部署」和「分散到不同区域」时,系统应该提示用户澄清优先级,或者使用 Pareto 前沿方法提供多个候选方案供用户选择。改进方向是引入层次化的目标优先级机制,让高强度意图优先于低强度意图,而不是简单加权求和。第二,LLM 调用的确定性保障不足:虽然论文设置了 temperature=0.0 来提高确定性,但 LLM 的输出本质上仍是概率性的,相同输入可能产生不同输出。在调度场景中,这种不确定性可能导致同一部署的不同 Pod 被分配到不同策略。改进方向是在 LLM 输出后增加确定性校验层,对结构化输出进行严格模式验证和归一化。第三,评估场景的选择可能存在选择偏差:六个场景中有五个(A-E)都展示了正面结果,只有场景 F 展示了限制。论文没有评估更多边界情况,如用户输入含错别字、使用方言或俚语、或给出极度模糊的提示(如「随便放」)。改进方向是构建更全面的压力测试数据集,覆盖真实用户可能产生的各种边缘输入。第四,单线程 Flask 架构严重限制了系统的实际可用性:在生产环境中,调度器需要处理大量并发请求,单线程串行处理会导致严重的性能瓶颈。这一问题在评估中被规避了,但在实际部署中会立即暴露。
未来方向
论文提出了几个明确的未来研究方向。首先是异步意图分析:将 LLM 调用从同步的 /prioritize 路径移到 MutatingAdmissionWebhook,在 Pod 创建时就完成意图分析并将结果存储在注解中,让调度器扩展器在打分时直接读取本地结果,消除同步延迟。其次是扩展评估数据集:已创建了 v2 版本数据集(包含多目标优化和矛盾提示两个新类别),未来应进一步扩大规模和覆盖范围。第三是 Pareto 前沿优化:用 Pareto 基础的评分替代简单加权和,在保留高强度意图优先级的同时,为低强度意图提供更有原则的冲突解决机制。第四是并行执行环境评估:将 Flask 替换为多线程/异步框架(如 FastAPI),在并发负载下评估系统的正确性和性能。第五是通用调度语法:将核心逻辑与 Kubernetes 解耦,设计一个抽象的中间格式,让 LLM 翻译自然语言到该格式,再由平台特定适配器转换为 Kubernetes、Mesos 或 SLURM 的指令,实现跨平台的语义调度。从论文成果可延伸的方向来看,结合强化学习和 NLP 模型进行意图驱动的软亲和性调度是一个有前景的混合方法,可以利用 RL 从历史调度结果中学习最优的权重分配策略,而不是依赖 LLM 提供的静态置信度和强度。
复现评估
在复现性方面,本文做得相对较好。评估数据集已公开发布在 HuggingFace Model Hub(lsliwko/poc-schedule-intent-evaluation),包含 v1(英文 314 条)、v1es(西班牙语 47 条)、v1ge(德语 62 条)和 v2(新增多目标和矛盾类别)四个版本。测试环境基于 Minikube + Docker 驱动,不需要真实的多节点集群,可以在单台机器上复现。然而,有几个复现门槛需要注意:首先,意图分析器依赖 AWS Bedrock 服务,需要 AWS 账户和相应的 API 访问权限(特别是 Amazon Nova Pro 模型),这对没有 AWS 资源的研究者是一个障碍;不过理论上可以替换为任何支持 JSON 输出的 LLM。其次,论文未提供完整的源代码仓库(只提供了数据集),评分扩展器服务和集群状态缓存的实现细节分散在论文正文中,复现者需要自行编写代码。第三,实验使用 Kubernetes 1.31.4 版本,不同版本的 Scheduler Extender API 可能存在差异。总体而言,有 Kubernetes 开发经验的工程师可以在 1-2 天内搭建测试环境并复现核心场景,但从零开始搭建可能需要更长时间。
论文图表
对比了 11 个 LLM 和 1 个正则表达式基线引擎在 314 条评估数据集上的表现,指标包括 Subset Accuracy、Macro F1、Precision、Recall、聚合真阳性/假阳性/假阴性、元数据准确率、强度准确率、置信度 MAE、平均/P95/最大响应时间。数据清晰展示了顶级模型(Nova Premier、Pixtral Large、Nova Pro、Claude 3 Sonnet)与较小模型(Nova Micro、Claude 3 Haiku、Mistral 7B、Jamba Mini、Llama 3B)之间的显著性能差距。
这是论文实验部分最核心的表格,提供了所有模型的全面定量对比,是评估 LLM 选择策略和系统可行性的关键依据。
展示了六个调度评估场景的完整 Kubernetes Deployment 配置(基线版本和 allocation_hint 版本),以及每个场景的目标、评估指标和实验结果。场景包括拓扑分散(A)、资源亲和性(B)、复杂共置与反亲和性(C)、突发共置(D)、量化资源偏好(E)和冲突意图解析(F)。其中场景 E 和 F 是最能体现意图调度器优势的场景。
这张表是调度质量评估的核心,通过具体的 YAML 配置和量化结果,直观展示了传统配置与自然语言配置的对比,以及两种调度器在不同场景下的行为差异。
展示了发送给 LLM 的完整提示模板,包含角色定义、8 条关键指令(分析用户提示、多语言语义映射、意图识别、元数据提取规则、置信度赋值、强度评估规则、输出格式、不可信输入处理)、完整意图列表、以及 JSON 输出示例。模板中特别强调了不要使用通配符、不要汇总列表、使用浮点数格式等细节规则。
提示模板是系统的核心工程资产,理解其设计细节对于复现和改进系统至关重要,也展示了 LLM 应用工程中「提示即代码」的设计理念。
展示了在 Minikube 测试环境中使用 kubectl get pods 命令查看所有命名空间中 Pod 的输出结果,用于验证调度决策的正确性。图中可以看到系统组件(kube-system 命名空间中的 etcd、kube-apiserver、kube-scheduler 等)和用户工作负载的分布情况。
这张图展示了实验验证的实际操作过程,帮助读者理解如何在测试环境中验证调度结果的正确性。