SGLang 学习手册

SGLang Sister

一份面向大模型推理岗的 SGLang 工程笔记,44 章,从 RadixAttention 一直写到 K8s 部署。 每章里凡是讲到具体实现,都标着 file_path:line_number,方便你随时跳到 SGLang 源码对照。

姊妹项目 vllm-learning 是同一套章节布局,写完一篇就可以跳过去看 vLLM 同位置怎么做。


这份手册解决什么问题

我写这份笔记,是因为自己读 SGLang 源码的时候踩了一圈坑,回头发现没有一份资料把"为什么这么设计 → 在哪一行代码里 → 出事了怎么排查"这三件事串起来讲。如果你是:

  • 准备面试,不想再背"RadixAttention 解决了什么"这种二手答案;
  • 业务正在 SGLang / vLLM / TensorRT-LLM 之间挑引擎;
  • TTFT / TPOT 不达标,要从调度层一路追到 attention kernel;
  • 想给 SGLang 提 PR,但 scheduler、radix cache、model runner 之间的咬合没看明白,

那这本是给你写的。

不适合两种人:完全没接触过 LLM 推理(先看 01-overview/00-prerequisites.md 把前置铺平),以及纯 prompt engineer 不碰服务侧——这本太工程。


与 vllm-learning 的关系

维度 vllm-learning sglang-learning(本书)
章节布局 9 部分 46 章 9 部分 44 章
Part VI 面试准备 前端 DSL(SGLang 独有)
招牌算法章节 PagedAttention(02/01) RadixAttention(02/01)
调度章节 Continuous batching Cache-aware scheduling
结构化输出 xgrammar / outlines 压缩 FSM
写作风格 / 模板

读完本书任何一章,跳到 vllm-learning 同名位置对照着看,两套引擎的设计权衡会清楚很多。专门有一章 01-overview/03-sglang-vs-vllm.md 做这件事。


怎么用这份资料

有两种打开方式。Markdown 直接读——本 README 当目录,按文件名点进去,适合在 IDE 里一边读一边对着源码翻。HTML 在线版——跑一次 python3 build_html.py,打开 _site/index.html,多了侧栏、全文搜索、Mermaid 渲染、阅读时间估算。Markdown 链接、Mermaid 图、代码块在两种模式下都能用。

每章统一的结构:

谁该读这一篇? ... 前置阅读: ... 耗时: N 分钟 学完能: ...

正文(含 mermaid / 表格 / 代码引用)

## 小结
## 自检(3-5 题,自答)
## 下一步(跳转推荐)

从头到尾过一遍大约 25-30 小时,动手实验另算。


学习路径

flowchart LR
    A[Week 1<br/>建立直觉<br/>~6h] --> B[Week 2<br/>吃透核心算法<br/>~8h]
    B --> C[Week 3<br/>啃源码<br/>~10h]
    C --> D[Week 4<br/>前端 DSL / 分布式 / 生产<br/>~10h]

    A -.-> A1[01-overview]
    B -.-> B1[02-core-concepts]
    C -.-> C1[03-code-walkthrough]
    D -.-> D1[04-optimizations]
    D -.-> D2[05-distributed]
    D -.-> D3[06-frontend-language]
    D -.-> D4[08-production-deployment]

按章节顺序读最系统。时间紧的话,挑下面这几条路径:

投入时间 推荐路径
零基础 先读 01-overview/00-prerequisites.md 把前置概念铺平
1 天(~5h) 01-what-is-sglang02-architecture01-radix-attention03-sglang-vs-vllm
1 周(~15h) 精读 01-overview/ + 02-core-concepts/,跑通 07-hands-on/01-setup.md
3-4 周(~30h) 顺序读 01 → 09,每章配合 sglang/ 源码对照(每章都标 file_path:line_number
选型速通(~6h) 01-overview/0101-overview/0302-core-concepts/ 全部
生产部署速通(~10h) 01-overview/0208-production-deployment/ 全部

章节索引

每章后面跟一句话,告诉你这章解决什么问题。

1. 总览 · 01-overview/ — 6 章

2. 核心概念 · 02-core-concepts/ — 5 章

3. 源码走读 · 03-code-walkthrough/ — 8 章

4. 优化 · 04-optimizations/ — 4 章

5. 分布式 · 05-distributed/ — 4 章

6. 前端 DSL · 06-frontend-language/ — 4 章

7. 实操 · 07-hands-on/ — 4 章

8. 生产部署 · 08-production-deployment/ — 9 章

9. 应用特性 · 09-advanced-features/ — 5 章


SGLang 仓库地标速查

想知道什么 去哪里看
用户怎么调用 SGLang Server sglang/python/sglang/launch_server.py
前端 DSL 解释器 sglang/python/sglang/lang/interpreter.py
请求入口进程 sglang/python/sglang/srt/managers/tokenizer_manager.py
调度主循环 sglang/python/sglang/srt/managers/scheduler.py(3900+ 行)
Schedule 策略 sglang/python/sglang/srt/managers/schedule_policy.pyschedule_batch.py
RadixAttention 数据结构 sglang/python/sglang/srt/mem_cache/radix_cache.py
内存池 / 分配器 sglang/python/sglang/srt/mem_cache/memory_pool.pyallocator.py
Model Runner(前向) sglang/python/sglang/srt/model_executor/model_runner.py
Attention 后端 sglang/python/sglang/srt/layers/attention/
模型实现 sglang/python/sglang/srt/models/(llama / qwen / deepseek / mixtral…)
受约束解码 sglang/python/sglang/srt/constrained/
采样 sglang/python/sglang/srt/sampling/
Function calling sglang/python/sglang/srt/function_call/
LoRA sglang/python/sglang/srt/lora/
张量并行 / 集合通信 sglang/python/sglang/srt/distributed/
量化 sglang/python/sglang/srt/layers/quantization/
投机解码 sglang/python/sglang/srt/speculative/
Disaggregated(P/D 分离) sglang/python/sglang/srt/disaggregation/
Router sglang/sgl-router/(Rust 实现)
CUDA / 自定义 kernel sglang/sgl-kernel/
基准测试脚本 sglang/python/sglang/bench_serving.py

完整地图见 01-overview/04-project-structure.md


怎么读这本书

几个习惯,是我自己读这种工程项目踩了几年坑后留下的,分享给你:

别信博客,直接看代码。 SGLang 的源码注释很克制,但 commit log 和 PR 描述讲得比任何二手解读都清楚。

先看数据结构,再看逻辑。 读 Scheduler 之前先翻一遍 io_struct.py 里的字段;读 RadixCache 之前先看 TreeNode 长什么样(radix_cache.py:208)。字段读完,整个模块的代码就只是在维护这些字段。

打 print 比读注释快。 启动 server 时加 --log-level debug,在 Scheduler.event_loop_normalRadixCache.match_prefix 各塞一句 print,跑一次实际请求,比啃半天文档管用。

自己画三张图: 请求从 HTTP 进入到 HTTP 出去的全链路;RadixTree 的演化过程;Scheduler 一步迭代里的决策流。这三张图自己画过一遍,整本书就活起来了。

讲 SGLang,必须能讲 vLLM。 离开对比谈优势就是空的。专门一章 01-overview/03-sglang-vs-vllm.md 做这件事,你也应该自己也总结一份。


面试自检清单

读完整本之后,下面这些问题你应该能在一两分钟里讲清楚,并且能指出对应的源码位置。每题附一段简答 + 章节链接。

RadixAttention 与 PagedAttention 的本质区别?前缀树为什么比 hash 表更适合 prefix cache? PagedAttention 用 16-token 物理 block + hash 表索引,命中粒度粗(必须整块命中);RadixAttention 用 1-token slot + radix 树,命中精确到任意 token,且分支(fork)天然共享父节点。代价是 evict 复杂、需要 FlashInfer cascade kernel。详见 [`02-core-concepts/01-radix-attention.md`](02-core-concepts/01-radix-attention.md)、源码 [`radix_cache.py:270`](sglang/python/sglang/srt/mem_cache/radix_cache.py)。
SGLang 的 cache-aware scheduler 在什么场景下比 FCFS 显著更好?病态情况是什么? 收益最大:前缀复用率高 + 命中长度差异大(命中长的请求 prefill 几乎是免费的,先跑性价比高)。病态:长尾队首 starve、新业务冷启动、短 prompt 全均命中退化为 FCFS。详见 [`02-core-concepts/03-cache-aware-scheduling.md`](02-core-concepts/03-cache-aware-scheduling.md)、源码 [`schedule_policy.py:813`](sglang/python/sglang/srt/managers/schedule_policy.py)。
压缩 FSM 比朴素 vocab mask 快多少?Jump-ahead 的代价在哪? 复杂 JSON 输出 1.5-3× 提升;jump-ahead 配合可让"必出"段一次吐多 token,TPOT 比无约束还低。代价:编译有 100ms-数秒一次性开销(cache 复用解决)、jump-ahead 在多字节 Unicode / 边界 case 偶现退化。详见 [`02-core-concepts/04-compressed-fsm.md`](02-core-concepts/04-compressed-fsm.md)、源码 [`outlines_jump_forward.py`](sglang/python/sglang/srt/constrained/outlines_jump_forward.py)。
SGLang 的前端 DSL 给运行时带来了什么 vLLM 拿不到的信息? (a) "这段是常量" → RadixCache 自动沉淀;(b) "这 5 个分支共享父 prefix" → cascade attention;(c) "这一步只能选 4 个 choice 之一" → `select` 一次 forward 决断;(d) 多步累积上下文 → ProgramState 续 cache。vLLM 只看到独立 HTTP 请求。详见 [`02-core-concepts/02-frontend-dsl.md`](02-core-concepts/02-frontend-dsl.md)、源码 [`lang/interpreter.py`](sglang/python/sglang/lang/interpreter.py)。
SGLang 的三进程为什么不合一?合一的代价是什么? 三个理由:GIL(tokenize CPU vs GPU 调度)、asyncio vs while True 范式冲突、故障隔离。合一就要在两个范式间妥协 → GPU 等 CPU、整 server 易 crash。详见 [`01-overview/02-architecture.md`](01-overview/02-architecture.md) §2、源码 [`http_server.py:2335`](sglang/python/sglang/srt/entrypoints/http_server.py)。
Token-level KV 管理 vs Page-level 各自的优劣? Token-level(SGLang 默认 page=1):命中精确、分支自然、需要 FlashInfer cascade,碎片略多。Page-level(vLLM 默认 16):实现简单、locality 好、命中必须整块;适合 workload 长尾分布平。详见 [`02-core-concepts/05-token-attention.md`](02-core-concepts/05-token-attention.md)。
DeepSeek-V3 这类 MoE 模型在 SGLang 上的 EP 切分细节? 推荐 EP=8 + DeepEP backend + EPLB 负载均衡 + FP8 量化。每卡装 1/8 experts(256/8=32),AllToAll 走 NVLink + 跨节点 RDMA;DeepEP 把通信和 expert 计算 overlap。EPLB 热门 expert 复制冗余。详见 [`05-distributed/03-expert-parallelism.md`](05-distributed/03-expert-parallelism.md)、源码 [`srt/layers/moe/`](sglang/python/sglang/srt/layers/moe/)、[`srt/eplb/`](sglang/python/sglang/srt/eplb/)。
SGLang router 为什么用 Rust 实现?路由策略有哪些? Router 要扛 50k+ QPS,Python 是瓶颈;Rust 用 tokio 多线程 + Bloom filter 做 cache-aware 路由的近似匹配。策略:random / round_robin / shortest_queue / cache_aware(默认)/ consistent_hash。详见 [`08-production-deployment/07-router.md`](08-production-deployment/07-router.md)、源码 [`sglang/rust/sgl_router/`](sglang/rust/)。
FlashInfer 的 Cascade Inference 在 SGLang 里如何被触发? `PrefillAdder` 用 DFS_WEIGHT 策略把同 RadixTree 子树的请求成簇排进同一 batch;FlashInfer Attention backend 的 `WrapperDispatch` 检测到 batch 内有共享 prefix 时,用 `MultiLevelCascadeAttentionWrapper` 而非普通 paged wrapper。详见 [`04-optimizations/01-flashinfer.md`](04-optimizations/01-flashinfer.md)、源码 [`flashinfer_backend.py:58`](sglang/python/sglang/srt/layers/attention/flashinfer_backend.py)。
P/D 分离在 SGLang 当前的支持现状?落地路径? [`srt/disaggregation/`](sglang/python/sglang/srt/disaggregation/) 已有 prefill / decode 节点 + KV transfer(NCCL / NIXL)+ encoder 分离。落地路径:(1) 业务输入输出 token 比例严重不均 + 双 SLO;(2) 已有 RDMA 网络;(3) 长 prompt 占比高;(4) 准备好运维 RDMA + KV transfer 复杂度。短请求 / 低流量不开。详见 [`05-distributed/04-disaggregated.md`](05-distributed/04-disaggregated.md)。

每题都有专门展开,分布在 02-core-concepts / 03-code-walkthrough / 04-optimizations / 05-distributed / 08-production-deployment 几个目录里。


必读资料

按我建议的阅读顺序排:

  1. SGLang 论文(Zheng et al., NeurIPS 2024,SGLang: Efficient Execution of Structured Language Model Programs)。先读这篇,再读代码,会少走很多弯路。其中 §4 是 RadixAttention,反复看那两页。
  2. FlashInfer 论文(Ye et al.)。SGLang 默认就跑在这套 attention kernel 上,不读这篇,后面看 attention backend 那章会很吃力。
  3. PagedAttention 论文(Kwon et al., SOSP 2023)。理解 SGLang 为什么这么设计,前提是知道 vLLM 当年怎么做的。
  4. xgrammar 论文(Dong et al.)。SGLang 压缩 FSM 的对照组。
  5. EAGLE / EAGLE-2。SGLang 投机解码的当家方案。
  6. SGLang 官方文档 —— https://docs.sglang.ai/

构建与部署

想把这本书转成 HTML 网站、PDF、EPUB,或者推到 GitHub Pages,详见 DEPLOY.md。常用命令:

python3 build_html.py      # → _site/  (含搜索 + Mermaid + KaTeX + 阅读时间)
python3 build_pdf_epub.py  # → _site/sglang-learning.pdf + .epub
./deploy_gh_pages.sh <repo-url>

如果你想把材料放别处,设环境变量 SGLANG_LEARNING_SRC / SGLANG_LEARNING_DST 即可。


关于 SGLang submodule

本仓库把 SGLang 上游作为 git submodule 挂载在 sglang/,当前固定到:

commit ed85bcf8c3639c20b7fd2970b607353db5c3abfa
        (gateway-v0.3.1-4559-ged85bcf8c, 2026-05)

第一次克隆:

git clone <this-repo-url>
git submodule update --init --recursive

更新到上游最新(注意:行号会漂,章节里的 file_path:line_number 索引会失效):

cd sglang
git fetch origin
git checkout main && git pull
cd .. && git add sglang && git commit -m "Bump SGLang submodule"

贡献与扩展

发现 file_path:line_number 失效了?SGLang 主分支变化快,欢迎 PR 修正。

想新加一章?沿用每章统一的"章首导读 + 正文 + 小结/自检/下一步"模板,已写好的样板章节可作范例:


开始读 01-overview/01-what-is-sglang.md 或者从 00-prerequisites.md 铺前置。