- 发布日期
是什么
SGLang 是一个用于高效执行复杂语言模型程序的系统,由两部分组成:一是写程序用的前端语言,二是执行程序的运行时[1]。这里的「程序」不是单条提示词,而是多步骤的应用——反复调用模型、根据中间结果分支、把前一步的输出带进后一步的调用。
由来
这套设计最早写在论文里,论文于 2023 年 12 月 12 日首次发布到 arXiv,作者包括 Lianmin Zheng、Liangsheng Yin、Zhiqiang Xie、Chuyue Sun、Jeff Huang、Cody Hao Yu、Shiyi Cao、Christos Kozyrakis、Ion Stoica、Joseph E. Gonzalez 以及其他合作者[1]。开源实现随后落地:GitHub 上的 sgl-project/sglang 仓库创建于 2024 年 1 月 8 日,采用 Apache-2.0 许可,约有 38,000 个 star[2]。
前端:把程序写出来
前端的任务是让这类多步骤程序容易写。它提供了两类原语:一类负责生成(generation),即向模型请求输出;一类负责并行控制(parallelism control),让程序能够说明哪些调用彼此依赖、哪些可以同时推进[1]。没有这类原语时,多调用应用往往写成层层嵌套的回调,或者手工拼批次,应用本身的结构被埋在管道代码里。有了原语,依赖关系在代码里就能看出来,运行时也有明确的东西可以据以调度。
运行时:两处优化
运行时的性能主要来自两个想法。第一个是 RadixAttention,针对的是键值缓存(KV cache)的复用[1]。Transformer 模型在生成文本时,会把已经处理过的每个词元的键向量和值向量保留下来;如果每个新请求都从头重算这些向量,就是白做的工作。当不同调用共享同一段前缀——相同的系统提示、同一份文档、同一段对话的前几轮——这段前缀对应的缓存值完全相同,于是可以直接留着复用,而不必重建[1]。共享的上下文因此只付一次代价,而不是每次调用各付一次。
第二个想法是用压缩的有限状态机(finite state machine)来做结构化输出解码[1]。当输出必须遵循固定结构时,运行时可以逐词元地跟踪还有哪些词元是合法的,从而不让模型产生不合法的续写。有限状态机是编码这类规则的天然方式:状态对应结构中的位置,转移对应允许出现的词元。把状态机压缩之后,每个词元的检查更便宜[1],而这项检查位于解码的最内层循环里,每产出一个词元都要做一次,所以省下来的开销会不断累积。
结果
在论文的实验中,SGLang 在评测负载上的吞吐最高比当时最先进的推理系统高出 6.4 倍[1]。「最高」这个限定很重要:提升幅度取决于具体负载,而那些跨调用共享长前缀、或者需要严格约束输出的场景,正是这两处优化最能发挥作用的地方。
在发展中的位置
SGLang 把编程接口和执行引擎当作同一个问题来处理,而不是两件事。前端让多步骤程序容易写,写出来的恰好是运行时最擅长处理的那种负载——大量彼此相关的调用、密集的前缀共享、受格式约束的输出;而运行时节省下来的开销,又让这种写法在大规模下变得可行[1]。它以 Apache-2.0 许可开源、在公开仓库中开发,既是一篇论文所描述的研究产物,也是一个可以被其他人继续搭建的、被广泛使用的代码仓库[2]。
注释与来源
- SGLang: Efficient Execution of Structured Language Model Programshttps://arxiv.org/abs/2312.07104
- sgl-project/sglang repository metadatahttps://api.github.com/repos/sgl-project/sglang
引用本页: SGLang. TellWorld, https://www.tellworld.net/zh/products/sglang. 更新于 2026-11-08