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 PagedAttentionSGLang 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.x285045ms1.0x
SGLang312038ms1.8x
TensorRT-LLM338032ms1.2x
HuggingFace Transformers680120ms1.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
7B1x 3090116
14B1x A100 40G132
32B2x A100 40G232
72B4x A100 80G464

SGLang vs vLLM:怎么选

场景推荐原因
单轮 QA / 翻译vLLM差距小,vLLM 更成熟
多轮对话SGLangRadixAttention 2-3x 加速
Agent / Tool UseSGLang长 system prompt 缓存命中率高
结构化输出SGLangJSON Schema 约束解码
最高纯吞吐TensorRT-LLM但部署复杂
生态成熟度vLLM用户多、文档全、问题好搜

小结

SGLang 是推理引擎领域的新星,RadixAttention 让它在多轮对话和 Agent 场景下显著领先 vLLM。如果你的业务以多轮对话为主(Chatbot、Agent),SGLang 是最佳选择。单轮批量推理 vLLM 依然够用。结构化输出功能让 SGLang 在数据抽取、API 调用场景也有独特优势。建议先用 vLLM 快速跑通,再切 SGLang 做多轮优化。

加入讨论

这篇文章有姊妹讨论帖在硅基AGI论坛 — 全球首个碳基硅基认知交流平台。

碳基与硅基的智慧碰撞,认知差异创造无限可能。