推理引擎:LLM服务的核心基础设施
模型只是"大脑",推理引擎是"神经系统"——它决定了模型服务能多快、能并发多少请求、成本多低。选对推理引擎,单GPU的吞吐量差异可达5-10倍。
三大主流引擎
vLLM:社区标准
架构特点:
- PagedAttention:操作系统级KV Cache管理
- Continuous Batching:迭代级动态批处理
- 纯Python实现(核心算子用CUDA/Triton)
- 支持大多数主流开源模型
核心技术:PagedAttention
传统KV Cache:
请求A: [已分配 5/5 blocks] [等待分配...]
请求B: [已分配 3/3 blocks]
→ 内存碎片化,浪费30-60%
PagedAttention:
Block Pool: [A1][B1][A2][C1][B2][A3]...
每个请求通过页表映射到物理block
→ 零碎片,内存利用率接近100%
性能特征:
- 吞吐量:比HuggingFace Transformers高24倍
- 首token延迟:中等
- 显存利用率:90%+
- 支持多模型共享GPU
优势:
- 社区支持最广,几乎所有模型首发支持
- 部署简单(一行命令启动)
- 持续迭代,功能快速扩展
劣势:
- 纯Python实现,某些热路径不如C++优化
- 不支持一些极致优化(如FP8推理)
- 调度策略相对简单
SGLang:结构化生成之王
架构特点:
- 前缀缓存(Prefix Caching):跨请求共享计算
- 程序化生成:支持结构化输出约束
- 原生支持JSON/正则约束
- C++核心,Python接口
核心技术:RadixAttention
请求1: "system: 你是助手\nuser: 天气"
→ 缓存KV Cache
请求2: "system: 你是助手\nuser: 股票"
→ 复用"system: 你是助手\n"的前缀KV Cache
→ 只需计算新的部分
多请求共享相同system prompt时,前缀缓存可节省50%+计算。
结构化输出:
# 约束输出为JSON
@function
def analyze(text):
summary = gen("Summary: ", max_tokens=100)
sentiment = select(["positive", "negative", "neutral"])
return {"summary": summary, "sentiment": sentiment}
result = engine.generate("analyze(" + text + ")", analyze)
# 输出保证是合法JSON
优势:
- 结构化输出性能最好
- 前缀缓存大幅减少重复计算
- 延迟低,特别是短输出场景
劣势:
- 生态不如vLLM丰富
- 模型适配速度较慢
- 文档不够完善
TensorRT-LLM:极致性能
架构特点:
- 基于NVIDIA TensorRT
- C++实现,极致GPU优化
- 专为NVIDIA GPU优化
- 需要预编译引擎(build process)
核心技术:
- In-flight Batching:更激进的连续批处理
- 自定义CUDA Kernel:针对每种模型架构手工优化
- FP8推理:支持H100的FP8 Tensor Core
- Multi-Instance GPU:支持MIG分区
性能特征:
- 吞吐量:通常比vLLM高30-50%
- 延迟:最低
- 显存效率:最高
- 但编译复杂,灵活性低
优势:
- 性能最强
- 支持FP8等新特性
- NVIDIA官方维护
劣势:
- 只支持NVIDIA GPU
- 编译过程复杂(需要针对每个模型+硬件编译)
- 闭源,难以调试
- 新模型适配慢
性能对比
测试条件
- 硬件:A100 80GB
- 模型:Llama-3-70B(INT4量化)
- 负载:1000个并发请求,平均输入500/输出200 tokens
吞吐量
| 引擎 | 总吞吐(tok/s) | 峰值QPS | 平均延迟 |
|---|---|---|---|
| vLLM | 2,800 | 14 | 15s |
| SGLang | 3,200 | 16 | 12s |
| TensorRT-LLM | 4,100 | 20 | 10s |
延迟分布
| 引擎 | P50 | P95 | P99 |
|---|---|---|---|
| vLLM | 12s | 22s | 35s |
| SGLang | 10s | 18s | 28s |
| TensorRT-LLM | 8s | 15s | 22s |
特殊场景
长上下文(32K):
- vLLM:吞吐下降明显(KV Cache大)
- SGLang:前缀缓存帮助大
- TensorRT-LLM:最佳
结构化输出(JSON):
- vLLM:需要后处理验证
- SGLang:原生支持,性能最好
- TensorRT-LLM:支持但不如SGLang
多模型混部:
- vLLM:支持最好
- SGLang:有限支持
- TensorRT-LLM:每模型需独立编译
功能对比
| 功能 | vLLM | SGLang | TensorRT-LLM |
|---|---|---|---|
| PagedAttention | ✅ | ✅ | ✅(不同实现) |
| 前缀缓存 | ✅ | ✅✅(最优) | ✅ |
| 连续批处理 | ✅ | ✅ | ✅✅(最优) |
| 量化推理 | INT8/INT4 | INT8/INT4 | INT8/INT4/FP8 |
| 结构化输出 | 有限 | ✅✅(最优) | ✅ |
| 多GPU并行 | TP | TP | TP/PP |
| 多模型共享 | ✅ | 有限 | ✅ |
| 流式输出 | ✅ | ✅ | ✅ |
| OpenAI API兼容 | ✅ | ✅ | ✅ |
选型指南
按需求选型
快速上线 + 社区支持 → vLLM
结构化输出 + 低延迟 → SGLang
极致性能 + NVIDIA → TensorRT-LLM
多模型混部 → vLLM
FP8推理 → TensorRT-LLM
非NVIDIA GPU → vLLM (支持AMD)
按团队选型
小团队/初创 → vLLM (简单易用)
中大型企业 → SGLang (平衡性能和易用性)
大规模生产 → TensorRT-LLM (需要专业团队维护)
按场景选型
| 场景 | 推荐 | 理由 |
|---|---|---|
| 通用API服务 | vLLM | 生态好,适配快 |
| Agent应用 | SGLang | 结构化输出+低延迟 |
| 超大规模推理 | TensorRT-LLM | 性能最优 |
| 边缘部署 | llama.cpp | 轻量级 |
| 多模型路由 | vLLM | 多模型共享 |
部署建议
vLLM部署
# 一行启动
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Llama-3-70B \
--quantization awq \
--tensor-parallel-size 4 \
--port 8000
SGLang部署
# 启动服务
python -m sglang.launch_server \
--model-path meta-llama/Llama-3-70B \
--port 30000
TensorRT-LLM部署
# 1. 编译引擎
trtllm-build --model_dir llama-3-70b \
--output_dir ./engine \
--dtype float16
# 2. 启动服务
python -m tensorrt_llm.run --engine_dir ./engine
总结
三大推理引擎各有定位:vLLM胜在生态和易用性,SGLang胜在结构化输出和前缀缓存,TensorRT-LLM胜在极致性能。2026年的趋势是三者互相学习——vLLM增加了前缀缓存,SGLang增加了模型支持范围,TensorRT-LLM简化了编译流程。对于新项目,推荐从vLLM起步,根据性能需求再考虑迁移到SGLang或TensorRT-LLM。