跳转至

SGLang 设计演进

读一个大项目的源码,最难的不是看懂某个函数,而是弄清"它为什么长成这样"。这本书把 SGLang 仓库 19000 多个提交当作一手史料:从 2023 年的论文和 2024 年 1 月的初始提交开始,按时间顺序讲每一个关键设计是在什么问题下、由哪个提交引入、替换了什么、后来怎么演变。每一章都落到具体的提交号、PR 号和日期,所有命令和数字都能在你自己的克隆上复现。

27 章命令与引用的历史代码在 SGLang 克隆上实跑核对

学完能做到

  • 看到 SGLang 今天的任何一个目录(mem_cache/、disaggregation/、speculative/、sgl-router/ ……),能说出它是什么时候、为了解决什么问题出现的,第一版长什么样;
  • 用"问题 → 第一版 → 取舍 → 后来的演变"的方式讲清 RadixAttention、零开销调度、PD 分离、大规模 EP、HiCache 这些面试必问的设计,而不是背今天的代码;
  • 掌握一套用 git 做源码考古的方法:按月提交量、路径首次出现、关键词首次出现、模块 × 季度热力表、git log -S、--follow、读 PR 和路线图 issue;
  • 对"工业级推理引擎如何从 1 万行长到 80 多万行"有数量上的直觉:哪些阶段在扩功能、哪些阶段在还技术债、哪些决定贯穿始终。

学习路线

这本书是推理系统手册的"源码导读 · SGLang"和手写 mini-sglang的续篇:前者讲今天的代码怎么读,后者照今天的模块复刻一遍,这本讲这些模块是怎么一步步长出来的。按时间分成六个部分:

部分 章节 目标 建议用时
起点(2023-10 → 2024-02) 论文 · 初始提交 · RadixAttention 第一版 · 压缩 FSM 与跳跃解码 · 前端语言 读懂作者最初的问题定义和一万行代码里的全部设计 2 天
从研究代码到可用的服务(2024 上半年) 进程模型重构 · 服务化 · 借力 vLLM · v0.2 看一个研究原型怎样变成能部署的东西 1 天
性能工程与零开销调度(2024 下半年) 目录大重组 · MLA 与 torch.compile · 重叠调度 · 多卡 · sgl-kernel 理解"快"是怎么一层层叠出来的 2 天
投机解码、PD 分离与大规模 EP(2025 上半年) EAGLE · HiCache · PD 分离 · 大规模 EP · 注意力后端 理解规模化阶段的每个新目录 2 天
从引擎到平台(2025 下半年 → 2026) 入口层 · Rust 网关 · RL 闭环 · 多模态与 Diffusion · 2026 快照 看懂成熟期的工程重点 1 天
方法与总结 十个设计决定 · git 工具箱 · 面试怎么讲 把演进讲成故事,并能自己考古 半天

先看全书的时间线:按月的提交量、版本和大事件,点一个事件就跳到对应的章节。

这本书的做法

一手史料,固定基准。 所有统计都在 SGLang 官方仓库的完整克隆上计算,基准固定为 2026-10-02 的 main 提交 29f6d408c0(书里的脚本用 $REF 指代它)。截至这个提交,仓库有 19247 个提交、165 个 tag;页面上的每个数字都来自页面上的那条命令。换一个 REF,数字会变,方法不变。

代码按提交号原样截取。 书里引用的历史代码都标明了路径、提交和行号,比如 python/sglang/srt/managers/router/radix_cache.py @ 22085081bb 的第 113–140 行。核对脚本会用 git show 提交:路径 重新截取并逐字比对,所以引用不会因为转述而失真。读的时候建议在本地克隆里同时打开那个版本:

git clone https://github.com/sgl-project/sglang.git ~/sglang-src
cd ~/sglang-src
git show 22085081bb:python/sglang/srt/managers/router/radix_cache.py | sed -n '113,140p'

官方叙述为证。 每个阶段的"作者当时怎么想",尽量引官方材料:论文、LMSYS 博客、路线图 issue、PR 描述和提交信息。推断的地方会写明是推断。

每章的体例。 章首自测 → 六格小剧场 → 正文(当时的问题、第一版代码、设计取舍)→ "后来怎么样了" → 练习(都是能用 git 回答的考古题,附参考答案)→ 怎么讲清楚。

版本与命名

SGLang 的目录在三年里多次重组。书里按当时的路径写(比如初版的 srt/managers/router/),并在每章末尾给出今天的对应位置。提交号一律用前 10 位,PR 号写成 #1234,都可以在 GitHub 上直接打开:https://github.com/sgl-project/sglang/commit/<提交号>、https://github.com/sgl-project/sglang/pull/<PR 号>。

代码与运行

全部脚本在仓库的 sglang/ 目录:

sglang/
├── docs/                正文;每章里的 ```bash title="x.sh" / ```python title="x.py" 块就是本章的考古脚本
├── tools/check_code.py  在本地克隆上重跑所有脚本、重新截取所有引用的代码,与页面逐行比对
└── build/code/          核对时写出的脚本文件

核对的方法:

git clone https://github.com/sgl-project/sglang.git ~/sglang-src      # 完整克隆约 400 MB(git log -S 这类命令要读每个提交,别用 --filter=blob:none);不要工作区可加 --no-checkout
cd ai-infra-handbooks/sglang
python3 tools/check_code.py                      # 跑全部页面;SGLANG_SRC=/path 指定克隆位置,REF=... 换基准提交
python3 tools/check_code.py docs/origins/radix-v1.md   # 只核对一章

脚本只用 git 和 Python 标准库,不需要 GPU,也不需要安装 SGLang。

发现错误或有更好的写法?在 GitHub 上编辑此页提交问题