SGLang 与 vLLM 的差异

一句话速记

vLLM 是通用 LLM 推理”基础设施”,PagedAttention + Continuous Batching 全场景适用、生态最广;SGLang 是另一条路线——核心是 RadixAttention(用 radix tree 做更狠的 prefix 共享)+ 结构化生成快(JSON / 工具调用比 vLLM 明显快),适合 Agent / 多轮对话 / 重 prefix 重叠 的场景。简化结论:通用服务 vLLM 稳,重 prefix 共享 / 结构化输出 / 多轮对话场景 SGLang 有优势,两者都是生产级,能小成本测试谁更适合就测。

通俗解释(5 分钟版)

两个框架的”灵魂差异”

维度vLLMSGLang
出品UC BerkeleyUC Berkeley LMSYS(也是 Vicuna 团队)
核心创新PagedAttentionRadixAttention
Prefix sharing整段前缀匹配(哈希)radix tree 前缀树(细粒度)
结构化输出支持(vLLM 0.6+ 有 outlines/xgrammar)原生强项(JSON/regex/grammar 编译为 FSM)
API 风格OpenAI 兼容OpenAI 兼容 + 自有 SGLang DSL
生态最广(HuggingFace、Ray、k8s 集成都有)后起,但增长快
文档/调试文档丰富文档相对少
典型用户通用 LLM 服务、推理平台Agent、code interpreter、多轮 chat

RadixAttention 是什么

vLLM 的 prefix caching 是基于”前缀 hash”的——两条请求完全一样的前缀才能共享。SGLang 的 RadixAttention 用 radix tree(前缀树) 管理所有 KV cache,做到细粒度复用

   场景:多轮对话,user 三次问类似但不同的问题
   
   req1: "你是 agent. ... user: 查北京天气"
   req2: "你是 agent. ... user: 查上海天气"
   req3: "你是 agent. ... user: 查北京 GDP"
   
   vLLM 的 prefix caching:
       三次 prefix "你是 agent..." 完全一样 → 共享
       但 "查北京" / "查上海" 这部分独立算
   
   SGLang 的 RadixAttention:
       Radix tree:
              "你是 agent..."   (共享 KV)
                     │
              "user: 查"        (共享 KV)
                  ┌─┼─┐
            "北京天气" "上海天气" "北京 GDP"
                  │       │           │
                 KV1     KV2         KV3
       
       连"查北京"这个共同前缀也能共享 KV

实际效果:在 multi-turn chat、tree-of-thought 搜索、多 prompt 评估等”前缀有树形重叠”的场景下,SGLang 的 KV 命中率明显高于 vLLM。

结构化输出更快

LLM 输出 JSON 时,传统做法是生成完文本再 parse;SGLang 把 JSON schema 编译成有限状态机(FSM),每个 decode step 直接限制候选 token 在合法集合内 → 既保证 100% schema 合法、又省了 token 数(不会生成无效字符)。

   vLLM (用 outlines 等插件): 50% 提速
   SGLang 原生 (xgrammar/sgl): 1.5-3x 提速

Function Calling 密集 的 Agent 服务,这是直接降本。

关键细节 / 数学直觉

1)RadixAttention 工作机制

LRU 替换的 radix tree:

  • 每条请求的 KV 按 token 路径插入 tree
  • 命中节点直接复用 KV,不命中节点新分配
  • 显存满了按 LRU 踢掉最久未访问的子树
  • 共享系数 = (节点 KV size) / (经过该节点的请求数),越多请求经过越值得保留

性能数据(论文):

  • Multi-turn chat:吞吐 vs vLLM 提升 1.5-3x
  • Long document QA(多个 query 同一文档):3-5x
  • Tree-of-Thought5x+(树状搜索天然有大量前缀重叠)

2)SGLang DSL(DSL 是它的特色,但不是必须用)

import sglang as sgl
 
@sgl.function
def multi_turn(s, question):
    s += sgl.system("你是助手")
    s += sgl.user(question)
    s += sgl.assistant(sgl.gen("answer", max_tokens=200))
 
# 多个请求自动组合 + 复用 KV
states = multi_turn.run_batch([{"question": q} for q in questions])

这套 DSL 是 SGLang 论文展示其威力的方式,但生产部署时大家依然用 OpenAI 兼容 API/v1/chat/completions),DSL 是 nice-to-have。

3)起服务最简

# SGLang
pip install "sglang[all]"
python -m sglang.launch_server \
    --model-path meta-llama/Meta-Llama-3-8B-Instruct \
    --port 30000
 
# 调用(OpenAI 兼容)
curl localhost:30000/v1/chat/completions \
    -H "Content-Type: application/json" \
    -d '{"model": "...", "messages": [...]}'

4)量化 / 多卡 / 长 context

两家都支持得不错:

  • 量化:vLLM 支持 AWQ/GPTQ/FP8/INT4;SGLang 类似覆盖
  • Tensor Parallel:都支持 --tp-size N
  • 长 context:vLLM 支持 PagedAttention 长 context;SGLang 也有 RadixAttention 的长 context 优化(StreamingLLM 风格)

5)选型决策表

   场景                        建议
   ──────────────────────────────────────
   通用 chat 服务                vLLM(生态/文档)
   多租户大平台                   vLLM(成熟稳)
   重 system prompt(Agent)     vLLM 开 prefix-caching ≈ SGLang
   多轮 chat(user 切换上下文)   SGLang 优势
   ToT / 多分支评估              SGLang 优势
   Function Calling 密集         SGLang 优势(结构化更快)
   Code interpreter / 代码执行    任意(但 SGLang DSL 更顺手)
   边缘设备 / 端侧                 都不主推 → llama.cpp / MLC-LLM
   极致单卡性能                   TensorRT-LLM
   ──────────────────────────────────────

6)Benchmark 怎么做(自己测)

# vLLM 自带
python benchmark_serving.py \
    --backend vllm --request-rate 10 --num-prompts 1000
 
# SGLang
python -m sglang.bench_serving \
    --backend sglang --request-rate 10 --num-prompts 1000

关键:用你自己业务的真实 prompt 形态 benchmark——别拿 sharegpt 数据集得出的结论直接迁移到你重 system prompt 的 Agent 场景。

延伸追问

  • Q: 二者会”越来越像”吗? → 是。vLLM 0.5+ 加了类似 prefix tree 的优化,SGLang 也在追 vLLM 的部署成熟度。未来可能两者主要差别只是 API 风格。但目前 SGLang 在 RadixAttention + 结构化输出仍领先。
  • Q: 可以用同一套部署架构同时支持 vLLM 和 SGLang 吗? → 可以。两者都暴露 OpenAI 兼容接口,应用层完全不用改。多家平台(OpenLLM、Ray Serve)都支持两个 backend。
  • Q: Agent 场景具体能省多少? → 实测经验值:① system prompt + tools desc 共 30K,每秒 100 个不同 user query → vLLM 开 prefix-caching 提速 ~2x,SGLang RadixAttention 提速 ~2.5x ② 结构化 JSON 输出(function calling)SGLang vs vLLM 提速 ~1.5x。真省钱
  • Q: 具身机器人会用哪个? → 云端规划层 LLM 大量场景重 prefix(system prompt 描述任务规则、技能列表),SGLang 有优势;本机如果跑小模型,更可能用 llama.cpp / MLC-LLM。

我的记法

  • vLLM = LLM 服务的通用底座,生态宽
  • SGLang = LLM 服务的”prefix 优化版”,多轮/结构化场景更狠
  • 杀手锏对比:PagedAttention(vLLM)vs RadixAttention(SGLang)
  • 都 OpenAI 兼容、都生产级、A/B 测试就能选
  • 一句话:「vLLM 像 nginx,SGLang 像高度优化的 envoy——通用要 vLLM,Agent 重 prefix 试 SGLang」

状态

  • 已背速记
  • 能讲通俗版
  • 能答追问
  • 用 SGLang 起过服务并 benchmark 跟 vLLM 对比

参考资料