SGLang
SGLang
一句话定位
SGLang 是面向大语言模型及多模态模型的推理与服务系统。
运行时因果链
1 | 结构化 prompt / 多轮程序 |
它的价值不只是“另一个 HTTP server”:当工作负载包含共享前缀、结构化生成、分支或多轮调用时,前端程序与运行时可以共同减少重复计算。但如果只是简单单轮请求,收益仍由模型、硬件、batch 和 kernel 决定。
与 vLLM 的比较维度
| 维度 | SGLang | vLLM |
|---|---|---|
| 主要抽象 | 结构化程序、状态与运行时 | 通用 serving engine 与请求调度 |
| 优势场景 | prefix/state reuse、复杂生成流程 | 多租户高吞吐、生态与部署成熟度 |
| 必须实测 | cache 命中、编排开销、约束解码 | batch、KV、并发和模型支持 |
不要用单一 tokens/s 结论替代同 prompt、并发、输出长度、约束和失败率的矩阵评测。
SGLang 真正解决的请求形状
SGLang 的优势假设是“请求之间存在可表达的结构”,而不是所有请求都只是一次独立的 prompt → completion。例如一个系统提示被大量请求共享、同一份文档要生成摘要/分类/引用三个分支,或者一次调用中交替发生模型生成与工具调用;如果前端程序能显式描述这些共享前缀和分支,运行时才有机会复用状态、安排批次或避免重复生成。
可以把一次请求拆成两层状态:
1 | 程序状态:变量、分支、约束、tool result |
程序状态复用并不自动等于 KV 命中。只要 tokenizer、chat template、采样参数、位置编码或模型实例不同,逻辑上相同的前缀也可能无法共享;共享前缀后发生分支时,还要为分支后的 token 做 copy-on-write 或重新分配缓存。排查“声明了 cache 但 TTFT 没降”时,先看真实 token 前缀和命中长度,再看 scheduler 是否因为容量、优先级或跨副本路由放弃了复用。
结构化生成的代价
约束解码、正则/JSON grammar 和多轮程序会把普通的 token 采样变成“候选 token 过滤 + 状态机推进”。这通常提高输出可解析性,却可能增加 CPU 侧 grammar 状态维护、GPU batch 的形状分裂和缓存失配。一个简单 completion 变慢,不应归咎于 SGLang 的核心 kernel;应分别测无约束、固定 schema 和分支程序三种轨迹,并记录 grammar 过滤耗时、prefix hit length、每轮 batch size、TTFT/TPOT P99 与结构化失败率。
选型边界
若工作负载主要是异构租户的普通聊天请求,先比较 vLLM 的通用调度、生态和运维成本;若工作负载有大量共享前缀、程序化生成或多模型/多轮状态,SGLang 值得进入候选。最终结论必须绑定同一模型、同一 tokenizer/template、相同 cache 配置和相同请求轨迹;只比较官方 demo 的 tokens/s,测不到它真正的结构化收益。
尚需实证
- 明确运行时、调度器与前端能力的边界
- 用同一工作负载与 vLLM 对比
- 回答 vLLM 和 SGLang 的调度器区别是什么