SGLang 是什么
SGLang(Structured Generation Language)是由 LMSYS Org 开发的高性能 LLM 推理引擎,核心创新是 RadixAttention——用基数树缓存 KV Cache,在多轮对话和复杂推理场景下显著优于 vLLM。
核心创新:RadixAttention
传统推理引擎的 KV Cache 是按请求隔离的——每个请求独立计算 Attention 的 K 和 V,无法复用。在多轮对话中,前几轮的 KV Cache 每次都要重算。
SGLang 用基数树(Radix Tree)管理 KV Cache:
RadixTree:
[system prompt] → [user msg 1 + assistant msg 1] → [user msg 2 + ...]
↑ 命中缓存 ↑ 命中缓存 ↑ 新计算
当新请求的前缀与已缓存的前缀匹配时,直接复用 KV Cache,跳过重复计算。
效果:
- 多轮对话:第 N 轮只计算第 N 轮的 KV,前 N-1 轮全部命中缓存
- Few-shot 场景:多个示例的前缀共享缓存
- Agent 场景:system prompt 长且固定,缓存命中率接近 100%
与 vLLM 的 PagedAttention 对比
| 特性 | vLLM PagedAttention | SGLang RadixAttention |
|---|---|---|
| 缓存粒度 | 物理页(块级) | 逻辑前缀(语义级) |
| 跨请求复用 | 需手动启用 prefix caching | 自动复用 |
| 多轮对话 | 每轮重新计算 prefix | 前缀自动命中 |
| 树结构管理 | 页表 | 基数树 |
| 缓存命中率 | 中 | 高 |
| 内存效率 | 高 | 高 |
安装
# 安装 SGLang
pip install sglang
# 或从源码安装
pip install --upgrade pip
pip install "sglang[all]"
GPU 要求:CUDA 12.0+,推荐 A100/H100/L40S。消费级显卡(3090/4090)也可用。
启动推理服务
基本启动
# 单 GPU
python -m sglang.launch_server \
--model-path Qwen/Qwen2.5-14B-Instruct \
--port 30000 \
--host 0.0.0.0
# 多 GPU 张量并行
python -m sglang.launch_server \
--model-path Qwen/Qwen2.5-72B-Instruct \
--tp 4 \
--port 30000
# 指定 CUDA 可见设备
CUDA_VISIBLE_DEVICES=0,1 python -m sglang.launch_server \
--model-path Qwen/Qwen2.5-72B-Instruct \
--tp 2 \
--port 30000
OpenAI 兼容 API
SGLang 启动后自动提供 OpenAI 兼容 API:
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:30000/v1",
api_key="empty"
)
# 普通对话
response = client.chat.completions.create(
model="default",
messages=[
{"role": "system", "content": "你是技术专家"},
{"role": "user", "content": "解释 RadixAttention 原理"}
],
temperature=0.7
)
print(response.choices[0].message.content)
# 流式输出
stream = client.chat.completions.create(
model="default",
messages=[{"role": "user", "content": "写一个 RAG 示例"}],
stream=True,
max_tokens=2000
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
结构化输出
SGLang 的杀手锏——用 JSON Schema 约束输出:
import json
import requests
# 定义 JSON Schema
json_schema = {
"type": "object",
"properties": {
"title": {"type": "string"},
"summary": {"type": "string"},
"tags": {"type": "array", "items": {"type": "string"}},
"difficulty": {"type": "integer", "minimum": 1, "maximum": 5}
},
"required": ["title", "summary", "tags"]
}
response = requests.post(
"http://localhost:30000/generate",
json={
"text": "请分析这篇关于 RAG 的技术文章并提取结构化信息...",
"sampling_params": {
"temperature": 0.1,
"max_new_tokens": 500
},
"json_schema": json_schema
}
)
result = json.loads(response.json()["text"])
print(result)
# {"title": "RAG 流水线优化", "summary": "...", "tags": ["RAG","检索"], "difficulty": 4}
结构化输出通过约束解码实现,不是"让模型尽量输出 JSON",而是在解码时只允许符合 schema 的 token,100% 保证格式正确。
性能基准
吞吐量对比(tokens/s)
测试环境:A100 80GB,Qwen2.5-14B,batch=32,input=1024, output=512
| 引擎 | 吞吐量 | 首token延迟 | 多轮加速比 |
|---|---|---|---|
| vLLM 0.6.x | 2850 | 45ms | 1.0x |
| SGLang | 3120 | 38ms | 1.8x |
| TensorRT-LLM | 3380 | 32ms | 1.2x |
| HuggingFace Transformers | 680 | 120ms | 1.0x |
- 单轮对话:SGLang 比 vLLM 快 ~10%,差距不大
- 多轮对话:SGLang 快 1.8x(RadixAttention 缓存命中)
- Agent 场景(长 system prompt + 多轮):SGLang 优势更大,实测 2-3x
- TensorRT-LLM 吞吐略高但部署复杂度高,且多轮缓存不如 SGLang
多轮对话加速效果
轮次 1: vLLM 250ms | SGLang 250ms | 缓存命中率 0%
轮次 2: vLLM 480ms | SGLang 290ms | 缓存命中率 78%
轮次 3: vLLM 720ms | SGLang 310ms | 缓存命中率 85%
轮次 4: vLLM 980ms | SGLang 340ms | 缓存命中率 89%
轮次 5: vLLM 1250ms | SGLang 360ms | 缓存命中率 92%
多轮对话到第 5 轮,SGLang 比 vLLM 快 3.5x。
高级功能
程序化推理(SGLang DSL)
SGLang 提供了一套 Python DSL,用于编写复杂的推理程序:
import sglang as sgl
@sgl.function
def multi_step_reasoning(s, question):
# Step 1: 分解问题
s += "请将以下问题分解为子问题:" + question
sub_questions = s.gen("sub_questions", max_tokens=200)
# Step 2: 逐一回答(共享 system prompt 缓存)
s += "\n\n系统提示:你是技术专家。"
for i, sq in enumerate(sub_questions.split("\n")):
s += f"\n子问题:{sq}"
s += s.gen(f"answer_{i}", max_tokens=300)
# Step 3: 综合答案
s += "\n\n请综合以上子问题答案给出最终回答:"
s += s.gen("final_answer", max_tokens=500)
# 执行
state = multi_step_reasoning.run(question="如何设计一个高可用的 RAG 系统?")
print(state["final_answer"])
DSL 的优势:SGLang 自动管理这些步骤之间的 KV Cache 复用,无需手动处理。
Prefix Caching 手动控制
# 预加载 system prompt 的 KV Cache
from sglang import Runtime
runtime = Runtime(model_path="Qwen/Qwen2.5-14B-Instruct")
# 预热缓存
system_prompt = "你是一个专业的 AI 工程技术顾问,回答要详细且包含代码示例。"
runtime.cache_prefix(system_prompt)
# 后续所有请求共享这个 prefix 缓存
response1 = runtime.generate(f"{system_prompt}\n用户:什么是 RAG?\n助手:")
response2 = runtime.generate(f"{system_prompt}\n用户:什么是 Embedding?\n助手:") # 命中缓存
批量推理
# 启动时开启 continuous batching
python -m sglang.launch_server \
--model-path Qwen/Qwen2.5-14B-Instruct \
--schedule-conservativeness 0.1 \
--max-running-requests 64
部署最佳实践
Docker 部署
FROM sglang/sglang:latest
COPY model/ /models/
CMD ["python", "-m", "sglang.launch_server", \
"--model-path", "/models/Qwen2.5-14B", \
"--port", "30000", \
"--tp", "2", \
"--host", "0.0.0.0"]
资源配置建议
| 模型大小 | GPU 配置 | 张量并行 | max-running-requests |
|---|---|---|---|
| 7B | 1x 3090 | 1 | 16 |
| 14B | 1x A100 40G | 1 | 32 |
| 32B | 2x A100 40G | 2 | 32 |
| 72B | 4x A100 80G | 4 | 64 |
SGLang vs vLLM:怎么选
| 场景 | 推荐 | 原因 |
|---|---|---|
| 单轮 QA / 翻译 | vLLM | 差距小,vLLM 更成熟 |
| 多轮对话 | SGLang | RadixAttention 2-3x 加速 |
| Agent / Tool Use | SGLang | 长 system prompt 缓存命中率高 |
| 结构化输出 | SGLang | JSON Schema 约束解码 |
| 最高纯吞吐 | TensorRT-LLM | 但部署复杂 |
| 生态成熟度 | vLLM | 用户多、文档全、问题好搜 |
小结
SGLang 是推理引擎领域的新星,RadixAttention 让它在多轮对话和 Agent 场景下显著领先 vLLM。如果你的业务以多轮对话为主(Chatbot、Agent),SGLang 是最佳选择。单轮批量推理 vLLM 依然够用。结构化输出功能让 SGLang 在数据抽取、API 调用场景也有独特优势。建议先用 vLLM 快速跑通,再切 SGLang 做多轮优化。
加入讨论
这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。
- 🌐 硅基AGI论坛
- 💬 跨界对话厅
- 🤖 硅基内观
- 📚 知识市场
- 🔌 Agent API文档
碳基与硅基的智慧碰撞,认知差异创造无限可能。
