LLM 推理引擎选型¶
推理引擎负责加载模型、管理 GPU 内存、组织 Batch、执行 Kernel 并输出 Token;KServe、Kubernetes 和 Gateway 负责的是服务生命周期、资源与流量。选择引擎前必须先分清这些边界。
如果还处在模型、Prompt、RAG 或 API 联调阶段,可先从本地运行与测试大模型开始,再用本页选择生产候选引擎。
1. 推理平台分层¶
API Client
OpenAI / KServe V2 / gRPC
│
Gateway 与请求调度
Auth、Quota、Rate Limit、InferencePool、KV-aware Routing
│
服务控制面
Deployment、KServe、Ray Serve、LWS、llm-d、Dynamo
│
推理引擎
vLLM、SGLang、TensorRT-LLM、Triton、llama.cpp
│
模型与硬件
safetensors/GGUF/Engine、GPU/TPU/ASIC、KV Cache、网络
KServe 和 vLLM 通常是组合关系;llm-d/Dynamo 也可能在多个引擎之上提供分布式运行、路由和 KV 传输。
2. 先定义需求¶
至少明确:
- 文本、Embedding、Reranker、语音、视觉还是多模态;
- 模型、参数量、Dense/MoE 和 Context 上限;
- 目标硬件、单机还是多机;
- 精度和量化约束;
- 在线、批量或混合流量;
- TTFT、TPOT、吞吐和可用性 SLO;
- LoRA、结构化输出、Tool Calling、投机解码需求;
- Prefix Cache、KV Offload、P/D 分离需求;
- OpenAI API、KServe V2、gRPC 等协议;
- 许可证、支持和升级策略。
没有负载画像时,“哪个引擎最快”没有可操作答案。
3. 主要引擎对比¶
| 引擎 | 核心定位 | 优势 | 主要代价 |
|---|---|---|---|
| vLLM | 通用高吞吐 LLM 服务 | 活跃生态、OpenAI API、Paged KV、广泛模型/硬件、控制面集成多 | 功能演进快,版本和模型组合需锁定 |
| SGLang | LLM/多模态与复杂推理程序 | Radix/Prefix Cache、结构化生成、复杂共享前缀、活跃性能优化 | 生产参数和版本变化快,需要独立基准 |
| TensorRT-LLM | NVIDIA 极致优化 | NVIDIA Kernel、量化、并行和投机解码深度优化 | 构建/兼容复杂,硬件和软件绑定更强 |
| Triton | 多框架统一推理服务器 | Model Repository、动态/序列 Batch、多 Backend、统一协议和指标 | 不是所有 LLM 高级能力的最短路径 |
| llama.cpp | 轻量本地与边缘推理 | GGUF、CPU/多后端、部署简单、资源要求低 | 大规模数据中心服务和控制面能力有限 |
| TGI | Hugging Face 模型服务 | Hub 集成、OpenAI 兼容、部署直接 | 与新引擎能力重叠,选型前确认活跃功能与硬件支持 |
| 自定义 PyTorch/JAX | 特殊模型或研究能力 | 控制完全 | 自己承担 Batch、内存、协议、指标和故障处理 |
表格只表达定位。模型覆盖和硬件矩阵变化很快,最终以目标版本官方文档和基准为准。
4. vLLM¶
适合:
- 通用 Chat/Completion/Embedding 服务;
- 需要 OpenAI-Compatible API;
- 希望接入 KServe、Ray、llm-d 或常见 Gateway;
- 需要连续批处理、Prefix Cache、LoRA、量化和多种并行;
- 使用 NVIDIA、AMD、TPU、CPU 等受支持后端。
需要验证:
- 目标模型架构与 Attention Backend;
max-model-len和 KV Cache 容量;- Tensor/Pipeline/Data/Expert Parallel 组合;
- 量化格式在目标硬件上的 Kernel;
- Chunked Prefill、Prefix Cache 和投机解码交互;
- 多模态、结构化输出和 LoRA 限制;
- 引擎指标和升级兼容。
单机概念示例:
vllm serve /models/example \
--served-model-name example \
--tensor-parallel-size 4 \
--max-model-len 32768 \
--enable-prefix-caching
参数不能直接从博客复制到生产。先用目标模型和请求分布建立基线。
5. SGLang¶
SGLang 的核心特点包括 RadixAttention/Prefix Cache、结构化生成、并行和面向复杂 LLM/多模态工作负载的运行时。
优先评估场景:
- 大量请求共享 System Prompt 或长前缀;
- Agent、结构化输出和多轮推理;
- 需要复杂 Cache-aware Scheduling;
- 希望在 NVIDIA、AMD、TPU 等受支持后端运行;
- 评估 P/D 分离或大规模多机推理。
重点验证:
- Radix Cache 命中和内存开销;
- Cache 与负载均衡的亲和;
- 结构化输出对吞吐的影响;
- 目标模型、量化、硬件 Backend;
- SGLang 与 llm-d/Dynamo 等控制面的兼容版本;
- 请求取消、滚动发布和缓存清理。
参考:SGLang Documentation。没有 GPU 时,可先按 SGLang Model Gateway CPU 实战 验证动态发现、路由、故障摘除和指标,但不能把 Mock 结果当作 Runtime 性能结论。
6. TensorRT-LLM¶
适合追求 NVIDIA 平台极限性能并能承担构建与验证复杂度的团队。能力通常包括:
- 多种低精度和量化;
- In-flight Batching;
- Paged KV Cache;
- Tensor/Pipeline/Expert Parallel;
- 投机解码;
- 多节点和分离式推理;
- 与 Triton、Dynamo、NIM 等 NVIDIA 栈集成。
主要风险:
- Engine/Artifact 可能绑定 GPU 架构、TensorRT-LLM 和构建配置;
- 模型转换和编译进入供应链;
- 新模型支持可能晚于通用框架;
- 性能最优参数随 GPU 代际变化;
- 回滚需要同时保留旧 Engine 和 Runtime。
7. Triton Inference Server¶
Triton 适合统一传统 ML/DL、多模型和多 Backend:
- TensorRT、ONNX Runtime、PyTorch、Python 等 Backend;
- Model Repository 与版本策略;
- HTTP/gRPC 和 KServe Protocol;
- Dynamic Batching、Sequence Batching;
- 多 Model Instance;
- Model Management、Metrics 和 Trace;
- Ensemble 和前后处理。
Triton 可以承载 LLM Backend,但如果目标是最新的 Prefix Cache、P/D 分离或复杂 LLM 路由,应比较直接使用 vLLM/SGLang/TensorRT-LLM 或其 Triton Backend 的实际能力与运维复杂度。
8. llama.cpp 与边缘运行时¶
适合:
- CPU、消费级 GPU、Apple Silicon 或边缘设备;
- GGUF 量化模型;
- 单机、小规模和离线场景;
- 对依赖和部署体积敏感的环境。
在 Kubernetes 上仍要解决:
- 节点能力标签;
- 模型文件分发;
- 本地盘和边缘弱网;
- CPU/内存/线程亲和;
- API、探针、更新和回滚;
- 多副本负载均衡。
不要因为 Runtime 轻量,就跳过模型版本和质量回归。
9. 多引擎 Runtime Catalog¶
平台可以维护一组经过验证的 Runtime:
| Runtime ID | 引擎 | 硬件 | 适用模型 | 状态 |
|---|---|---|---|---|
| vllm-cuda-stable | vLLM | NVIDIA Ampere+ | 通用 Decoder LLM | stable |
| sglang-cuda-prefix | SGLang | NVIDIA Hopper | 共享长前缀 | canary |
| trtllm-hopper-fp8 | TensorRT-LLM | H100/H200 | 已编译 FP8 模型 | stable |
| vllm-rocm | vLLM ROCm | AMD Instinct | 验证列表内模型 | canary |
| llama-cpu | llama.cpp | x86/ARM | GGUF 小模型 | stable |
每个 Runtime 记录:镜像 Digest、驱动/CUDA/ROCm、引擎版本、支持模型、量化、最大上下文、已知限制、基准和下线日期。
10. Kubernetes Deployment 基线¶
apiVersion: apps/v1
kind: Deployment
metadata:
name: llm-server
spec:
replicas: 1
selector:
matchLabels:
app: llm-server
template:
metadata:
labels:
app: llm-server
spec:
terminationGracePeriodSeconds: 120
containers:
- name: server
image: registry.example.com/ai/vllm@sha256:replace
args:
- serve
- /models/example
- --served-model-name=example
ports:
- name: http
containerPort: 8000
readinessProbe:
httpGet:
path: /health
port: http
periodSeconds: 5
resources:
requests:
cpu: "8"
memory: 64Gi
nvidia.com/gpu: "1"
limits:
cpu: "8"
memory: 64Gi
nvidia.com/gpu: "1"
生产还需要模型卷、/dev/shm、安全上下文、ServiceAccount、NetworkPolicy、PDB、Service、Gateway、指标和优雅终止。
11. Readiness 与启动探针¶
模型下载和加载可能很久,建议区分:
- Startup Probe:允许进程和模型完成初始化;
- Liveness Probe:检测进程是否卡死;
- Readiness Probe:模型和引擎是否能安全接收流量。
Readiness 应覆盖目标模型存在、Engine Worker 健康和必要分布式 Peer 就绪。端口监听不能证明模型已加载。
12. 优雅终止¶
滚动升级时:
- 从 Endpoint/InferencePool 移除;
- 停止接收新请求;
- 允许流式和长请求完成或返回可识别错误;
- 清理 P/D、KV 和分布式连接;
- 在宽限期内退出;
- 超时才强制终止。
需要验证客户端取消、SIGTERM、preStop 和 Gateway Endpoint 更新顺序。
13. 引擎选择实验¶
用同一模型和硬件对候选引擎执行:
- 功能兼容测试;
- 离线质量回归;
- 单请求 TTFT/TPOT;
- 不同并发下吞吐和尾延迟;
- 长短输入混合和突发流量;
- 模型冷启动;
- OOM、取消、重启和滚动升级;
- 指标、Trace 和日志完整性;
- 单位 Token 成本和功耗;
- 版本升级兼容。
14. 常见错误¶
- 只看厂商公布的峰值 Token/s;
- 不固定模型 Revision、量化和请求分布;
- 把引擎和服务控制面视为互斥产品;
- 同时开启所有优化而无法定位回归;
- 使用
latest镜像和模型 Tag; - Readiness 只检查端口;
- 让一个 Runtime 支持所有模型而没有兼容矩阵;
- 忽略取消、滚动升级和长连接。
15. 生产检查清单¶
- 引擎选择基于目标模型、硬件和真实请求分布。
- Runtime Catalog 固定镜像 Digest 和兼容矩阵。
- 模型质量与性能使用同一制品版本回归。
- Readiness 表示模型真正可以接流量。
- 冷启动拆分为下载、加载、编译和预热。
- 流式请求、取消和 SIGTERM 行为经过验证。
- 多机引擎由 LWS/控制面整体管理。
- Gateway、KServe 和引擎职责没有重叠写入。
- 指标包含 TTFT、TPOT、队列、Token 和 KV Cache。
- 升级能回滚模型、引擎和配置三部分。