DisaggregatedSet 自动扩缩容:RoleScaler 如何为分离式推理按需动态扩容

发布时间:2026/10/6 14:33:42

DisaggregatedSet 自动扩缩容:RoleScaler 如何为分离式推理按需动态扩容 DisaggregatedSet 自动扩缩容RoleScaler 如何为分离式推理按需动态扩容【免费下载链接】lwsLeaderWorkerSet: An API for deploying a group of pods as a unit of replication项目地址: https://gitcode.com/gh_mirrors/lws2/lwsLeaderWorkerSetLWS项目推出的 DisaggregatedSet 自动扩缩容能力通过新增的 DisaggregatedSetRoleScaler简称 RoleScaler资源让 Kubernetes 上的分离式推理Disaggregated Inference服务能够按角色prefill、decode、encode独立动态扩容。本文将用通俗易懂的方式带你理解 RoleScaler 的工作原理、配置步骤与最佳实践让你快速掌握这套为 LLM 推理量身打造的自动扩缩容方案。为什么分离式推理需要按角色动态扩容在 vLLM、SGLang 等主流 LLM 推理框架中一次请求会被拆分成多个阶段分别由不同的角色role处理prefill预填充处理输入 Prompt生成 KV Cache属于计算密集型瓶颈通常在算力decode解码逐 token 生成输出属于内存带宽密集型瓶颈通常在显存带宽encode编码可选的上下文编码阶段资源需求与前面两者又不一样这三个角色的资源瓶颈完全不同流量高峰也往往只集中在某一个阶段。如果整组服务一起扩容要么浪费昂贵的 GPU 资源要么响应不过来。这正是 DisaggregatedSet 自动扩缩容要解决的核心问题让 prefill 和 decode 各自独立地按需伸缩互不干扰。传统扩缩容方式的两个痛点在 RoleScaler 出现之前给 DisaggregatedSet 做自动扩缩容非常痛苦子资源名字不稳定DisaggregatedSet 管理的是多个 LeaderWorkerSetLWS而每个 LWS 的名字里都带有 revision 哈希例如my-ds-0-6ad7c921-prefill。每次滚动更新哈希都会变化指向旧名字的 HPA 就变成了孤儿必须手动重建。无法表达只扩 prefillDisaggregatedSet 聚合了多个角色单一的/scale子资源无法表达把 prefill 从 5 扩到 8但 decode 保持不动这种诉求。RoleScaler 的出现恰好同时解决了这两个问题。RoleScaler 是什么一个角色一个稳定的扩缩容目标DisaggregatedSetRoleScaler是一个轻量级 CRDCustom Resource Definition为 DisaggregatedSet 的每一个角色暴露标准的/scale子资源。它的核心设计是自动创建只要你在角色的配置里声明scaling.mode: ExternalDisaggregatedSet 控制器就会自动创建对应的 RoleScaler无需手工编写命名确定RoleScaler 的名字固定为DisaggregatedSet名称-角色名例如my-llm-prefill并且与 revision 哈希无关无论滚动更新多少次这个目标始终稳定生命周期托管RoleScaler 由 DisaggregatedSet 持有owner referenceDisaggregatedSet 删除时它会自动被回收角色改回静态模式后控制器也会顺手把它清理掉这段逻辑的核心实现可以参考 scaler_manager.go 与 CRD 定义 disaggregatedsetrolescaler_types.go。动态扩容的完整链路从 HPA 写入到 Pod 扩容RoleScaler 自动扩缩容的完整工作流程如下自动扩缩容器写入 /scale → RoleScaler.spec.replicas 更新 → 触发 DisaggregatedSet 控制器 → 驱动对应角色的 LeaderWorkerSet → Pod 扩容拆开来看每一环都经过精心设计写入端HPA、KEDA 或任何支持/scale的控制器通过标准接口把期望副本数写入 RoleScaler 的spec.replicas读取端DisaggregatedSet 控制器每次调谐reconcile时读取该值并驱动底层对应角色的 LeaderWorkerSet回写端控制器把当前实际副本数写回status.replicas并维护一个只匹配 leader Pod 的status.selectorworker-index0保证 HPA 在做每 Pod 指标平均时除数与被除数口径一致——这对leaderWorkerTemplate.size 1每个组有多个 worker的场景至关重要快速上手给分离式推理接入 HPA 自动扩缩容的步骤配置过程非常简单只需要两步第一步在 DisaggregatedSet 中把角色标记为 ExternalapiVersion: disaggregatedset.x-k8s.io/v1 kind: DisaggregatedSet metadata: name: my-llm-serving spec: roles: - name: prefill scaling: mode: External # 交给外部自动扩缩容器管理 spec: leaderWorkerTemplate: size: 2 # ... 容器配置 - name: decode spec: replicas: 4 # decode 保持静态 leaderWorkerTemplate: size: 1 # ... 容器配置第二步创建一个指向 RoleScaler 的 HPAapiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: my-llm-prefill spec: scaleTargetRef: apiVersion: disaggregatedset.x-k8s.io/v1 kind: DisaggregatedSetRoleScaler name: my-llm-serving-prefill # 固定命名DS名-角色名 minReplicas: 2 maxReplicas: 20 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50应用到集群后控制器会自动创建my-llm-serving-prefill这个 RoleScalerHPA 即刻开始工作。你随时可以用kubectl get dsrsRoleScaler 的短名查看期望副本数与当前副本数。 一个贴心细节控制器在创建 RoleScaler 时会做好种子值处理——全新角色默认种子为 1避免 HPA 读到 0 而进入 ScalingDisabled 死锁从静态模式切换过来的角色则继承当前副本数避免线上服务瞬间被排空。支持从零扩容的 KEDA 或开启 HPAScaleToZero 的 HPA 仍可在此基础上继续缩到 0。滚动更新与自动扩缩容如何和平共处生产环境中扩容和发版往往同时发生。RoleScaler 在这方面做了两个关键设计selector 跨 revision 聚合滚动更新期间新旧两个 revision 的 LWS 会短暂共存。RoleScaler 的status.selector不区分 revisionHPA 看到的是整个在服务集群指标计算不会因版本切换而抖动滚动更新期间禁止缩容回退规划器planner保证新 revision 的目标副本数不会低于当前在途值。如果 HPA 在滚动更新中途发来缩容指令新版本只会停止增长、不会收缩等滚动更新完成后再完全跟随 HPA 的指令这套交互设计的完整推导见设计文档 keps/849-DisaggregatedSet-HPA/README.md有完整的故事场景与风险分析。使用 RoleScaler 的注意事项与最佳实践为了让自动扩缩容稳定运行有几点需要特别留意当前仅支持单 slicescaling.mode: External目前要求spec.slices保持默认值 1多 slice 场景正在设计中一个角色一个 HPAprefill、decode 各自绑定独立的 HPA/KEDA避免互相干扰不要手写 RoleScaler它会由控制器自动管理如果你手工创建同名对象且不属于当前 DisaggregatedSet控制器会拒绝接管并发出警告事件资源指标需要 metrics-server像上面的 CPU 指标示例需要集群中已安装 metrics-server想退出外部扩容把角色的scaling.mode改回Static或移除scaling字段即可控制器会自动删除对应的 RoleScaler总结DisaggregatedSet 自动扩缩容通过 RoleScaler 这个轻量设计把按角色独立扩容变成了 Kubernetes 生态的标准操作你只需要声明scaling.mode: External并创建一个 HPA剩下的都由控制器自动完成。对于运行分离式 LLM 推理的团队来说这意味着 GPU 资源可以真正按需伸缩让 prefill 和 decode 各自应对自己的流量高峰既不浪费算力也不拖累体验。如果想深入了解配置细节可以参考仓库中的 config/samples/disaggregatedset_v1_3role.yaml 示例文件直接 clone 项目后即可在本地环境复现这套自动扩缩容能力。【免费下载链接】lwsLeaderWorkerSet: An API for deploying a group of pods as a unit of replication项目地址: https://gitcode.com/gh_mirrors/lws2/lws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/10/3 4:15:12

099、电机控制中的电磁兼容设计

099、电机控制中的电磁兼容设计 从一块烧掉的驱动板说起 去年夏天,我接手了一个伺服驱动器项目。客户反馈说,在产线上跑得好好的,一到客户现场就随机炸管——IGBT模块烧得连引脚都分不清。我带着示波器和近场探头飞过去,发现客户车间里有一台大功率电焊机,离驱动器不到三…

2026/10/6 14:29:16

Java局部变量详解:作用域、生命周期与Android内存管理实战

1. 先搞清楚:局部变量到底是个啥我经常在带新人或者看别人代码评审的时候,发现一个很有意思的现象:很多人能把Android的四大组件、消息机制、Binder这些大框架讲得头头是道,结果写个onClick方法,里面的局部变量却用得一…

2026/10/6 14:29:16

Hyperframe:用Pandas处理嵌套表格数据的实战指南

数据不总是方的:Hyperframe与我处理嵌套表格数据的一点实践1. 核心概念:当“表格里的单元格”本身也是一张表先说结论:Hyperframe解决的是一个很具体、但几乎每个做数据分析的人都会撞上的痛点——你的数据不是矩形的。绝大多数人接触Pandas的…

2026/10/6 14:29:16

AI Agent 实时搜索接入实战:SERP MCP 协议与工程落地

1. 为什么 AI Agent 需要实时搜索能力做过 AI Agent 项目的人都有一个共同体会:模型本身很聪明,但它的知识是有截止日期的。你问它今天有什么新闻、某个产品的最新价格、某个技术的最新版本号,它要么答不上来,要么一本正经地编一个…

2026/10/6 14:29:16

Cadence Sigrity高速PCB仿真入门:从安装配置到SI/PI实战全流程

搞高速数字板卡这一年多,我最大的感受就是:示波器能告诉你板子有问题,但很难告诉你问题在哪、为什么会有。眼图塌了、误码率上去了,你能测到结果,却很难直接看到是哪段走线、哪个过孔、哪层参考面在拖后腿。真正把问题…

2026/10/6 14:29:16

Codex CLI 多 MCP 工作台配置指南:Ace Data Cloud 统一管理

1. 为什么要把 Codex CLI 改造成多 MCP 工作台 Codex CLI 刚出来那阵子,我身边不少朋友的第一反应是"又一个命令行 AI 工具",装完跑两条命令就扔在一边了。但真正把它当日常主力用下来的人会发现,它真正的价值不在于单次问答&#…

2026/10/6 14:24:16

软件工程课程设计:酒店管理系统从用例图到代码落地的完整指南

简介:一套面向软件工程课程设计的酒店管理系统完整项目,适合软件工程、数据库及管理信息系统课程的本科生作课程设计参考。项目模拟酒店实际运营流程,划分系统用户、客房标准、客房信息、订房信息与结算信息五大核心模块,覆盖权限…

2026/10/5 6:32:56

Jev+Agent接管浏览器:browser-use实战与jev-ultrafast性能优化

1. 从“Jev”说起:为什么我要把Agent接进浏览器“Jev”这个词最近在圈子里出现的频率越来越高,很多人第一次听到会以为是某个新模型的名字,其实它更像是一种思路——把Jev模型的能力当作底座,通过Agent的方式去接管浏览器&#xf…

2026/10/6 4:01:51

多智能体集群实战:DeepAgents编排、MCP与A2A协议及Skills体系

1. 从"单兵作战"到"集群协同":多智能体编排到底在解决什么问题如果你最近在折腾 Agent 相关的东西,大概率会有一种感觉:单个 Agent 能做的事情,其实很快就摸到天花板了。你给它一个提示词,挂几个工…

2026/10/5 17:38:27

无源低通滤波器设计实战:从RC到LC,手把手教你避开那些坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/6 0:03:23

MR25H40CDF+STM32F031C6工业级高可靠数据存储方案

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的 PLC 控制柜里、在风电变流器的散热片背面、在矿井监测终端的金属外壳下,你经常能看到一块指甲盖大小的黑色芯片——它既不是 Flash,也不是…

2026/10/6 0:03:23

MRAM+STM32工业断电数据保全实战指南

1. 项目概述:为什么在工业现场非得用 MR25H40CDF 配 STM32F031C6 做数据存储?在工厂产线的PLC柜里、在野外无人值守的环境监测终端里、在高速运转的包装机控制板上,你经常能看到一块指甲盖大小的黑色芯片,旁边贴着“MR25H40CDF”丝…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑