SGLang RadixAttention:多轮对话的显存杀手锏
AI InfraSGLangRadixAttention多轮对话
如果说 vLLM 的 PagedAttention 是显存优化的基础,那么 SGLang 的 RadixAttention 则是多轮对话场景的终极加速器。
多轮对话的计算浪费
想象一个典型的对话场景:
System: 你是一个有帮助的助手
User: 什么是机器学习?
AI: 机器学习是...
User: 那深度学习呢?
AI: 深度学习是...
问题: 每次对话都在重复计算 System Prompt 的 KV Cache!
传统方案:
- 每次请求都重新计算整个 prompt
- 即使前缀完全相同也无法共享
- 显存中堆积大量重复的 KV 数据
RadixAttention 核心思想
SGLang 提出了 RadixAttention,核心思路:
“缓存是门艺术,按需使用是智慧”
工作原理
┌─────────────────────────────────────┐
│ Radix Tree │
│ │
│ [System Prompt] │
│ / \ │
│ [User Q1] [User Q2] │
│ / \ / \ │
│ [AI A1] [AI A2] [AI A3] ... │
└─────────────────────────────────────┘
特点:
- System Prompt 作为根节点,全局共享
- 相同前缀自动合并
- LRU 淘汰策略
核心实现
# SGLang RadixAttention 伪代码
class RadixAttention:
def __init__(self):
self.radix_tree = RadixTree()
self.max_cache_size = "32GB"
def forward(self, seq_ids, prefix_ids=None):
# 1. 查找缓存
cached_kv = self.radix_tree.get(prefix_ids)
if cached_kv is not None:
# 命中缓存,只计算新增部分
new_kv = self.compute_new_tokens(seq_ids)
return self.concat(cached_kv, new_kv)
else:
# 未命中,全量计算
return self.compute_all(seq_ids)
def cache(self, seq_ids, kv_cache):
# LRU 淘汰策略
if self.radix_tree.size > self.max_cache_size:
self.radix_tree.evict_lru()
self.radix_tree.put(seq_ids, kv_cache)
性能提升
| 场景 | HuggingFace | vLLM | SGLang |
|---|---|---|---|
| 单轮问答 | 35 tok/s | 120 tok/s | 125 tok/s |
| 多轮对话 (5轮) | 28 tok/s | 85 tok/s | 150 tok/s |
| 复杂推理链 | 20 tok/s | 60 tok/s | 120 tok/s |
SGLang 在多轮场景下吞吐量是 vLLM 的 2 倍!
结构化输出
SGLang 另一大亮点是原生支持结构化输出:
from sglang import sgl_gen
import json
@sgl_gen
def extract_info(text: str):
sgl"""
从以下文本中提取信息,以JSON格式输出:
${text}
请确保输出有效的JSON格式。
"""
"""{"name": "", "age": 0, "city": ""}"""
相比传统方案:
- 传统:Prompt 工程 + 输出解析,成功率 <60%
- SGLang:结构化约束,成功率 >95%
与 vLLM 的结合
SGLang 可以结合 vLLM 使用,强强联手:
# 使用 SGLang + vLLM 后端
from sglang import sgl
from vllm import LLM
# 启动 SGLang 服务(使用 vLLM 引擎)
# sgl-serve --engine vllm --model meta-llama/Llama-2-7b
效果:
- PagedAttention 管理显存
- RadixAttention 优化前缀缓存
- 性能提升 3-5 倍
适用场景
✅ 强烈推荐 SGLang:
- 聊天机器人
- 客服系统
- 多轮对话场景
- 需要 JSON/函数调用的场景
❌ 可能不需要:
- 纯单轮任务
- 对延迟极敏感的生产环境(考虑 TensorRT-LLM)
总结
SGLang 的 RadixAttention 为多轮对话场景带来了革命性的提升:
- 前缀复用:避免重复计算 System Prompt
- 智能缓存:LRU 淘汰 + Radix Tree 合并
- 结构化输出:原生支持 JSON Schema
如果你正在构建多轮对话系统,SGLang 绝对是首选!
下期预告:TensorRT-LLM 如何做到极致性能?