6.4 vLLM 与 TGI 对比:实现差异与工程取舍 同样是基于 PagedAttention 思想的 LLM 推理引擎,vLLM(UC Berkeley)与 TGI(Hugging Face)却走出了不同的工程路线。理解二者的差异,不仅是为了选型,更是为了看清 LLM 推理优化的两种哲学。 6.4.1 两大主流 LLM 推理引擎 LLM 推理引擎是「高效交付层」最活跃的赛道。基于第 6.3 节讲的 PagedAttention 思想(或类似机制),目前主流的引擎有: vLLM:UC Berkeley 出品,PagedAttention 的发明者,开源生态标杆。 TGI(Text Generation Inference):Hugging Face 出品,与 HF 生态深度集成。
同样是基于 PagedAttention 思想的 LLM 推理引擎,vLLM(UC Berkeley)与 TGI(Hugging Face)却走出了不同的工程路线。理解二者的差异,不仅是为了选型,更是为了看清 LLM 推理优化的两种哲学。
LLM 推理引擎是「高效交付层」最活跃的赛道。基于第 6.3 节讲的 PagedAttention 思想(或类似机制),目前主流的引擎有:
其中 vLLM 与 TGI 是社区最广为讨论、最常见的两个开源选择。本节聚焦二者对比。
vLLM 由 UC Berkeley 的 Sky Computing Lab 开源(2023 年),论文《Efficient Memory Management for Large Language Model Serving with PagedAttention》成为 LLM 推理优化的奠基之作。
vLLM 的核心特点:
/v1/chat/completions 端点,与 OpenAI SDK 无缝兼容。# vLLM 启动伪代码(示意) from vllm import LLM llm = LLM(model="meta-llama/Llama-3-8B-Instruct", tensor_parallel_size=1, enable_prefix_caching=True) outputs = llm.generate(["Hello, how are you?"])
TGI(Text Generation Inference) 由 Hugging Face 开发,是 HF 推理云(Inference Endpoints)的底层引擎。
TGI 的核心特点:
# TGI 启动伪代码(Docker 风格示意) docker run ghcr.io/huggingface/text-generation-inference:latest \ --model-id meta-llama/Llama-3-8B-Instruct \ --num-shard 1
虽然都基于 PagedAttention 思想,vLLM 与 TGI 在实现哲学上有显著差异:
| 维度 | vLLM | TGI |
|---|---|---|
| 出身 | UC Berkeley 学术 + 创业 | HuggingFace 商业云 |
| 语言 | Python + CUDA | Rust + Python |
| 架构 | 单进程多 worker | 多进程(Router + Shards) |
| 调度器 | 集中式 scheduler | 分布式 router 分发 |
| PagedAttention | 发明者,原创实现 | 借鉴 vLLM,集成到 FlashAttention |
| 模型支持 | 广(HF Hub 几乎全部) | 广(HF 亲生) |
| OpenAI API | 默认 | 默认 |
| 量化 | AWQ/GPTQ/FP8 | GPTQ/AWQ/EETQ |
| LoRA 多租户 | 支持 | 支持 |
| 社区迭代 | 极快(周级) | 快(周-月级) |
| 生产部署 | KServe/Ray Serve 集成 | HF Inference Endpoints 原生 |
vLLM 用集中式调度器:一个 scheduler 进程统一决定 batch 成员、KV Cache 分配、何时切换 Prefill/Decode。这种设计简单、控制精细,但 scheduler 可能成为瓶颈(单点)。
TGI 用分布式 router + shard:一个 Rust 写的 router 负责网络与负载均衡,把请求分发到多个 shard(每个 GPU 一个 shard)。每个 shard 独立处理分配到的请求,router 协调。这种设计更分布、更易横向扩展,但协调成本高。
💡 判读:调度器架构差异反映了两种扩展哲学。vLLM 的集中式在单节点(几张 GPU)下效率最高、控制最精细;TGI 的分布式在多节点大集群下更易扩展。对于大多数单节点 LLM 部署,vLLM 的集中式调度更直接。
二者都使用了 CUDA Graph(CUDA 图) 来减少 CPU 调度开销。
LLM 推理的每一步都要 launch 多个 CUDA kernel,每个 launch 都有 CPU-GPU 通信开销。Decode 阶段每步只算少量 token,CPU launch 的开销可能占总耗时显著比例。
CUDA Graph 把一组 kernel 调用预录制为「图」,运行时一次性 launch 整个图,大幅减少 CPU 开销。这对 Decode 阶段(kernel 多但每个小)尤其有效。
| 维度 | 无 CUDA Graph | 有 CUDA Graph |
|---|---|---|
| CPU launch 次数 | 多(每 kernel 一次) | 少(整图一次) |
| Decode 阶段加速 | 基线 | 显著(10%-30%) |
| 灵活性 | 高(动态形状) | 中(需固定形状) |
vLLM 与 TGI 都针对 Decode 阶段启用了 CUDA Graph,是二者性能接近的原因之一。
vLLM 与 TGI 的性能对比,社区有大量 benchmark,但结论因模型、硬件、负载而异。一些公认的经验:
| 场景 | 表现 |
|---|---|
| 单节点、单 GPU、LLaMA 系列 | vLLM 通常略快(PagedAttention 原生优化更深) |
| 多节点、大规模集群 | TGI 分布式 router 可能更易扩展 |
| Prefix Caching 重度场景(RAG) | vLLM 默认开启,表现更好 |
| 新模型首发支持 | TGI 因 HF 亲生,有时更快 |
| 量化推理(GPTQ/AWQ) | 二者接近 |
| 极致 NVIDIA 优化 | TensorRT-LLM 才是王者 |
⚠️ 现实提醒:LLM 推理引擎的性能 benchmark 是「最容易做手脚的地方」——不同的 batch 策略、输入长度分布、预热方式、测量口径,都能让结果差几倍。看 benchmark 一定要看具体设置,不要轻信「A 比 B 快 X 倍」的笼统结论。建议在自己的实际负载上做对比。
生产选型不能只看吞吐数字,还要考虑多个工程维度:
给一个选型决策树:
💡 选型经验:
- 不确定时选 vLLM——社区最大、迭代最快、特性最全、文档最完善,是当前最稳的默认选择。
- 重度 HF 生态(频繁用 Hub 模型、PEFT 微调、HF 推理云)→ TGI。
- NVIDIA H100/H200 追求极致→ TensorRT-LLM(NVIDIA 硬件原生优化)。
- 结构化生成、复杂 prompt 流程→ SGLang(RadixAttention 与结构化输出)。
最后强调,vLLM/TGI 只是「推理引擎」,要构建完整的「推理平台」还要叠加(回顾 6.1 节):
| 层 | 组件 | 作用 |
|---|---|---|
| 网关 | API Gateway、Istio、Envoy | 流量入口、鉴权、限流 |
| 服务框架 | KServe、Ray Serve | 服务治理、扩缩、流量切分 |
| 推理引擎 | vLLM、TGI、TRT-LLM | 模型加载、批处理、显存优化 |
| 模型仓库 | HF Hub、模型注册中心 | 模型版本管理 |
| 监控 | Prometheus、Grafana | 指标采集与可视化 |
| 扩缩容 | KEDA、HPA | 自动伸缩 |
一个典型的生产 LLM 推理平台是「KServe(服务框架)+ vLLM(推理引擎)+ KEDA(扩缩容)+ Prometheus(监控)」的组合。vLLM 只占其中一层,但它是最核心的「推理性能决定层」。
到这里,第 6 章完成了「高效交付层」的基础:
这四块构成了 LLM 推理优化的「基础包」。第 7 章将在此基础上讲更高级的优化:Chunked Prefill、量化、Speculative Decoding、PD 分离——把推理性能推向新的高度。
第 6 章完结。下一章《第 7 章 高性能推理服务(二):批处理、量化与 Speculative Decoding》将讲清更高级的推理优化。