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)

性能提升

场景HuggingFacevLLMSGLang
单轮问答35 tok/s120 tok/s125 tok/s
多轮对话 (5轮)28 tok/s85 tok/s150 tok/s
复杂推理链20 tok/s60 tok/s120 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 为多轮对话场景带来了革命性的提升:

  1. 前缀复用:避免重复计算 System Prompt
  2. 智能缓存:LRU 淘汰 + Radix Tree 合并
  3. 结构化输出:原生支持 JSON Schema

如果你正在构建多轮对话系统,SGLang 绝对是首选!


下期预告:TensorRT-LLM 如何做到极致性能?