推理引擎格局:vLLM、SGLang、TensorRT-LLM 与 llama.cpp
一句话定义
推理引擎把前几模块的技术(分页 KV、连续批处理、量化 kernel、投机解码)打包成可部署的系统,主要流派按"生态易用 vs 极致性能"与"服务端 vs 端侧"分成 vLLM/SGLang、TensorRT-LLM、llama.cpp 三大阵营。
为什么重要
选引擎是部署的第一决策:它决定了你能用的量化格式、调度行为、可调参数乃至排错工具链。多数团队的正确路径是"vLLM/SGLang 起步、瓶颈明确后局部换专用方案、端侧另走 llama.cpp/MLC",而不是一开始就赌某一家。
前置知识
- kp-001(两条优化主线与部署形态划分)。
核心概念与流派
- SGLang:以 RadixAttention(前缀树式 KV 复用)为特色,多轮对话/结构化输出场景强,路由器组件提供前缀感知负载均衡(衔接 kp-023)。
- TensorRT-LLM:NVIDIA 官方,编译期把模型编成极致 kernel(in-flight batching、FP8),单卡性能上限高;代价是构建链重、新模型支持滞后、绑定 NVIDIA。
- llama.cpp:C++ 实现的 CPU/混合推理代表,GGUF 格式(kp-026),macOS/端侧/离线场景事实标准。
- 其他值得知道的名字:TGI(Hugging Face)、LMDeploy、MLC-LLM(WebGPU/端侧编译)、Orca(学术奠基,迭代级调度出处)。
历史脉络与流派
服务端引擎的两大流派:"Python 灵活派"(vLLM/SGLang,快速支持新模型、社区驱动)与 "编译极致派"(TensorRT-LLM,手工 kernel + 编译图,性能上限高但灵活度低)。端侧则是"零依赖 C++ 派"(llama.cpp、MLC)。三派共享同一批底层论文思想——分页、批处理、量化——只是工程取舍不同。
原理与机制
引擎之间的差异在原理层只有三个变量:显存管理策略(分页 vs 预留)、调度粒度(迭代级 vs 请求级)、kernel 来源(手写/编译生成 vs 通用库)。所谓流派之争,就是这三个变量的取舍组合:Python 灵活派用通用 kernel 换取新模型的覆盖速度,编译极致派用构建时间换单卡性能上限,端侧 C++ 派则为带宽受限设备重新手写全部关键路径。
图示
服务端 端侧
易用 ┌ vLLM ──── SGLang ┐ ┌ llama.cpp ┐
│ (PagedAttention) │ (RadixAttn)│ (GGUF) │
极致 └ TensorRT-LLM ────┘ └ MLC-LLM ──┘
(编译期 kernel, NVIDIA 专属)
实例或案例
同一 7B W4A16 模型的选型推演:自建 API 服务、模型更新频繁 → vLLM;多轮对话为主且前缀高度重复 → SGLang 前缀复用加成;追求单卡极限吞吐且模型固定、全 NVIDIA → TensorRT-LLM 编译;要跑进客户内网无 GPU 机器 → llama.cpp。四个答案对应四种真实团队。
常见误区
- "公开 benchmark 数字可以直接搬":数字对版本、kernel、量化格式、batch 策略极敏感,必须用自己的负载画像(kp-002 口径)复测。
- "一个引擎通吃所有模型":新模型的支持排队与算子兼容是常态,上线前验证目标模型在该引擎的成熟度。
- "引擎差异数倍":成熟引擎在同配置下吞吐差距常见 10–40%,真正数倍差距多来自配置与部署形态(批处理、量化、投机)而非引擎本身。
自测题
- vLLM 与 SGLang 的标志性技术分别是什么?
要点:PagedAttention 分页 KV;RadixAttention 前缀树 KV 复用。
- TensorRT-LLM 的取舍是什么?
要点:编译期极致性能 vs 构建链重、模型支持滞后、绑定 NVIDIA。
- 为什么不能直接引用公开跑分做容量规划?
要点:跑分对版本/配置/负载敏感;容量数字必须来自自有负载的压测。
与其他知识点的关系
本页是 kp-014/kp-021 等机制的系统级载体;kp-022 展开 vLLM 参数;kp-025/kp-026 是端侧两兄弟的展开;kp-029 决策树的"服务端分支"以本页为起点。
延伸阅读
PagedAttention 与 SGLang 两篇论文分别代表两大服务端引擎的核心思想,合读可覆盖服务端引擎的主要设计空间。