SGLang
3 秒看懂
SGLang(Structured Generation Language) 是一个面向大语言模型(LLM)推理的高效服务框架,核心创新是 RadixAttention(基于基数树的 KV Cache 复用)和压缩有限状态机(Compressed FSM)约束解码。它能在多轮对话、共享前缀、结构化输出等场景下实现显著的吞吐量提升,是当前开源 LLM 推理优化的重要竞争者之一,与 vLLM 形成直接对标。
3 分钟产业解释
为什么需要 SGLang?
大模型落地的核心瓶颈已经从”训练能不能跑”转向”推理能不能用得起”。一个中等规模的聊天应用可能面临:
- 每秒数千并发请求,每个请求都可能包含长系统提示(system prompt)
- 多轮对话中,前几轮的 KV Cache 不断重复计算
- 结构化输出需求(JSON、SQL、代码),约束解码效率低下
传统推理框架(如 HuggingFace TGI、vLLM)在这些场景下存在优化空间。SGLang 通过系统级的 KV Cache 管理和批处理调度,针对性地解决这些痛点。
产业定位
┌─────────────────────────────────────────────────────────┐
│ LLM 推理服务层 │
├─────────────┬─────────────┬─────────────┬───────────────┤
│ vLLM │ SGLang │ TensorRT- │ DeepSpeed │
│ (PagedAttn)│(RadixAttn) │ LLM │ -Inference │
├─────────────┴─────────────┴─────────────┴───────────────┤
│ CUDA / ROCm / 自研算子 │
├─────────────────────────────────────────────────────────┤
│ GPU 硬件 (NVIDIA / AMD / ...) │
└─────────────────────────────────────────────────────────┘
关键差异
| 维度 | vLLM | SGLang |
|---|---|---|
| 核心技术 | PagedAttention | RadixAttention |
| KV Cache 管理 | 分页、按需分配 | 基数树、前缀自动复用 |
| 约束解码 | 有限支持 | 压缩 FSM 原生集成 |
| 优势场景 | 通用长文本 | 多轮对话、共享前缀、结构化输出 |
15 分钟专家深入
架构全貌
SGLang 的推理引擎可以分为几个关键模块:
┌──────────────────────────────────────────────────────────────┐
│ SGLang Runtime │
├──────────────────────────────────────────────────────────────┤
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
│ │ Scheduler │ │ RadixCache │ │ Constrained Decode │ │
│ │ (批处理调度) │ │ (KV Cache) │ │ (FSM 引擎) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────────┬──────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ CUDA Kernel 层 (FlashInfer) │ │
│ └──────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
RadixAttention 机制详解
这是 SGLang 的核心技术突破。传统 PagedAttention 的问题是:它不感知请求之间的前缀共享关系。
问题场景:100 个请求共享同一个 2000 token 的系统提示
请求 A: [系统提示 2000t] + [用户问题 100t]
请求 B: [系统提示 2000t] + [用户问题 150t]
请求 C: [系统提示 2000t] + [用户问题 80t]
...
传统方案:每个请求独立计算系统提示的 KV Cache → 重复计算 100 次
RadixAttention 方案:使用基数树(Radix Tree / Trie)索引 token 序列的前缀
[root]
│
[系统提示前缀...]
│
┌────────┼────────┐
▼ ▼ ▼
[A的后缀] [B的后缀] [C的后缀]
↓ ↓ ↓
KV_A KV_B KV_C
(仅后缀) (仅后缀) (仅后缀)
关键机制:
- 前缀匹配:新请求到来时,先在基数树中查找最长公共前缀(Longest Common Prefix)
- Cache 复用:命中前缀的 KV Cache 直接复用,跳过计算
- 动态管理:支持 LRU 淘汰、引用计数、Copy-on-Write 等策略
量化收益估算(基于公开基准,具体数字可能因场景而异):
- 多轮对话场景:吞吐量提升约 1.5-3 倍(vs 原始 vLLM)
- 共享系统提示场景:首 token 延迟(TTFT)显著降低
压缩有限状态机(Compressed FSM)
结构化输出是企业级应用的刚需(返回 JSON、SQL 等)。SGLang 的约束解码方案:
传统约束解码问题:
- 每次生成 token 后,需要遍历 FSM 状态转移
- 对于复杂 schema,FSM 可能有数千状态,转移表巨大
SGLang 的压缩 FSM:
- 状态压缩:合并等价状态,减小 FSM 规模
- 批量转移:一次计算多个 token 的合法集合
- 与 RadixCache 集成:约束解码的中间结果也能被缓存复用
JSON Schema 示例: {"name": string, "age": int}
FSM 状态转移(简化):
state_0 --'{'--> state_1 --'"'--> state_2 --[a-z]--> state_3 ...
--'n'--> state_4 (匹配 "name")
--'a'--> state_5 (匹配 "age")
压缩后: 合并相同前缀路径,减少状态数
批处理调度器
SGLang 实现了连续批处理(Continuous Batching),但增加了前缀感知的调度策略:
- Preempt 策略:当显存不足时,优先抢占前缀较短的请求(因为重新计算成本低)
- 调度优先级:共享长前缀的请求被调度到同一 batch,最大化 Cache 命中
FlashInfer 内核
SGLang 依赖 FlashInfer 库提供高效的注意力计算内核:
- 支持多种注意力变体:MHA、GQA、MQA
- 支持 Paged KV Cache 的高效访问
- 针对不同 GPU 架构优化(A100、H100 等)
技术原理
KV Cache 基数树实现
┌─────────────────────────────────────────────────────┐
│ RadixCache 内部结构 │
├─────────────────────────────────────────────────────┤
│ │
│ Token 序列: [t1, t2, t3, t4, t5, t6, t7, t8] │
│ │
│ 基数树节点: │
│ │
│ Node(root) │
│ └── Node([t1,t2,t3]) ← 前缀节点 │
│ ├── Node([t4,t5]) ← 请求A的后缀 │
│ │ └── [KV Cache: K_A, V_A] │
│ └── Node([t4,t6]) ← 请求B的后缀 │
│ └── [KV Cache: K_B, V_B] │
│ │
│ 节点元数据: │
│ - token_ids: 该节点对应的 token 序列 │
│ - kv_cache: 对应的 K, V 张量 │
│ - ref_count: 引用计数(用于淘汰策略) │
│ - last_access: LRU 时间戳 │
│ │
└─────────────────────────────────────────────────────┘
Cache 复用的数学表示
对于请求 $R$,其 token 序列为 [t_1, t_2, ..., t_n]
设基数树中已缓存的最长前缀长度为 $p$,则:
- 可复用的 KV Cache:对应
[t_1, ..., t_p] - 需要计算的部分:
[t_{p+1}, ..., t_n] - 计算量节省比:
\frac{p}{n}(理想情况)
约束解码的 FSM 原理
JSON Schema: {"key": string}
对应的正则表达式(简化):
{"key":"[a-zA-Z]*"}
FSM 构建:
┌─────┐ '{' ┌─────┐ '"' ┌─────┐ 'k' ┌─────┐
│ q0 │ ------→ │ q1 │ ------→ │ q2 │ ------→ │ q3 │
└─────┘ └─────┘ └─────┘ └─────┘
│ 'e'
▼
┌─────┐
│ q4 │
└─────┘
│ 'y'
▼
┌─────┐
│ q5 │
└─────┘
│ '"' (键结束引号)
▼
┌─────┐
│ q6 │
└─────┘
│ ':' (冒号)
▼
┌─────┐
│ q7 │
└─────┘
│ '"' (值开始引号)
▼
┌─────┐
│ q8 │
└─────┘
(接受 [a-zA-Z]*)
每个状态对应一个合法 token 集合(vocab mask)
解码时,logits 只在合法 token 上取 argmax
SGLang 核心参数与指标
| 参数/指标 | 说明 | 典型值/范围 |
|---|---|---|
| RadixCache 命中率 | 前缀复用的有效性 | 场景依赖,可高可低 |
| TTFT | Time To First Token,首 token 延迟 | 与前缀长度、batch size 相关 |
| TPOT | Time Per Output Token,逐 token 延迟 | 与模型大小、GPU 算力相关 |
| Throughput | 吞吐量(tokens/s) | 核心优化目标 |
| P99 Latency | 第 99 百分位延迟 | 服务稳定性指标 |
技术演进史
时间线
2023.06 vLLM 发布,PagedAttention 成为主流方案
↓
2023.12 SGLang 初始版本,提出结构化生成语言概念
↓
2024.01 SGLang 推出 RadixAttention,性能大幅改进
↓
2024.Q1 FlashInfer 集成,内核优化
↓
2024.Q2 压缩 FSM 约束解码优化
↓
2024.H2 持续迭代,扩展模型支持(Mixtral MoE、Gemma 等)
↓
至今 与 vLLM 形成双雄竞争格局
关键里程碑
| 时间 | 事件 | 意义 |
|---|---|---|
| 2024.01 | RadixAttention 论文/代码发布 | 核心技术创新,解决前缀复用问题 |
| 2024.Q1 | FlashInfer 集成 | 内核层优化,提升硬件利用率 |
| 2024.H1 | 约束解码优化 | 结构化输出性能提升 |
| 2024.H2 | 多模型支持扩展 | 生态完善,支持 MoE 等复杂架构 |
技术路线对比
推理框架技术路线对比
| 维度 | vLLM (PagedAttention) | SGLang (RadixAttention) | TensorRT-LLM | DeepSpeed-Inference |
|---|---|---|---|---|
| 核心创新 | 分页 KV Cache | 基数树 KV Cache 复用 | 图优化 + 内核融合 | ZeRO 推理 + 张量并行 |
| 前缀复用 | 不原生支持 | 原生支持 | 需手动配置 | 不原生支持 |
| 约束解码 | 有限支持 | 压缩 FSM 深度集成 | 有限支持 | 不原生支持 |
| 动态批处理 | 支持(Continuous Batching) | 支持(前缀感知调度) | 支持 | 支持 |
| 显存管理 | Paged KV Cache | RadixCache + Paged | 静态图优化 | ZeRO 分片 |
| 硬件支持 | NVIDIA, AMD, TPU | NVIDIA (主要) | NVIDIA (仅限) | NVIDIA (主要) |
| 部署复杂度 | 中等 | 中等 | 较高(需要图编译) | 较高 |
| 最佳场景 | 通用长文本 | 多轮对话/共享前缀/结构化输出 | 固定模型 + 固定输入 | 超大模型分布式推理 |
性能对比基准(参考值,具体数字因场景/硬件/模型而异)
| 场景 | SGLang 相对 vLLM 的吞吐量提升 | 说明 |
|---|---|---|
| 多轮对话 | 1.5x - 3x | RadixCache 复用历史 KV |
| 共享系统提示 | 2x - 5x | 长前缀复用收益显著 |
| 结构化输出 (JSON) | 1.2x - 2x | 压缩 FSM 减少约束开销 |
| 单轮无共享 | ~1x | 无前缀复用,性能相近 |
注:以上数字为基于公开基准的估算范围,实际结果依赖具体配置。
上下游
产业链位置
上游(算力/硬件层)
┌─────────────────────────────────────────────┐
│ GPU 硬件: NVIDIA A100/H100, AMD MI250/MI300 │
│ 互联: NVLink, PCIe, InfiniBand │
│ 显存: HBM2e, HBM3 (容量/带宽是关键) │
└─────────────────────┬───────────────────────┘
│
▼
中游(框架/引擎层)
┌─────────────────────────────────────────────┐
│ 推理框架: SGLang, vLLM, TensorRT-LLM, TGI │
│ 内核库: FlashInfer, FlashAttention, Triton │
│ 编译优化: CUDA, ROCm, TensorRT │
└─────────────────────┬───────────────────────┘
│
▼
下游(应用/服务层)
┌─────────────────────────────────────────────┐
│ 云服务: AWS Bedrock, Azure AI, GCP Vertex │
│ API 服务: OpenAI, Anthropic, 自建服务 │
│ 应用: 聊天机器人, 代码助手, 结构化数据抽取 │
└─────────────────────────────────────────────┘
关键依赖
| 层级 | 依赖项 | 说明 |
|---|---|---|
| 内核层 | FlashInfer | SGLang 的注意力内核核心依赖 |
| 模型层 | HuggingFace Transformers | 模型加载、分词器 |
| 运行时 | CUDA / PyTorch | GPU 计算底座 |
| 分布式 | NCCL | 多 GPU 通信 |
关键指标
推理性能关键指标
| 指标 | 定义 | 优化方向 | SGLang 的优化手段 |
|---|---|---|---|
| TTFT (Time To First Token) | 请求发出到第一个 token 返回的延迟 | 减少 prefill 计算量 | RadixCache 前缀复用 |
| TPOT (Time Per Output Token) | decode 阶段每生成一个 token 的平均延迟 | 提升 decode 效率 | 连续批处理 + 内核优化 |
| Throughput (tokens/s) | 单位时间处理的 token 总数 | 最大化 GPU 利用率 | 前缀感知调度 + 高效批处理 |
| P99 Latency | 第 99 百分位延迟 | 服务稳定性 | 公平调度 + preemption 策略 |
| Cache Hit Rate | RadixCache 前缀命中率 | 提升复用效率 | 基数树结构 + LRU 策略 |
资源效率指标
| 指标 | 说明 |
|---|---|
| GPU 利用率 | 计算单元的实际占用率 |
| 显存利用率 | KV Cache 占用 vs 总显存 |
| Batch Size | 动态批处理的实际 batch 大小 |
供需与市场数据
推理框架市场格局(定性)
开源推理框架市场份额(估算)
vLLM ████████████████████████ (~40-50%) ← 当前领导者
TensorRT-LLM ████████████████ (~25-30%) ← NVIDIA 生态绑定
SGLang ████████ (~10-15%) ← 快速增长
TGI ██████ (~8-12%) ← HuggingFace 生态
Others ████ (~5-10%)
注:以上为基于社区活跃度、部署案例的粗略估算,非精确市场调研数据。
SGLang 的应用场景需求
| 场景 | 需求特征 | SGLang 适配度 |
|---|---|---|
| 多轮对话机器人 | 长历史上下文、高并发 | ★★★★★ |
| API 网关 | 共享系统提示、多样化请求 | ★★★★★ |
| 结构化数据抽取 | JSON/SQL 输出约束 | ★★★★★ |
| 代码生成 | 语法约束、多候选 | ★★★★☆ |
| RAG 应用 | 长文档上下文 | ★★★★☆ |
| 单轮摘要 | 无共享前缀 | ★★★☆☆ |
代表公司与产业映射
核心团队与组织
| 维度 | 说明 |
|---|---|
| 核心团队 | UC Berkeley LMSYS 组 |
| 关键人物 | Ying Sheng, Lianmin Zheng 等(SGLang 核心开发者,同时也是 vLLM 的早期贡献者) |
| 关联项目 | LMSYS Chatbot Arena, Vicuna, FastChat |
| 开源协议 | Apache 2.0 |
资本/商业化映射
| 层级 | 相关公司/项目 | 说明 |
|---|---|---|
| 云服务商 | AWS, Azure, GCP, 阿里云, 字节火山引擎 | LLM 推理服务的最终买家 |
| GPU 厂商 | NVIDIA, AMD, Intel | 硬件受益方 |
| 模型公司 | OpenAI, Anthropic, 智谱, 月之暗面 | 内部推理优化可能采用类似技术 |
| 推理服务商 | Together AI, Fireworks AI, Replicate | 可能采用/贡献 SGLang |
| 学术机构 | UC Berkeley, CMU, Stanford | 核心研究力量 |
注:SGLang 是开源项目,暂无直接独立融资记录。其价值体现在降低推理成本、推动生态发展。
产业逻辑
为什么关注 SGLang?
核心逻辑:LLM 推理成本是落地的关键瓶颈,推理框架是降本增效的核心抓手。
大模型落地成本拆解(简化)
┌──────────────────────────────────────────┐
│ 总拥有成本 (TCO) │
├──────────────────────────────────────────┤
│ 训练成本 │ 推理成本(持续) │
│ (一次性) │ (随请求量线性增长) │
│ │ │
│ 注:推理成本 │ ← 这是长期主要成本 │
│ 通常远大于训练 │ 优化空间巨大 │
└──────────────────────────────────────────┘
产业影响梳理
| 层级 | 影响类型 | 相关方向 |
|---|---|---|
| 硬件层 | 需求传导 | NVIDIA (GPU), AMD (GPU), SK Hynix (HBM) |
| 框架层 | 生态卡位 | 开源框架本身不直接产生收入,但影响生态选择 |
| 云服务层 | 成本与用量联动 | 推理成本降低 → 更多请求 → 更多收入 |
| 应用层 | 成本降低 | 更低的 API 成本 → 更多应用场景可行 |
风险与不确定性
| 风险 | 说明 |
|---|---|
| 技术路线竞争 | vLLM 社区活跃度高,可能跟进前缀复用技术 |
| 硬件变化 | 新一代 GPU 架构可能改变优化重点 |
| 闭源方案 | NVIDIA TensorRT-LLM 等闭源方案可能在特定场景更优 |
| 需求变化 | 更长上下文窗口可能减少前缀复用需求 |
常见误读纠偏
误读 1:SGLang 的性能提升都是”免费”的
纠偏:SGLang 的性能提升依赖于特定场景。在没有共享前缀的场景下,RadixAttention 的优势不明显。核心收益来自:
- 多轮对话(历史 KV 复用)
- 共享系统提示(前缀 KV 复用)
- 结构化输出(FSM 约束解码优化)
对于单轮、无共享的简单请求,SGLang 与 vLLM 性能差距不大。
误读 2:RadixAttention 完全替代了 PagedAttention
纠偏:RadixAttention 和 PagedAttention 解决的是不同层面的问题:
- PagedAttention:解决 KV Cache 的显存碎片化问题(将连续显存分页管理)
- RadixAttention:解决 KV Cache 的跨请求复用问题(基于前缀索引)
SGLang 的 RadixCache 底层仍然使用分页管理(类似 PagedAttention 的思想),上层增加了基于基数树的前缀索引。两者是互补关系,不是替代关系。
误读 3:SGLang 是 vLLM 的”改进版”
纠偏:虽然 SGLang 和 vLLM 都是 LLM 推理框架,但它们的设计哲学和技术创新点不同:
| 维度 | vLLM | SGLang |
|---|---|---|
| 核心创新 | PagedAttention(显存管理) | RadixAttention(前缀复用) |
| 设计重点 | 通用高效推理 | 前缀感知 + 结构化输出 |
| 技术来源 | UC Berkeley(最初) | UC Berkeley LMSYS |
| 关系 |