SGLang 学习手册

SGLang Sister

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

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

版本基线(2026-08-27)

本书正文与 sglang/ 子模块的 024a7a1031fd7d789076f90e203e3a51b9656cb3 对齐。阅读命令和源码时,请以这个提交为准;上游 main 持续变化,后续更新应先移动子模块,再重新校准行号。

相较于旧版基线,当前代码有几项会影响全书的结构性变化:

变化 当前入口 对教程的影响
sglang serve 统一 CLI python/sglang/cli/serve.py、launch_server.py 新示例优先使用 sglang serve MODEL_PATH;旧模块入口仍兼容但会提示迁移
ModelRunner / CUDA Graph 拆分 srt/model_executor/model_runner.py、model_executor/runner/ Graph 捕获分为 decode 与 prefill runner,并共享进程级 memory pool / capture stream
UnifiedRadixCache + HiCache 分层 srt/mem_cache/unified_cache/、hicache_storage.py CPU/L3 缓存支持 file、Mooncake、NIXL、3FS、AIBrix 等后端
Rust 路由与网关 experimental/sgl-router/、sgl-model-gateway/ 路由策略、gRPC、MCP、鉴权和多模型网关分开描述
Scheduler 运行时负载发布 srt/managers/scheduler_components/load_publisher.py 可选 ZMQ PUB 按 scheduler 发布排队数、运行数与 KV 使用量,供进程外 load-aware router 订阅
Spec V2 / adaptive / DFlash / N-gram srt/speculative/ adaptive EAGLE 可按 batch 与接受率切换 draft steps;启动 buffer 按所有候选档位上界分配
EP 负载均衡 srt/eplb/、srt/layers/moe/waterfill.py EPLB 与 Waterfill 是独立于 DeepEP 通信后端的负载策略
权重预加载显存核算 model_executor/model_runner.py、srt/weight_cache/ 已驻留权重会计回 KV 容量采样基线,避免高估可分给 KV pool 的显存
多模态与扩散 srt/disaggregation/encoder/、srt/multimodal/processors/、multimodal_gen/ Encoder 可独立部署;CPU 预处理自动用 2 workers;native LingBot-Video 统一 text-encoder forward 并兼容 tied Qwen3-VL embeddings
MORI P/D 控制面统一 srt/disaggregation/common/utils.py、disaggregation/mori/conn.py MORI 使用公共 TransferKVChunk,按 room 汇总成功/失败并保证 Decode 状态只通知一次

这份手册解决什么问题

我写这份笔记,是因为自己读 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 部分 49 章
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-sglang → 02-architecture → 01-radix-attention → 03-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/01 → 01-overview/03 → 02-core-concepts/ 全部
生产部署速通(~10h) 01-overview/02 → 08-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(当前约 5,300 行)
Schedule 策略 sglang/python/sglang/srt/managers/schedule_policy.py、schedule_batch.py
RadixAttention 数据结构 sglang/python/sglang/srt/mem_cache/radix_cache.py
内存池 / 分配器 sglang/python/sglang/srt/mem_cache/memory_pool.py、allocator/{base,token,paged}.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 / Model Gateway sglang/experimental/sgl-router/、sglang/sgl-model-gateway/(Rust 实现)
CUDA / 自定义 kernel sglang/python/sglang/kernels/(AOT/JIT 与 Python op 绑定)
基准测试脚本 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:238)。字段读完,整个模块的代码就只是在维护这些字段。

打 print 比读注释快。 启动 server 时加 --log-level debug,在 Scheduler.event_loop_normal 和 RadixCache.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:303`](sglang/python/sglang/srt/mem_cache/radix_cache.py)。
SGLang 的 cache-aware scheduler 在什么场景下比 FCFS 显著更好?病态情况是什么? 收益最大:前缀复用率高 + 命中长度差异大(命中长的请求 prefill 几乎是免费的,先跑性价比高)。病态:长尾队首 starve、新业务冷启动、短 prompt 全均命中退化为 FCFS。当前默认本身是 `fcfs`,需显式选择 `lpm` / `dfs-weight` 才启用 cache-aware 排序。详见 [`02-core-concepts/03-cache-aware-scheduling.md`](02-core-concepts/03-cache-aware-scheduling.md)、源码 [`schedule_policy.py:237`](sglang/python/sglang/srt/managers/schedule_policy.py)。
压缩 FSM 比朴素 vocab mask 快多少?Jump-ahead 的代价在哪? 收益取决于 schema、后端和字面量占比;Outlines 的 jump-ahead 可让"必出"段一次推进多个 token,但编译和 mask 成本也可能抵消收益。当前默认 grammar backend 是 `xgrammar`,应以同一 schema 的端到端 benchmark 选型。详见 [`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:2776`](sglang/python/sglang/srt/entrypoints/http_server.py)。
Token-level KV 管理 vs Page-level 各自的优劣? Page=1 路径命中精确、分支自然,但索引更大且要求 backend 支持细粒度 indirection;大页路径索引更小、可能符合特定 kernel 布局,但命中必须页对齐。SGLang 当前会按平台、模型和 backend 解析 page size,不能假设跨平台固定为 1。详见 [`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/Gateway 采用 Rust 数据面;单模型可用 `experimental/sgl-router`,多模型、PD、gRPC 和可靠性能力使用 `sgl-model-gateway`。`cache_aware` 依赖 prefix/tree 或 KV indexer 信号,策略和参数以对应 README 为准。详见 [`08-production-deployment/07-router.md`](08-production-deployment/07-router.md)、源码 [`sglang/experimental/sgl-router/`](sglang/experimental/sgl-router/) 与 [`sglang/sgl-model-gateway/`](sglang/sgl-model-gateway/)。
FlashInfer 的 Cascade Inference 在 SGLang 里如何被触发? 选择 `dfs-weight` 时,`SchedulePolicy` 把同 RadixTree 子树的请求排到相邻位置,再由 `PrefillAdder` 按 token/KV budget 装入本轮 batch;FlashInfer backend 的 `WrapperDispatch`([`flashinfer_backend.py:114`](sglang/python/sglang/srt/layers/attention/flashinfer_backend.py))检测 batch 形态后选择 paged/cascade wrapper。详见 [`04-optimizations/01-flashinfer.md`](04-optimizations/01-flashinfer.md)。
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 024a7a1031fd7d789076f90e203e3a51b9656cb3
        ([diffusion] Fix native LingBot-Video text encoding, 2026-08-27)

第一次克隆:

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 铺前置。