SGLang + Kubernetes 实战:高效管理GPU资源
1. 背景与挑战
大语言模型(LLM)推理服务正迅速成为企业级应用的核心基础设施。在生产环境中,性能、稳定性与成本之间的平衡是决定系统成败的关键因素。随着模型规模的持续扩大,传统单体式推理架构已难以满足高并发、长上下文场景下的需求。
当前主流的推理架构演进方向包括 Prefill-Decode(PD)分离、Attention-FFN 解耦以及 KVCache 外置等。其中,KVCache 显存占用在长上下文或高并发请求下常超过 GPU 总显存的 70%,仅依赖 GPU HBM 和 CPU DRAM 已无法支撑大规模部署。将 KVCache 解耦并外置至专用缓存层,不仅能突破存储容量瓶颈,还能实现跨请求缓存共享、弹性伸缩和故障隔离。
SGLang 是一个专注于提升大模型推理效率的框架,其核心优势在于通过 RadixAttention 提高三到五倍的 KVCache 命中率,并支持结构化输出与 DSL 编程接口。然而,在 Kubernetes 环境中高效管理 SGLang 推理服务及其依赖组件(如分布式 KVCache 存储),仍面临诸多挑战:
- 部署复杂性:PD 分离架构涉及多个角色(Prefill、Decode、Router、KVCache 存储等),各角色之间存在强依赖关系,Kubernetes 原生 Workload 难以表达这种协同语义。
- 升级过程中的状态丢失:滚动更新时旧 Pod 终止导致内存型 KVCache 数据丢失,引发活跃会话需重新执行 Prefill 计算,造成 P99 延迟毛刺和吞吐断崖。
- 拓扑敏感性:推理性能对 NVLink、RDMA、NUMA 等硬件拓扑高度敏感,不当调度会导致显著性能劣化。
为解决上述问题,RoleBasedGroup(RBG)应运而生。作为面向 AI 推理的 Kubernetes 原生 API 抽象,RBG 将多角色协同编排作为一等公民,统一管理计算节点与缓存节点的生命周期,确保部署、升级、扩缩容过程中的一致性和高性能。
本文将结合SGLang-v0.5.6镜像,详细介绍如何基于 RBG 在 Kubernetes 上构建稳定高效的 PD 分离推理系统,并集成 Mooncake 实现分布式 KVCache 外置。
2. SGLang 核心技术解析
2.1 RadixAttention:提升 KVCache 命中率
SGLang 的核心优化之一是 RadixAttention,它使用基数树(Radix Tree)来组织和管理多个请求间的 KVCache 共享。在多轮对话场景中,用户的历史 prompt 往往具有高度重复性,RadixAttention 可让不同请求复用已计算的部分 KVCache,从而大幅减少冗余计算。
相比传统逐 token 比较的方式,RadixAttention 能够以 O(log n) 时间复杂度完成前缀匹配,实测缓存命中率可提升 3–5 倍,显著降低首 Token 返回时间(TTFT)。
2.2 结构化输出:约束解码能力
SGLang 支持通过正则表达式或 JSON Schema 对生成内容进行格式约束,直接生成符合预期结构的输出。这一特性对于需要调用外部 API 或进行数据提取的任务尤为关键,避免了后处理阶段的解析错误和重试开销。
例如,以下代码可强制模型返回合法 JSON:
import sglang as sgl @sgl.function def generate_json(question): return sgl.gen("answer", regex=r'\{.*\}', max_tokens=100)2.3 前后端分离设计:DSL + 运行时优化
SGLang 采用前后端分离架构:
- 前端 DSL:提供简洁的 Python 脚本语法,用于描述复杂的推理逻辑(如多跳问答、工具调用、条件分支等);
- 后端运行时:专注于调度优化、批处理、注意力计算加速和多 GPU 协作。
这种设计使得开发者既能快速编写复杂逻辑,又能获得接近手写 C++ 的执行效率。
3. Mooncake:分布式 KVCache 存储引擎
3.1 架构组成
Mooncake 是 SGLang HiCache 的 L3 分布式缓存后端,专为大模型推理设计,主要由两个核心组件构成:
- Master Service:负责集群元数据管理、节点注册、负载均衡策略分发;
- Store Service:实际承载 KVCache 数据的分布式存储节点,支持 RDMA 加速、零拷贝传输和多副本容错。
3.2 关键特性
| 特性 | 说明 |
|---|---|
| RDMA 加速 | 利用 InfiniBand 或 RoCE 实现微秒级网络延迟,提升跨机缓存访问速度 |
| 零拷贝机制 | 减少 CPU 内存拷贝开销,提高 I/O 效率 |
| 智能预取 | 根据请求模式预测并提前加载可能用到的 KVCache |
| GPU 直传 | 支持从 Store 节点直接写入 GPU 显存,绕过主机内存 |
3.3 启动命令示例
# 启动 Master mooncake_master --http_metadata_server_port=9080 # 启动 Store 服务 python -m mooncake.mooncake_store_service --config=config.json # 启动 SGLang 并启用 Mooncake 后端 python -m sglang.launch_server \ --enable-hierarchical-cache \ --hicache-storage-backend mooncake \ --model-path /models/Qwen3-235B4. RoleBasedGroup(RBG):面向推理的编排引擎
4.1 设计理念
RBG 将一次完整的推理服务视为一个“角色有机体”,每个角色(Role)代表服务中的一个功能单元(如 Prefill、Decode、Router、Mooncake Store 等)。RBG 提供 SCOPE 能力框架,涵盖稳定性、协同、编排、性能和可扩展性五大维度。
4.2 SCOPE 核心能力详解
4.2.1 Stable:拓扑感知的确定性运维
RBG 为每个 Pod 注入全局唯一的 RoleID,并遵循“最小替换域”原则,在升级或重建时尽量保持在同一 NUMA 节点或 NVLink 域内,避免因拓扑漂移引起的性能抖动。
roles: - name: prefill replicas: 3 rolloutStrategy: rollingUpdate: type: InplaceIfPossible maxUnavailable: 14.2.2 Coordination:跨角色协同策略
RBG 支持声明式定义角色间协同关系,包括:
- 成组部署(如 Prefill 与 Decode 按比例配对)
- 联合升级(保证协议兼容性)
- 故障联动(某角色异常时触发关联动作)
coordination: - name: pd-co-update type: RollingUpdate roles: - prefill - decode strategy: maxUnavailable: 5% maxSkew: 1%4.2.3 Orchestration:内置服务发现
RBG 在 Pod 启动时自动注入完整拓扑信息(IP、端口、角色属性等)到环境变量或配置文件中,推理引擎可直接读取本地配置完成初始化,无需依赖 Consul、etcd 等外部服务发现系统。
4.2.4 Performance:拓扑感知调度
RBG 支持多级亲和性约束,优先将相关角色调度至同一物理机或 RDMA 网络域内,保障低延迟通信。同时支持同角色实例的均衡分布,防止单点过载。
4.2.5 Extensible:声明式抽象
RBG 使用 YAML 定义角色模板和关系,新架构可通过插件方式快速接入,无需修改核心代码。例如新增路由层或缓存层级,只需扩展配置即可。
5. 基于 RBG 部署 PD 分离 + Mooncake 架构
5.1 系统架构概览
整个系统包含以下核心角色:
| 角色 | 职责 |
|---|---|
| Router | 请求入口,智能路由至合适的 Prefill/Decode 节点 |
| Prefill Backend | 执行 Prompt 编码,生成初始 KVCache |
| Decode Backend | 自回归生成 token,依赖 KVCache 进行高效推理 |
| Mooncake Master | 管理缓存集群元数据 |
| Mooncake Store | 分布式 KVCache 存储节点 |
所有角色通过 RBG 统一编排,形成一个协同工作的有机整体。
5.2 部署步骤
步骤 1:安装 RBG 控制器
kubectl apply -f https://raw.githubusercontent.com/sgl-project/rbg/main/config/crd/bases/workloads.x-k8s.io_rolebasedgroups.yaml kubectl apply -f https://raw.githubusercontent.com/sgl-project/rbg/main/config/default/步骤 2:准备镜像
使用官方镜像lmsysorg/sglang:v0.5.6,该镜像已内置 Mooncake transfer-engine >= 0.3.7。
若需定制,可参考 Dockerfile.mooncake 构建。
步骤 3:部署服务
应用示例 YAML 文件:
kubectl apply -f https://raw.githubusercontent.com/sgl-project/rbg/main/examples/mooncake/pd-disaggregated-with-mooncake.yaml步骤 4:验证部署结果
kubectl get pods -l rolebasedgroup.workloads.x-k8s.io/name=sglang-pd-with-mooncake-demo预期输出:
NAME READY STATUS RESTARTS AGE sglang-pd-with-mooncake-demo-router-0 1/1 Running 0 2m sglang-pd-with-mooncake-demo-prefill-0 1/1 Running 0 2m sglang-pd-with-mooncake-demo-decode-0 1/1 Running 0 2m sglang-pd-with-mooncake-demo-mooncake-master-0 1/1 Running 0 2m sglang-pd-with-mooncake-demo-mooncake-store-bh9xs 1/1 Running 0 2m ...步骤 5:检查网络拓扑一致性
kubectl get pods sglang-pd-with-mooncake-demo-mooncake-store-dsrv4 -o jsonpath='{.spec.nodeName}' kubectl get pods sglang-pd-with-mooncake-demo-mooncake-store-dsrv4 -o jsonpath='{.status.podIP}'确保升级前后节点和 IP 不变,保障缓存本地持久化的有效性。
6. 性能测试与效果分析
6.1 测试环境
- 模型:Qwen3-235B-A22B
- 输入长度:2048 tokens
- 客户端数:150
- 请求速率:16 req/s
- 多轮对话轮次:10
6.2 测试结果对比
| 配置 | 缓存命中率 | 平均 TTFT (s) | P90 TTFT (s) | InputToken 吞吐 (token/s) |
|---|---|---|---|---|
| Baseline(仅 GPU) | 12.3% | 5.91 | 12.16 | 6,576.85 |
| L2 DRAM HiCache | 40.62% | 3.77 (-36.2%) | 10.88 | 10,054.21 (+52.89%) |
| L3 Mooncake + L2 | 78.4% | 2.58 (-56.3%) | 6.97 (-42.7%) | 15,022.80 (+49.41%) |
结果显示,引入 Mooncake 作为 L3 缓存后,TTFT 下降超过一半,InputToken 吞吐提升近 2.3 倍,充分验证了分级缓存架构的有效性。
6.3 测试命令
python3 benchmark/hicache/bench_multiturn.py \ --model-path /models/Qwen3-235B/Qwen3-235B-A22B \ --dataset-path ShareGPT_V3_unfiltered_cleaned_split.json \ --disable-random-sample \ --output-length 1 \ --request-length 2048 \ --num-clients 150 \ --num-rounds 10 \ --max-parallel 4 \ --request-rate 16 \ --ready-queue-policy random \ --disable-auto-run \ --enable-round-barrier7. 原地升级实践:实现无感版本迭代
7.1 问题背景
Mooncake Store 中的 transfer-engine 必须与 SGLang Serving Backend 保持版本一致,否则会导致 KVCache 传输协议不兼容。传统滚动升级会终止旧 Pod,导致内存中缓存数据丢失,进而迫使所有活跃会话重新执行 Prefill,引发严重性能波动。
7.2 解决方案
结合两项关键技术实现平滑升级:
- Mooncake 缓存本地持久化:通过 PR#1031 支持将 KVCache 元数据与热数据快照保存至共享内存或本地 NVMe,进程重启后可快速恢复;
- RBG 原地升级(In-place Update):不重建 Pod,仅替换容器镜像并复用原有存储卷,保留缓存状态。
7.3 升级操作
将 SGLang 镜像从 v0.5.5 升级至 v0.5.6:
kubectl patch rolebasedgroup sglang-pd-with-mooncake-demo \ --type='json' \ -p='[{"op": "replace", "path": "/spec/roles/1/template/spec/containers/0/image", "value": "lmsysorg/sglang:v0.5.6"}]'7.4 验证升级结果
kubectl get pods -l rolebasedgroup.workloads.x-k8s.io/name=sglang-pd-with-mooncake-demo观察到 Mooncake Store Pod 仅发生一次容器重启(RESTARTS=1),且节点和 IP 未发生变化,表明原地升级成功。
进一步查看事件日志确认原因:
kubectl describe pod sglang-pd-with-mooncake-demo-mooncake-store-dsrv4输出显示:
Normal Killing 21m kubelet Container store definition changed, will be restarted这证明是由于镜像变更触发的原地重启,而非 Pod 重建。
8. 总结
8.1 核心价值总结
RBG 与 Mooncake 的协同设计为大模型推理带来了三大突破:
- 稳定性增强:通过原地升级与缓存持久化,实现“升级无感、服务不抖”,保障生产环境 SLA;
- 性能跃升:三级缓存体系使 KVCache 命中率提升至 78.4%,TTFT 降低 56.3%,P90 延迟改善 42.7%;
- 成本优化:GPU 利用率从不足 30% 提升至可持续弹性水平,支持按流量动态伸缩。
8.2 最佳实践建议
- 始终启用分级缓存:在长上下文、多轮对话、RAG 等场景中,L2/L3 缓存带来的性能收益远超运维复杂度;
- 使用 RBG 管理多角色服务:避免手动维护多个 Deployment,利用 Coordination 机制保障角色间一致性;
- 开启原地升级:对于有状态组件(如 Mooncake Store),务必配置
InplaceIfPossible策略,防止缓存丢失; - 监控缓存命中率:将其作为核心 SLO 指标之一,及时发现缓存失效或配置异常。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。