AREX Feed Article
告别 Python 热路径:SGLang v0.5.17 用 Rust 重写推理前端
SGLang v0.5.17 在 8 月 8 日发布,582 个 PR、194 名贡献者参与。这次更新里最结构性的变化,是把推理服务从网络入口到 tokenization 的前半段从 Python 搬进了多线程 Rust。
v0.5.17 为月之暗面的 Kimi K3 提供了 day-0 服务支持。K3 是第一个开源的 2.8T 参数模型,架构和此前所有模型都不一样:69 层 KDA 线性注意力与 24 层 MLA 交错排列,896 个 expert 在 3584 维隐空间里路由。
SGLang 团队联合月之暗面和 NVIDIA,在 K3 发布当天就完成了完整适配,验证平台覆盖 NVIDIA GB300 和 AMD MI35x。MoE 预填充的新策略 DWDP 在同一版本落地,4×B200 上比 DEP4 快了 1.92 倍。
「Rust Server!?」
版本发布当天,inference.net 创始人 Ibrahim Ahmed(@atbeme)在 X 上转发 release notes 时写道:「oh shit @sgl_project shipping with a Rust Server now!?! 👀 i wonder how much faster this will be than the python version。」这条推文拿到 11 个赞和 1,286 次查看。
开发者新闻账号 @repojournal 将这次发布与 Ollama、vLLM 的同期更新并列,称「本地推理管线变得更快、更可预测了。」
一个 2.8T 参数的模型,把所有假设都打破了
SGLang 团队在 LMSYS 博客里记录了 Kimi K3 的上线过程。K3 的架构在推理栈有假设的几乎每个位置都偏离了惯例。
MLA 的 KV cache 只有一个 head 无法按头切分,传统的 tensor parallelism 策略失效。KDA 层的状态是定长矩阵、每次 forward 原地覆盖,不是 MLA 那样只追加的 per-token KV,前缀缓存的 copy-on-write 语义需要重做。LatentMoE 的 SiTU 激活函数让现成的 MoE kernel 全部无法直接复用。
结果是分阶段的并行策略:prefill 走 chunked pipeline parallelism(PP8),93 层切成 8 个 stage,实测比 TEP8 高出约 1.7 倍的 prefill 吞吐。decode 走 DCP,按 token 位置而非 head 切分 KV cache,逻辑 KV 容量扩大约 7.9 倍。
DSpark 投机解码加上 ReplaySSM——用约 1KB 的原始输入替代每次 draft step 的 64KB 全量 KDA 状态快照,内存减少约 32 倍——batch-1 decode 跑到约 423 tok/s。
v0.5.17 还集成了腾讯混元 AI Infra 团队的 HPC-Ops 算子库。这批算子已在腾讯生产环境运行,Hy3 模型的 TPOT 最高降低了 48.8%。Attention、Router GEMM 和 MoE 三条路径都通过 SGLang 原生 backend 接口接入了主干。
DWDP:让 MoE 预填充不再等 all-to-all
先说 Rust 前端。这次是 initial support,把网络接入、请求验证、tokenization 管理、detokenization、OpenAI 兼容 API 服务、PD disaggregation 全部用多线程 Rust 实现,编译为预构建 release artifact 随版本发布。相关 PR 共 13 个,从 workspace 初始化到各模块逐步合入。Python 版本保留,但 Rust 路径已可独立运行完整推理服务。
DWDP 瞄准的是 MoE 预填充的 all-to-all 通信瓶颈。传统 expert parallelism 做 prefill 时,token 需要在 rank 之间做 all-to-all 分发,每层一轮。DWDP 让每个 rank 通过 NVLink P2P 预取 peer rank 上的 expert 权重,所有 expert 在本地计算,砍掉了 token dispatch 通信。
4×B200 上,MNT 32K / ISL 32K 时 DWDP4 比 DEP4 快 1.92 倍。饱和场景 CONC=128、ISL=8K 下跑出 506K tok/s,DEP4 是 329K tok/s,差距 1.54 倍。团队注明这是早期开发阶段,通过 --dwdp-size 开启。
会话引用感知的 Unified Radix Cache 解决 agentic 负载的另一个问题。同一个 session 连续发多个请求,共享一批前缀。传统 radix cache 按策略淘汰时不关心前缀是否还有活跃会话引用。v0.5.17 让请求携带 session_id,淘汰时检查活跃引用,会话结束通过 /close_session 释放。通过 --enable-session-radix-cache 开启。
DCP 也新增了可插拔通信后端:a2a 将 attention 输出和 fp32 LSE 打包进单次 NCCL collective,fp8 KV 以 uint8 字节传输;fi_a2a 在 GB200 上把跨 rank 交换委托给 FlashInfer MNNVL kernel。--dcp-replicate-q-proj 让每个 rank 本地投影全量 Q head,省掉了 per-layer 的 Q head-dim all-gather。
推理服务的系统语言拐点
此前,Python 是开源推理服务的事实标准。vLLM、SGLang、TGI 的推理入口、请求调度和 tokenization 管理全在 Python 里,只有计算密集的 kernel 才落到 C++/CUDA。模型参数在几百 B、请求模式单一的时候,这够用。
但模型架构在变。K3 的 hybrid KDA+MLA、DeepSeek-V4 等模型的 expert 数量膨胀到近千——调度器需要处理的并行策略组合急剧增加。
负载模式也在变。agentic 工作负载意味着同一个 session 里频繁的短请求、长上下文复用和状态管理。Python 的 GIL 和对象分配开销从可忽略变成了可测量。
SGLang 这次的 Rust 前端标着 initial support,但 13 个 PR 的工程规模不是实验。预构建 release artifact、OpenAI 兼容 API 和 PD disaggregation 都已在 Rust 路径上跑通。
initial support,但没有人觉得这是实验
Ibrahim Ahmed 那句「oh shit」底下是社区真实的判断:Rust 推理前端这件事,社区在追问的是谁先做、什么时候做。
SGLang v0.5.17 用 582 个 PR 和 194 名贡献者的体量,同时交出了 Rust 前端、DWDP、session-aware 缓存三个答案。每个都指向同一个方向——推理服务本身正在变成需要系统语言来写的底层基础设施。