跳转到内容

服务框架对比:vLLM、SGLang、TensorRT-LLM 等

前面几章的技术(PagedAttention、连续批处理、投机解码、量化)都要有载体。推理服务框架就是把它们打包的软件层。本章横向对比主流框架、给出选型维度与基准测试方法——框架选型的正确姿势不是看榜单,是拿自己的模型和流量做基准。

框架定位核心优势典型用户
vLLM通用开源王者PagedAttention 发源地、生态最大、模型覆盖最广默认起点
SGLang高吞吐新锐RadixAttention(前缀树 KV 共享)、结构化输出快Agent/多轮对话
TensorRT-LLMNVIDIA 官方深度硬件优化、极致延迟延迟敏感的生产服务
llama.cpp / Ollama端侧/轻量CPU/Mac 可跑、零依赖本地部署、个人
DeepSpeed-FastGen / MII微软系与 DS 生态配套已用 DS 的团队
Mooncake / DistServe分离架构P/D 分离、KV 传输优化超大规模服务

一、模型覆盖:你的模型(架构、变长、多模态)被支持吗?vLLM 覆盖最广;TensorRT-LLM 要为每个模型编译 engine(新模型支持滞后)。

二、量化支持:AWQ/GPTQ/FP8 checkpoint 直接加载吗?(见量化)vLLM/SGLang 都支持主流格式。

三、高级特性:

特性vLLMSGLangTRT-LLM
前缀共享automatic prefix cachingRadixAttention(更彻底)有
投机解码支持支持支持
P/D 分离扩展支持支持支持
结构化输出(JSON 等)一般快(编译级)一般
CUDA Graph有有最彻底

四、生态与运维:文档、社区答案、监控集成、版本节奏。vLLM 的社区最大,问题最容易被搜到;TRT-LLM 有 NVIDIA 商业支持。

五、性能:同一模型同一流量下实测——这是唯一可信的维度(榜单与宣传都不可信,见下)。

框架对比的错误姿势是"跑一个 benchmark 贴榜单"。正确姿势:

一、用自己的模型与流量:模型架构、序列长度分布、请求模式(并发、到达率)都要贴近真实。长度方差是吞吐的最大变量——评测集的长度分布错了,结论全错。

二、测三个指标,不只测吞吐(见连续批处理):

  • TTFT(P50/P99):用户体验的第一指标
  • TPOT(P50/P99,看分布不只看均值):decode 质量
  • 吞吐(tokens/s,在 SLO 约束下):**"TTFT P99 < 2s 且 TPOT P99 < 100ms 时的最大吞吐"**才是有意义的数字

三、扫到极限:单点数字无意义,画"吞吐-延迟曲线"(增加并发直到 SLO 破线),曲线的位置才代表框架的真实水平。

四、控制变量:同硬件、同精度、同 KV 配置(gpu_memory_utilization 对齐)、同投机解码配置——每个开关都影响巨大。

五、稳态测量:预热(KV 池填满、CUDA Graph 编译完)后再测;测 10 分钟以上——冷启动数字全是噪声。

坑说明
max_model_len 虚设预留按最大长度算,KV 池被虚高需求挤压(见 KV)
gpu_memory_utilization 太高显存打满 → OOM 随机出现;留 10–15%
忽略预热首批请求编译/分配,延迟全是假的
TP 配置与硬件不符TP 跨 NVLink 域(见节点内互连)
拿单点吞吐对比框架曲线位置才可信
版本漂移vLLM/SGLang 迭代极快,每季度的性能差异巨大,基准要跟着重跑
场景推荐形态
默认起点vLLM(生态最大,踩坑最少)
Agent/多轮对话/结构化输出重SGLang(RadixAttention + 结构化输出)
延迟极致、NVIDIA 全家桶TensorRT-LLM
个人/本地Ollama / llama.cpp
超大规模、SLO 严格P/D 分离方案(Mooncake/DistServe)+ 按需选框架
深度自定义vLLM/SGLang 源码级定制(都是 Apache/MIT)
  • 选型五维度:模型覆盖、量化支持、高级特性、生态运维、实测性能——最后一维唯一可信。
  • 基准的正确姿势:自己的模型与流量、三指标(TTFT/TPOT/吞吐)、吞吐-延迟曲线、控制变量、稳态测量。
  • "SLO 约束下的最大吞吐"是唯一有意义的单点数字;榜单不可信。
  • vLLM 是默认起点,SGLang 赢在 RadixAttention 与结构化输出,TRT-LLM 赢在延迟与 CUDA Graph。
  • 框架迭代极快,基准要按季度重跑;max_model_len/显存配置是常见的坑。