name: sglang description: 快速结构化生成和为LLM提供服务的框架,带有RadixAttention前缀缓存。用于JSON/正则表达式输出、约束解码、带有工具调用的代理工作流,或当您需要比vLLM快5倍的推理速度并带有前缀共享时。在xAI、AMD、NVIDIA和LinkedIn上支持300,000+ GPUs。 version: 1.0.0 author: Orchestra Research license: MIT tags: [推理服务, SGLang, 结构化生成, RadixAttention, 前缀缓存, 约束解码, 代理, JSON输出, 快速推理, 生产规模] dependencies: [sglang, torch, transformers]
SGLang
高性能的LLM和VLM服务框架,带有RadixAttention用于自动前缀缓存。
何时使用SGLang
使用SGLang时:
- 需要结构化输出(JSON、正则表达式、语法)
- 构建带有重复前缀的代理(系统提示、工具)
- 带有函数调用的代理工作流
- 带有共享上下文的多轮对话
- 需要更快的JSON解码(3倍于标准)
改用vLLM时:
- 简单的无结构文本生成
- 不需要前缀缓存
- 想要成熟、广泛测试的生产系统
改用TensorRT-LLM时:
- 最大单请求延迟(不需要批处理)
- 仅NVIDIA部署
- 需要在H100上使用FP8/INT4量化
快速开始
安装
# pip安装(推荐)
pip install "sglang[all]"
# 带有FlashInfer(更快,CUDA 11.8/12.1)
pip install sglang[all] flashinfer -i https://flashinfer.ai/whl/cu121/torch2.4/
# 从源代码
git clone https://github.com/sgl-project/sglang.git
cd sglang
pip install -e "python[all]"
启动服务器
# 基本服务器(Llama 3-8B)
python -m sglang.launch_server \
--model-path meta-llama/Meta-Llama-3-8B-Instruct \
--port 30000
# 带有RadixAttention(自动前缀缓存)
python -m sglang.launch_server \
--model-path meta-llama/Meta-Llama-3-8B-Instruct \
--port 30000 \
--enable-radix-cache # 默认:启用
# 多GPU(张量并行)
python -m sglang.launch_server \
--model-path meta-llama/Meta-Llama-3-70B-Instruct \
--tp 4 \
--port 30000
基本推理
import sglang as sgl
# 设置后端
sgl.set_default_backend(sgl.OpenAI("http://localhost:30000/v1"))
# 简单生成
@sgl.function
def simple_gen(s, question):
s += "Q: " + question + "
"
s += "A:" + sgl.gen("answer", max_tokens=100)
# 运行
state = simple_gen.run(question="法国的首都是什么?")
print(state["answer"])
# 输出:"法国的首都是巴黎。"
结构化JSON输出
import sglang as sgl
@sgl.function
def extract_person(s, text):
s += f"从文本中提取人物信息:{text}
"
s += "输出JSON:
"
# 约束JSON生成
s += sgl.gen(
"json_output",
max_tokens=200,
regex=r'\{"name": "[^"]+", "age": \d+, "occupation": "[^"]+"\}'
)
# 运行
state = extract_person.run(
text="John Smith是一名35岁的软件工程师。"
)
print(state["json_output"])
# 输出:{"name": "John Smith", "age": 35, "occupation": "software engineer"}
RadixAttention(关键创新)
它做什么:自动缓存和跨请求重用公共前缀。
性能:
- 5倍更快用于带有共享系统提示的代理工作负载
- 10倍更快用于带有重复示例的少样本提示
- 零配置 - 自动工作
工作原理:
- 构建所有处理令牌的基数树
- 自动检测共享前缀
- 重用匹配前缀的KV缓存
- 仅计算新令牌
示例(带有系统提示的代理):
请求1:[SYSTEM_PROMPT] + "天气怎么样?"
→ 计算完整提示(1000令牌)
请求2:[相同系统提示] + "预订航班"
→ 重用系统提示KV缓存(998令牌)
→ 仅计算2个新令牌
→ 5倍更快!
结构化生成模式
带有模式的JSON
@sgl.function
def structured_extraction(s, article):
s += f"文章:{article}
"
s += "以JSON格式提取关键信息:
"
# JSON模式约束
schema = {
"type": "object",
"properties": {
"title": {"type": "string"},
"author": {"type": "string"},
"summary": {"type": "string"},
"sentiment": {"type": "string", "enum": ["positive", "negative", "neutral"]}
},
"required": ["title", "author", "summary", "sentiment"]
}
s += sgl.gen("info", max_tokens=300, json_schema=schema)
state = structured_extraction.run(article="...")
print(state["info"])
# 输出:符合模式的有效JSON
正则表达式约束生成
@sgl.function
def extract_email(s, text):
s += f"从文本中提取电子邮件:{text}
"
s += "电子邮件:"
# 电子邮件正则表达式模式
s += sgl.gen(
"email",
max_tokens=50,
regex=r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
)
state = extract_email.run(text="联系john.doe@example.com获取详情")
print(state["email"])
# 输出:"john.doe@example.com"
基于语法的生成
@sgl.function
def generate_code(s, description):
s += f"为以下描述生成Python代码:{description}
"
s += "```python
"
# Python的EBNF语法
python_grammar = """
?start: function_def
function_def: "def" NAME "(" [parameters] "):" suite
parameters: parameter ("," parameter)*
parameter: NAME
suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT
"""
s += sgl.gen("code", max_tokens=200, grammar=python_grammar)
s += "
```"
带有函数调用的代理工作流
import sglang as sgl
# 定义工具
tools = [
{
"name": "get_weather",
"description": "获取某个位置的天气",
"parameters": {
"type": "object",
"properties": {
"location": {"type": "string"}
}
}
},
{
"name": "book_flight",
"description": "预订航班",
"parameters": {
"type": "object",
"properties": {
"from": {"type": "string"},
"to": {"type": "string"},
"date": {"type": "string"}
}
}
}
]
@sgl.function
def agent_workflow(s, user_query, tools):
# 系统提示(通过RadixAttention缓存)
s += "您是一个有帮助的助手,可以访问工具。
"
s += f"可用工具:{tools}
"
# 用户查询
s += f"用户:{user_query}
"
s += "助手:"
# 使用函数调用生成
s += sgl.gen(
"response",
max_tokens=200,
tools=tools, # SGLang处理工具调用格式
stop=["用户:", "
"]
)
# 多个查询重用系统提示
state1 = agent_workflow.run(
user_query="纽约的天气怎么样?",
tools=tools
)
# 第一次调用:计算完整系统提示
state2 = agent_workflow.run(
user_query="预订到洛杉矶的航班",
tools=tools
)
# 第二次调用:重用系统提示(5倍更快)
性能基准
RadixAttention加速
少样本提示(提示中有10个示例):
- vLLM: 2.5 秒/请求
- SGLang: 0.25 秒/请求(10倍更快)
- 吞吐量:4倍更高
代理工作流(1000令牌系统提示):
- vLLM: 1.8 秒/请求
- SGLang: 0.35 秒/请求(5倍更快)
JSON解码:
- 标准:45 令牌/秒
- SGLang: 135 令牌/秒(3倍更快)
吞吐量(Llama 3-8B, A100)
| 工作负载 | vLLM | SGLang | 加速比 |
|---|---|---|---|
| 简单生成 | 2500 令牌/秒 | 2800 令牌/秒 | 1.12× |
| 少样本(10示例) | 500 令牌/秒 | 5000 令牌/秒 | 10× |
| 代理(工具调用) | 800 令牌/秒 | 4000 令牌/秒 | 5× |
| JSON输出 | 600 令牌/秒 | 2400 令牌/秒 | 4× |
多轮对话
@sgl.function
def multi_turn_chat(s, history, new_message):
# 系统提示(始终缓存)
s += "您是一个有帮助的AI助手。
"
# 对话历史(随着增长缓存)
for msg in history:
s += f"{msg['role']}: {msg['content']}
"
# 新用户消息(仅新部分)
s += f"用户:{new_message}
"
s += "助手:"
s += sgl.gen("response", max_tokens=200)
# 第一轮
history = []
state = multi_turn_chat.run(history=history, new_message="你好!")
history.append({"role": "用户", "content": "你好!"})
history.append({"role": "助手", "content": state["response"]})
# 第二轮(重用第一轮KV缓存)
state = multi_turn_chat.run(history=history, new_message="2+2等于多少?")
# 仅计算新消息(快得多!)
# 第三轮(重用第一轮 + 第二轮KV缓存)
state = multi_turn_chat.run(history=history, new_message="讲个笑话")
# 随着历史增长,逐渐更快
高级功能
推测解码
# 使用草稿模型启动(2-3倍更快)
python -m sglang.launch_server \
--model-path meta-llama/Meta-Llama-3-70B-Instruct \
--speculative-model meta-llama/Meta-Llama-3-8B-Instruct \
--speculative-num-steps 5
多模态(视觉模型)
@sgl.function
def describe_image(s, image_path):
s += sgl.image(image_path)
s += "详细描述这张图片:"
s += sgl.gen("description", max_tokens=200)
state = describe_image.run(image_path="photo.jpg")
print(state["description"])
批处理和并行请求
# 自动批处理(连续批处理)
states = sgl.run_batch(
[
simple_gen.bind(question="什么是AI?"),
simple_gen.bind(question="什么是ML?"),
simple_gen.bind(question="什么是DL?"),
]
)
# 所有3个在单个批次中处理(高效)
OpenAI兼容API
# 使用OpenAI API启动服务器
python -m sglang.launch_server \
--model-path meta-llama/Meta-Llama-3-8B-Instruct \
--port 30000
# 使用OpenAI客户端
curl http://localhost:30000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "default",
"messages": [
{"role": "system", "content": "您有帮助"},
{"role": "user", "content": "你好"}
],
"temperature": 0.7,
"max_tokens": 100
}'
# 使用OpenAI Python SDK
from openai import OpenAI
client = OpenAI(base_url="http://localhost:30000/v1", api_key="EMPTY")
response = client.chat.completions.create(
model="default",
messages=[{"role": "user", "content": "你好"}]
)
支持的模型
文本模型:
- Llama 2, Llama 3, Llama 3.1, Llama 3.2
- Mistral, Mixtral
- Qwen, Qwen2, QwQ
- DeepSeek-V2, DeepSeek-V3
- Gemma, Phi-3
视觉模型:
- LLaVA, LLaVA-OneVision
- Phi-3-Vision
- Qwen2-VL
来自HuggingFace的100+模型
硬件支持
NVIDIA: A100, H100, L4, T4 (CUDA 11.8+) AMD: MI300, MI250 (ROCm 6.0+) Intel: 带有GPU的Xeon(即将推出) Apple: M1/M2/M3 通过MPS(实验性)
参考文献
- 结构化生成指南 - JSON模式、正则表达式、语法、验证
- RadixAttention深度解析 - 工作原理、优化、基准
- 生产部署 - 多GPU、监控、自动扩展
资源
- GitHub: https://github.com/sgl-project/sglang
- 文档: https://sgl-project.github.io/
- 论文: RadixAttention (arXiv:2312.07104)
- Discord: https://discord.gg/sglang