迪图
发布于 2026-10-20 / 15 阅读
0
0

vLLM vs SGLang vs TGI:推理引擎选型完全指南

vLLM vs SGLang vs TGI:推理引擎选型完全指南

大模型推理的吞吐差距,往往不在模型本身,而在 KV cache 怎么管。这篇讲清三种引擎的底层差异。

开篇:连续批处理只是入场券

vLLM、SGLang、TGI 都能提供 OpenAI 兼容接口,都能跑 GPU,都能做连续批处理(continuous batching)——动态把在途请求打包进 GPU 填充算力空位。

在这个维度上三者打成平手。

真正的分水岭只有一个:KV cache 策略。

KV cache 是每个请求的注意力键值缓存,它占据了推理期间 GPU 显存的大头,也直接决定了你同时能服务多少请求。

硬指标对比

维度

vLLM

TGI

SGLang

出身

UC Berkeley Sky Lab

Hugging Face Research

LMSYS Sky Lab

签名技术

PagedAttention

生产级封装服务

RadixAttention

KV cache

分页,低碎片

标准,调优良好

基数树跨请求共享

默认端口

8000

12434

30000

结构化输出

xgrammar / guidance

支持

一等公民

并行方式

张量/流水线/数据/专家/上下文

同类

同类

许可

Apache 2.0

Apache 2.0

Apache 2.0

三者都是 Apache 2.0,都支持 AWQ / GPTQ / FP8 量化。

一、PagedAttention(vLLM 的方案)

PagedAttention 借鉴了操作系统的虚拟内存分页思想。

传统做法是为每个请求分配一块连续显存存 KV cache。问题在于:序列长度不一、请求陆续结束,会产生严重的外部碎片。你申请 1GB 连续空间,实际可能只用 40%。

vLLM 的做法是把 KV cache 切成固定大小的页块,物理显存无需连续,通过 block table 完成虚拟地址到物理显存的映射。

请求 A: [页3][页7][页2][页9]   ← 物理上分散,逻辑上连续
请求 B: [页3][页5]            ← 共享页3?取决于实现

收益:碎片率极低,可用的 KV 显存更多 → 有效 batch 更大 → 吞吐更高。这就是 vLLM 成为默认选择的原因。

它引自 2023 年的论文《Efficient Memory Management for Large Language Model Serving with PagedAttention》(Kwon et al.),该论文称相比当时 SOTA 系统吞吐可达 6.4 倍。

二、RadixAttention(SGLang 的方案)

RadixAttention 解决的是另一种浪费:重复计算。

设想一个真实场景:1000 个请求共用同一个 5000 token 的系统提示词和 few-shot 示例。

  • 传统做法:每个请求独立 prefill 这 5000 token,重复计算 1000 次

  • SGLang:把这些 KV cache 组织成一棵基数树,新请求到达时匹配最长公共前缀,只计算剩余部分

前缀只算一次,之后所有请求复用。

这在以下场景收益巨大:

  • Agent 循环(每轮都带着完整历史)

  • 多轮对话(每轮都是上一轮的前缀)

  • few-shot(示例部分永远不变)

  • RAG(检索出的固定前言)

  • RL rollout 采样(同一 prompt 多次采样)

论文来自 LMSYS 2024 年 1 月 17 日的博文,称在 agent 控制、逻辑推理、few-shot、JSON 解码、RAG、多轮对话等场景有显著优势。

三、两种思路的本质区别

这是理解两者最关键的一点:

PagedAttention

RadixAttention

消除的浪费

碎片浪费(内存排布松散)

重复浪费(前缀被反复计算)

手段

分页,紧凑打包

基数树,共享前缀

收益条件

几乎所有工作负载都有收益

仅当请求间有公共前缀

一个是 packing,一个是 sharing。 这就是为什么"哪个更快"这个问题必须先描述你的流量特征。

四、按流量特征选型

你的流量特征

选谁

原因

共享长 system prompt(数千请求)

SGLang

基数树自动复用,零配置

多轮对话,每轮重发历史

SGLang

每轮都是上一轮的前缀命中

Agent 循环、树搜索

SGLang

分支共享祖先,正是基数树强项

RL rollout / RLHF 权重同步

SGLang

内置 Miles、slime、verl 集成

批量任务,每个 prompt 都唯一

vLLM

没前缀可复用,杠杆在显存

显存受限(batch size 被卡住)

vLLM

分页正是为消除显存浪费而生

TPU / Trainium / Gaudi / CPU

vLLM

SGLang 不支持这些后端

编码器-解码器模型(T5、BART)

vLLM

不在 SGLang 支持矩阵内

需要多 LoRA 服务

vLLM

对 dense 和 MoE 层都支持

需要 Anthropic Messages API 兼容

vLLM

原生支持

注意一个重要变化:vLLM 现在也内置了自动前缀缓存(automatic prefix caching),两者差距在缩小。而且两者都支持 prefill/decode 分离部署。

五、TGI 的定位不同

TGI 的目标不是刷吞吐排行榜,而是做一个生产级服务器:

  • 与 Hugging Face Hub 深度集成

  • 模型加载与配置体验成熟

  • 生态完整,运维工具齐全

如果你已经在 HF 生态里,TGI 是稳妥选择。这是一个不同的优化目标——它优化的是"可靠性和集成体验",而不是合成 benchmark 上的峰值。

六、按路由而非按引擎做决策

实务中最常见的情况是流量混合。此时按引擎分流的收益高于选一个引擎吃全部。

请求进入
   │
   ├─ 含长公共前缀? ──是──► SGLang 实例池
   │
   └─ 唯一 prompt / 特殊硬件? ──► vLLM 实例池

两个引擎可以部署在同一套网关后面,网关按请求特征路由。这样既吃到基数树的复用收益,又保留 vLLM 的硬件覆盖广度。

七、容易被误解的性能问题

问题一:为什么我看到别人的 benchmark 比我的快好几倍?

因为 benchmark 几乎总是只测一种工作负载。SGLang 的论文数字来自前缀密集场景,vLLM 的数字来自通用混合流量。用单一场景的数字外推到你的场景是无效的。

问题二:流式输出能降成本吗?

不能。流式改变的是响应送达方式,不改变模型生成多少 token。两者的计费完全一样。流式用来改善感知延迟,降本要靠限制输出长度。

问题三:编码器-解码器模型怎么办?

用 vLLM。SGLang 的支持矩阵里没有 T5 / BART 这类架构。

问题四:换引擎要重写多少代码?

几乎不用。两者都提供 OpenAI 兼容接口。切换主要是改启动参数。

八、启动命令参考

# vLLM
pip install vllm
vllm serve meta-llama/Llama-3.1-8B --port 8000

# SGLang
pip install --prerelease=allow sglang
python -m sglang.launch_server --model-path meta-llama/Llama-3.1-8B --port 30000

# TGI
docker run --gpus all -p 12434:80 \
  -v $PWD/data:/data \
  ghcr.io/huggingface/text-generation-inference:latest \
  --model-id meta-llama/Llama-3.1-8B

vLLM 和 SGLang 都支持多 LoRA、投机解码、结构化输出。两者都不直接加载 GGUF——那是 llama.cpp 的地盘,且从 GGUF 转回 safetensors 会丢元数据并降低质量。

九、上生产前的检查项

项

vLLM

SGLang

TGI

Docker 镜像

官方

官方

官方

Helm chart

官方

社区维护

社区

健康探针

官方

社区

官方

Prometheus 指标

有

社区

有

版本发布节奏

双周点版本

相对少

跟随 HF

版本上要做的事:两者都存在升级引入回归的风险,生产环境请锁定容器 digest,不要用 latest。

十、一句话结论

  • 默认选 vLLM —— 覆盖面最广、社区最大、默认最稳

  • 前缀复用是主要杠杆时换 SGLang —— Agent、多轮、few-shot 场景

  • HF 生态决定性时用 TGI —— 生产成熟度和集成体验

  • 流量混合就分流 —— 两个引擎并存,网关路由

参考资料

  • vLLM 官方仓库 — https://github.com/vllm-project/vllm

  • SGLang 官方仓库 — https://github.com/sgl-project/sglang

  • TGI 官方文档 — https://huggingface.co/docs/text-generation-inference

  • Kwon et al., *Efficient Memory Management for LLM Serving with PagedAttention* — https://arxiv.org/abs/2309.06180

  • LMSYS, *SGLang: Efficient Execution of Structured Language Model Programs* — https://arxiv.org/abs/2312.07104

  • LMSYS Blog, *RadixAttention* 介绍 — https://lmsys.org/blog/2024-01-17-sglang/


评论