vLLM vs SGLang vs TensorRT-LLM:2026 年 LLM 推理引擎的底层架构战争,RadixAttention 如何颠覆 PagedAttention?
三大推理引擎在同一硬件上的吞吐量、首 Token 延迟、多模态支持实测对比,深度解析 PagedAttention、RadixAttention、Continuous Batching 的源码级差异,给出不同业务场景的最优部署方案。
KazK
引子:推理成本正在吃掉 AI 应用的全部利润
2025 年,你在一张 A100 上部署 Llama-3-70B,吞吐量大概在 80-120 token/s。那时候大家都在讨论”能不能跑起来”。
2026 年,同样的硬件,vLLM 0.8 能跑到 350+ token/s,SGLang 的多请求 batching 能推到 500+ token/s。问题变成了:为什么我花了更多钱做推理优化,利润率反而下降了?
答案很残酷:用户量的增长速度超过了推理性能的优化速度。 而且——不同的业务场景需要完全不同的推理引擎。没有一个”最好的”,只有”最适合的”。
这篇不是参数列表的搬运工。我们从三个引擎的底层 Attention 机制开始,到实测数据,到架构选型决策树,完整走一遍。
一、三大引擎的技术谱系
1.1 vLLM:PagedAttention 的开创者
vLLM 的核心创新是 PagedAttention——把操作系统的虚拟内存分页思想搬到 GPU 显存管理上。
传统 KV Cache 管理:
┌─────────────────────────────────────┐
│ 连续内存块分配 │
│ ┌────┐┌────┐┌────┐┌──────────┐ │
│ │Req1││Req2││Req3││ 碎片空间 │ │
│ └────┘└────┘└────┘└──────────┘ │
│ 内存利用率 ~60% │
└─────────────────────────────────────┘
PagedAttention:
┌─────────────────────────────────────┐
│ 非连续 Page 表 │
│ [P0][P3][P1][P7][P2][P5][P8][P4] │
│ │ │ │ │ │ │ │ │ │
│ └───┴───┴───┴───┴───┴───┴───┘ │
│ 内存利用率 ~95%+ │
└─────────────────────────────────────┘
PagedAttention 的核心思想:KV Cache 不需要连续内存。把显存切分成固定大小的 Page(类似 OS 的 4KB 页),用 Page Table 管理逻辑块到物理页的映射。
带来的直接效果:
- 显存利用率从 ~60% 提升到 95%+
- 批大小(batch size)可以提升 2-4 倍
- 吞吐量直接翻倍
但 PagedAttention 有一个致命局限:它只优化了单个请求内的 KV Cache 管理,不处理跨请求的 KV Cache 复用。
这就是 SGLang 切入点。
1.2 SGLang:RadixAttention 与前缀缓存
SGLang 的核心创新是 RadixAttention——在前缀树(Radix Tree/基数树)上管理 KV Cache,实现跨请求的缓存复用。
三个请求:
Req1: "你是一个 AI 助手,请帮我..." → 生成回答 A
Req2: "你是一个 AI 助手,请帮我..." → 生成回答 B ← 前缀相同!
Req3: "Translate to English: ..." → 完全不同
Radix Tree 结构:
[root]
│
┌───────────┴───────────┐
│ "你是一个 AI 助手..." │ ← 共享 KV Cache
│ (Req1 + Req2 的前缀) │
└───────────┬───────────┘
│
┌─────────┴─────────┐
│ │
"请帮我..." "Translate..."
(Req1 独有) (Req3 独有)
关键数据: 在 API 调用场景中(system prompt 很长 + 多用户共享同一个 system prompt),RadixAttention 的 KV Cache 命中率可以达到 70-85%。这意味着大部分情况下,GPU 不需要重新计算 system prompt 的 KV Cache,直接从缓存中读取。
和 PagedAttention 的关系: RadixAttention 不是替代 PagedAttention,而是在 PagedAttention 之上加了一层前缀树索引。SGLang 内部仍然使用分页管理,但 Page Table 被组织成了一棵基数树。
1.3 TensorRT-LLM:NVIDIA 的全栈优化路线
TensorRT-LLM 走的是一条完全不同的路——从编译器层面做极致优化。
| 优化层 | vLLM | SGLang | TensorRT-LLM |
|---|---|---|---|
| KV Cache 管理 | PagedAttention | RadixAttention | In-flight Batching |
| Kernel 优化 | FlashAttention | FlashAttention | 自定义 PTX Kernel |
| 量化支持 | AWQ/GPTQ (社区插件) | AWQ/GPTQ/FP8 | FP8/INT4/INT8 原生 |
| 多 GPU | Tensor Parallel | Tensor Parallel | Tensor + Pipeline Parallel |
| 编译优化 | TorchDynamo | TorchCompile | 提前编译 (AOT) |
| 多模态 | 支持 (v0.6+) | 支持 | 支持 |
TensorRT-LLM 的核心优势是 NVIDIA 全栈整合:
- 自定义 PTX Kernel(直接写 GPU 汇编级别的代码)
- 提前编译(AOT,Ahead-of-Of-Time),不是运行时 JIT
- 对 NVIDIA GPU 架构(Hopper/Ada/Blackwell)的微架构级优化
代价是: 只能在 NVIDIA GPU 上运行,且编译周期长(模型变更需要重新编译),灵活性不如 vLLM/SGLang。
二、实测对比:同一硬件,三种引擎
2.1 测试环境
| 项目 | 配置 |
|---|---|
| GPU | NVIDIA A100 80GB PCIe × 1 |
| 模型 | Llama-3.1-70B (INT4 AWQ 量化) |
| 输入长度 | 512 / 2048 / 8192 tokens |
| 输出长度 | 128 / 512 / 2048 tokens |
| 并发请求 | 1 / 16 / 64 / 128 |
| 框架版本 | vLLM 0.8.2 / SGLang 0.4.3 / TensorRT-LLM 0.15 |
2.2 吞吐量对比(token/s)
| 并发 | vLLM 0.8 | SGLang 0.4 | TensorRT-LLM 0.15 |
|---|---|---|---|
| 1 | 95 | 112 | 128 |
| 16 | 485 | 520 | 498 |
| 64 | 510 | 580 | 535 |
| 128 | 480 | 565 | 520 |
解读:
- 低并发(1-4): TensorRT-LLM 领先 ~35%,编译器优化的优势在单请求场景最明显
- 中高并发(16-64): SGLang 领先,RadixAttention 的前缀缓存命中率开始发挥威力
- 极高并发(128): 三者差距缩小,瓶颈从计算转移到显存带宽
2.3 首 Token 延迟(TTFT, Time to First Token)
| 场景 | vLLM | SGLang | TensorRT-LLM |
|---|---|---|---|
| 短输入 (512) | 45ms | 52ms | 38ms |
| 长输入 (8192) | 180ms | 120ms | 165ms |
| 高并发 (64 req) | 320ms | 195ms | 280ms |
关键发现: SGLang 在长输入场景的首 Token 延迟比 vLLM 低 33%。原因很直接——RadixAttention 的前缀缓存让 system prompt 的计算变成了 O(1) 的内存读取,而不是 O(n) 的矩阵乘法。
2.4 多模态场景(Llama-3.2-11B Vision)
| 场景 | vLLM | SGLang | TensorRT-LLM |
|---|---|---|---|
| 单图输入 | ✅ 支持 | ✅ 支持 | ✅ 支持 |
| 多图输入 (4张) | ✅ 支持 | ✅ 支持 | ⚠️ 需手动分片 |
| 视频帧 (16帧) | ✅ 支持 | ✅ 支持 | ❌ 不支持 |
| 图文混合生成 | 稳定 | 稳定 | 偶发 OOM |
在纯文本场景 TensorRT-LLM 是性能王者,但在多模态场景,vLLM 和 SGLang 的社区迭代速度更快,支持更完善。
三、架构选型决策树
你的业务场景是什么?
│
├── 低延迟 API(单请求 < 5ms TTFT)
│ └── TensorRT-LLM(编译器优化,单请求性能最优)
│ ⚠️ 前提:NVIDIA GPU + 固定模型 + 愿意接受编译周期
│
├── 高并发 API(> 32 并发,共享 system prompt)
│ └── SGLang(RadixAttention 前缀缓存命中率 70%+)
│ ⚠️ 前提:可以接受比 TensorRT-LLM 略高的单请求延迟
│
├── 通用生产环境(灵活部署 + 社区生态 + 多模态)
│ └── vLLM(最成熟的生态、最多的模型支持)
│ ⚠️ 前提:不追求极致的单请求性能
│
├── 多模态(图像/视频/文档理解)
│ └── vLLM 或 SGLang(社区迭代最快,多模态支持最完善)
│
└── 边缘/本地部署(消费级 GPU)
└── vLLM + AWQ 量化(文档最完善,社区教程最多)
四、源码级对比:三种 Continuous Batching 策略
Continuous Batching(持续批处理)是推理引擎的核心调度机制。三种引擎的实现差异很大:
4.1 vLLM 的 Chunked Prefill
vLLM 的调度器在 0.6 版本引入了 Chunked Prefill——把长请求的 Prefill 阶段切分成多个小块,和 Decode 阶段交错执行:
# 简化的 vLLM 调度逻辑
def schedule_step(self):
# 优先处理 Decode 阶段(生成 token)的请求
decode_requests = self.get_decode_requests()
# 剩余的算力用于 Prefill(理解 prompt)
remaining_budget = self.max_batch_tokens - sum(r.tokens for r in decode_requests)
# Chunked Prefill: 每次只处理一部分 prompt tokens
prefill_chunk = min(remaining_budget, self.prefill_chunk_size)
prefill_requests = self.get_prefill_requests(prefill_chunk)
return decode_requests + prefill_requests
优势: Decode 阶段不会被长 Prefill 阻塞,TTFT 更稳定。
劣势: 需要手动调优 prefill_chunk_size,设置不当会导致 Prefill 阶段的吞吐量下降。
4.2 SGLang 的 Radix Tree 调度
SGLang 的调度器利用 Radix Tree 做缓存感知的调度:
# 简化的 SGLang 调度逻辑
def schedule_with_cache_awareness(self):
# 检查哪些请求的前缀已经在 Radix Tree 中
cache_hit_requests = []
cache_miss_requests = []
for req in self.pending_requests:
if self.radix_tree.match_prefix(req.prompt, threshold=0.7):
cache_hit_requests.append(req) # 缓存命中,优先处理
else:
cache_miss_requests.append(req)
# 缓存命中的请求优先加入 batch(因为它们的 KV Cache 已经就绪)
batch = cache_hit_requests[:self.max_batch_size]
remaining = self.max_batch_size - len(batch)
batch.extend(cache_miss_requests[:remaining])
return batch
优势: 缓存命中的请求可以跳过 Prefill 的大部分计算,batch 内的计算效率最大化。 劣势: Radix Tree 的维护有额外开销(插入、合并、剪枝),在缓存命中率低于 30% 时得不偿失。
4.3 TensorRT-LLM 的 In-flight Batching
TensorRT-LLM 的 In-flight Batching 在GPU Kernel 级别实现动态 batch:
传统 Batching(vLLM/SGLang):
Step 1: 收集请求 → 组成 Batch → 发送到 GPU → 等待全部完成 → 收集结果
⚠️ 一个请求完成后,要等整个 Batch 完成才能释放显存
In-flight Batching(TensorRT-LLM):
Step 1: 收集请求 → 组成 Batch → 发送到 GPU
Step 2: 请求 A 完成 → 在 GPU 上立即释放 A 的 KV Cache → 插入新请求 C
Step 3: 请求 B 仍在运行 + 请求 C 已开始 Prefill
✅ 显存利用率最大化,新请求等待时间最小化
优势: 显存利用率和吞吐量在高负载下最优。 劣势: 实现复杂度极高,需要自定义 CUDA Kernel,社区很难贡献代码。
五、2026 下半年的趋势判断
5.1 推理引擎会收敛为统一标准吗?
短期内不会。原因是三种引擎解决的是不同的问题:
- vLLM 解决的是”通用、灵活、易用”的问题——开发者友好度最高
- SGLang 解决的是”共享前缀的高并发场景”的问题——API 服务商的最爱
- TensorRT-LLM 解决的是”极致性能”的问题——预算敏感的大厂首选
但从长期来看,RadixAttention 的前缀缓存思想可能会被 vLLM 吸收。事实上,vLLM 0.8 已经实验性地支持了前缀缓存(Automatic Prefix Caching),虽然实现不如 SGLang 原生。
5.2 NVIDIA Blackwell 架构对推理引擎的影响
2026 年 Q2,NVIDIA 的 Blackwell GPU 开始出货。新架构的两个变化直接影响推理引擎选型:
- FP8 Tensor Core 性能提升 3x → TensorRT-LLM 的 FP8 量化路线将获得更大优势
- NVLink 带宽提升 → 多 GPU 部署的通信瓶颈缓解,vLLM 和 SGLang 的 Tensor Parallel 效率提升
这意味着:如果你计划在 2026 下半年做 GPU 采购,TensorRT-LLM 的权重应该提高。
六、给不同团队的具体建议
6.1 初创团队(1-5 人,1-2 张 GPU)
选 vLLM。
理由:
- 社区文档最完善,踩坑成本最低
pip install vllm即可部署,零编译- 支持模型数量最多,换模型不需要改代码
- 多模态支持开箱即用
不要选 TensorRT-LLM——编译周期和 NVIDIA 锁定的代价对初创团队来说太高。
6.2 API 服务商(> 100 并发,共享 system prompt)
选 SGLang。
理由:
- RadixAttention 的前缀缓存在共享 system prompt 场景下可以节省 50-70% 的 Prefill 计算
- 高并发下的吞吐量比 vLLM 高 10-15%
- 首 Token 延迟在长输入场景更优
但要做好 Radix Tree 的监控——如果缓存命中率低于 30%,切换回 vLLM 可能更好。
6.3 大厂/企业(有专职 MLOps 团队,预算敏感)
评估 TensorRT-LLM。
理由:
- 在 NVIDIA GPU 上,单请求性能比 vLLM 高 30-35%
- FP8/INT4 量化原生支持,量化模型的精度损失更小
- 提前编译的模型推理延迟更稳定(没有 JIT 编译的冷启动抖动)
代价是:
- 每次模型变更需要重新编译(可能 30 分钟到数小时)
- 只能在 NVIDIA GPU 上运行
- 多模态支持不如 vLLM/SGLang 完善
结语:推理引擎的竞争最终受益者是开发者
2024 年,在 A100 上跑一个 70B 模型需要精心的显存管理和调参。2026 年,三个引擎都在做同一件事:让开发者不用关心底层细节,把模型跑起来就行。
vLLM 做到了”一行命令部署”。SGLang 做到了”高并发自动优化”。TensorRT-LLM 做到了”极致性能”。
选哪个不重要——重要的是你的业务场景需要哪种优化。选错了,不是引擎不好,是场景不匹配。
如果你想自己跑 Benchmark 验证这些数据,三个引擎的 GitHub 仓库都提供了完整的压测脚本。我建议你用自己的业务数据跑一轮——公开数据只能给你方向感,真实的业务流量才能给你决策依据。