SGLang 深读:结构化输出与高吞吐推理如何在一个 serving 框架里共存
从架构分层讲清 SGLang 如何用前端 DSL、运行时与调度器支撑结构化输出和高并发推理,附最小可用示例与同类项目定位对照。
结构化输出和低延迟高吞吐,在多数推理栈里是一对矛盾:约束解码要逐步检查语法状态,天然拖慢 token 生成。SGLang 的核心主张是这两件事不该分家——它把「怎么让模型按格式说话」和「怎么把 GPU 喂饱」放进同一个运行时里,用一套前端语言加一个调度器同时管住。
先看这个项目的体量:Apache-2.0 许可,Python 实现,GitHub 星标 37257、fork 9654,仓库 2024 年 1 月创建,最近一次推送在 2026 年 10 月。topics 里除了 llm、transformer、attention、moe,还列着 diffusion、vlm、reinforcement-learning 和 cuda——这不是一个只做文本补全的服务端,而是一个覆盖多模态、扩散生成和 RL rollout 的推理底座。
一个框架,三种负载
README 开篇的定义值得逐字读:「an open-source inference framework for large language, vision-language, and diffusion models, optimized for agentic workloads, large-scale serving, and RL rollouts.」
这句话里藏着三个不同的优化目标:
- agentic workloads:多轮、带工具调用、要求输出可被程序解析。这正是结构化输出的战场。
- large-scale serving:大规模在线服务,拼的是吞吐、显存利用率和并发调度。
- RL rollouts:强化学习训练中反复采样,要求引擎能被训练框架高频调用。
传统做法是拿一个通用推理引擎跑前两类,再让训练框架自己处理第三类。SGLang 的选择是把扩散模型生成引擎直接塞进仓库和 sglang Python 包里——README 明确写了 SGLang Diffusion 是「built-in image and video generation engine, included in this repository and the sglang Python package」。一个包,三种模型形态。
架构:从 DSL 到硬件的四层
README 没有给架构图,但从功能描述和生态表可以还原出清晰的分层。SGLang 的组件命名是真实存在的,下面每一层都能在素材里找到对应物。
第一层:前端语言层(DSL)
SGLang 的「Lang」指的就是这层。它的设计来源在致谢里写得很直白——学习并复用了 Guidance、Outlines、LMQL 的设计。这三个项目都指向同一件事:用声明式语法描述生成约束,而不是在 prompt 里靠自然语言祈祷模型输出 JSON。结构化输出不是后处理,是在生成时就把语法状态机挂上去。
第二层:服务与接口层
模型启动后对外暴露请求接口,文档里的 Quickstart 路径是「跑起第一个模型并发送请求」。这一层负责接收请求、组织 batch、把前端 DSL 的约束带进运行时。
第三层:运行时与调度器
这是吞吐的来源。README 把大规模 serving 和 RL rollout 并列,说明调度器要同时应对在线请求的长短不一和训练采样的批量突发。KV cache 管理、continuous batching 这类机制是这一层的职责——素材没有逐条列出实现细节,但「large-scale serving」和「显存高效」是这个层级的明确目标。
第四层:硬件后端层
README 用一整张表列了支持的平台,这是 SGLang 最容易被低估的部分:
| 平台 | 代表硬件 |
|---|---|
| NVIDIA | B200/B300/GB200/GB300、H100/H200/H800/H20、A100、RTX 30/40/50 系列、RTX 6000 Ada / PRO 6000、DGX Spark、Jetson Orin |
| AMD | Instinct MI300X、MI325X、MI350X、MI355X |
| Google TPU | v6e、v7;经 SGL-JAX / SGL-torchtpu 接入 |
| Intel | Arc / Arc Pro B-Series GPU、Xeon CPU |
| Apple Silicon | Mac,经 Metal / MLX |
| 华为昇腾 | A2、A3、950PR/DT NPU |
| 摩尔线程 | MTT S5000 GPU |
还有一批「集成中」的:AWS Trainium、阿里平头哥 PPU、寒武纪 MLU、高通 QAIC、沐曦、海光 HCU/DCU、天数智芯。这张表说明 SGLang 的定位不是「某个 GPU 厂商的优化套件」,而是要在异构算力上做统一的 serving 层。
数据流大致是:请求进入接口层 → 前端 DSL 把结构化约束编译成生成时的状态 → 调度器把请求和其他请求一起组 batch → 运行时在目标硬件后端上执行 attention 与采样 → 结果按约束校验后返回。
最小可用示例
README 给了两条安装路径,一条 Docker,一条 Python 包管理器。Docker 镜像自带依赖,是省事的选择:
bashdocker pull lmsysorg/sglang:latest
在已激活的 Python 环境里用 uv 安装:
bashuv pip install --prerelease=allow sglang
注意 --prerelease=allow 这个参数——它表示安装时允许预发布版本,说明官方推荐的安装路径会拉取预发布包。装完之后启动模型,README 把具体命令指向了 Quickstart 和 Cookbook:Cookbook 的用法是「选模型和硬件,拿到一条可直接运行的启动命令」。这是比在 README 里堆几十条命令更聪明的做法,因为启动参数强依赖硬件和模型组合。
开发者路径则不同,从 lmsysorg/sglang:dev 镜像起步,在容器内以可编辑模式安装:
bashpip install -e "python"
或者在虚拟环境里用 uv pip install --prerelease=allow -e "python"。注意安装目标是 python 子目录,说明仓库是多目录结构,Python 包在 python/ 下,这与 README 末尾提到的 docs/README.md 文档目录并存。
生态:它不打算一个人干完所有事
README 里那张 SGL Ecosystem 表,是理解 SGLang 边界的关键。它把周边能力分成六类,每类都指向外部项目:
| 领域 | 项目 | 用途 |
|---|---|---|
| 扩散生成 | SGLang Diffusion | 内置于 SGLang,做图像与视频生成 |
| 音频 | SGLang Omni | TTS 与 ASR 的音频模型 serving |
| 投机解码 | SpecForge | 训练 draft 模型并在 SGLang 上部署 |
| RL 与后训练 | Miles、slime、AReaL、Tunix、verl | 训练框架,集成 SGLang 做 rollout 生成 |
| 部署与编排 | SMG、RBG、llm-d、Ray Serve、NVIDIA Dynamo | 路由、负载均衡、集群编排 |
| 教育 | Mini-SGLang、zero-to-sglang、DeepLearning.AI 课程 | 学推理引擎设计与高效生成 |
这张表透露出一个清晰的分工哲学:SGLang 做推理引擎这一层,往上不碰编排(交给 Ray Serve、llm-d、Dynamo),往下不碰训练(交给 verl、slime 这些框架来调它做 rollout)。投机解码单独拆出 SpecForge 训练 draft 模型,引擎只负责部署。教育线甚至提供了 Mini-SGLang 这样的精简实现供人读代码——一个项目愿意维护「教学版」,通常意味着它的核心抽象经得起剥离。
和 vLLM 的定位差异
同主题对照里最直接的是 vLLM:约 93588 星,Python,Apache-2.0,定位是「高吞吐、显存高效的推理与服务引擎」,典型用法是部署在线推理服务,靠 PagedAttention 管理 KV cache 提升并发。
两者在「高吞吐 serving」这个交集上正面竞争,但重心不同:
- vLLM 的叙事核心是显存管理与 KV cache 调度,PagedAttention 是它的标志性机制。
- SGLang 的叙事核心是前端语言 + 运行时的一体化。结构化输出不是附加特性,而是名字里那个「Lang」的由来;同时它把扩散模型生成内置进主包,覆盖面比纯文本 LLM serving 更宽。
换句话说,如果你的需求是「把一批文本请求高效地服务出去」,两者都能做;如果你的需求是「让 agent 稳定产出可解析的结构化结果」或者「同一个服务里既要文本又要图像视频生成」,SGLang 的设计更贴。README 的致谢里明确写了复用 vLLM 的代码——这不是竞品的客套,是同一技术脉络上的分叉。
其余对照项目则基本不在同一赛道:whisper.cpp 是纯 C/C++ 的语音识别移植,走的是无 Python 依赖的本地离线路线;fish-speech 是 TTS 模型本身而非 serving 框架;heretic 是模型合规性处理工具;mmdetection 是检测任务的训练与 benchmark 工具箱。它们和 SGLang 的交集只在「都基于 Transformer」这一层,工程问题完全不同。
谁在用它,以及为什么值得读代码
README 说 SGLang 由 LMSYS 托管,一个非营利开源组织。它服务「AI labs、云平台、企业和高校」的生产负载——这句话在素材里只有定性描述,没有具体客户名单和数字,不做展开。
更实际的信号是贡献路径的成熟度:从 lmsysorg/sglang:dev 镜像起步,pre-commit run --all-files 做提交前检查,新行为要加回归覆盖,性能相关改动要附 benchmark 或精度评估。长期活跃的贡献者还能拿到编码 agent 的赞助(Cursor、Claude Code、OpenAI Codex)。这套机制说明项目已经过了「靠一两个核心开发者推着走」的阶段。
对想深入推理引擎的人来说,README 里那条教育线值得注意:Mini-SGLang 是精简实现,zero-to-sglang 是中文教程,还有 DeepLearning.AI 的短课程。一个 serving 框架愿意把核心机制拆成可教学的最小版本,通常意味着它的架构分层是清晰的——这也回到本文开头那个判断:结构化输出和高吞吐能共存,前提是前端约束和运行时调度被设计成同一套抽象的两面,而不是两个事后拼接的模块。
源码在 github.com/sgl-project/sglang,官网 sglang.io,文档在 docs.sglang.io,按模型和硬件查启动命令的 Cookbook 在 cookbook.sglang.io。