第九章 推理引擎¶
导读¶
工程师做完模型选型后,第一个真实决策是:用什么推理引擎跑这个模型?本章对比 vLLM、TensorRT-LLM、SGLang、TGI、llama.cpp、LMDeploy 等主流推理引擎,给出选型框架。
9.1 推理引擎做什么¶
推理引擎(Inference Engine)是把模型权重变成可服务 API 的中间件,主要承担:
- 模型加载:从权重文件初始化,支持多 GPU 切分;
- 请求调度:batch、并发、排队;
- KV Cache 管理:PagedAttention、prefix cache 等;
- 算子优化:FlashAttention、INT4 kernel、fused MLP;
- 采样:temperature、top-p、top-k、beam search;
- 流式输出:SSE、WebSocket;
- OpenAI 兼容 API:让上层无需改动。
9.2 主流引擎一览¶
| 引擎 | 主要场景 | 特点 |
|---|---|---|
| vLLM | GPU 通用推理 | PagedAttention、社区活跃、易用 |
| TensorRT-LLM | NVIDIA 极致延迟 | 编译期优化、低延迟、构建复杂 |
| SGLang | 复杂程序 / 结构化输出 | RadixAttention、控制流 |
| TGI | HuggingFace 生态 | 企业稳定、HF 默认 |
| llama.cpp | CPU / 消费级 GPU | 跨平台、GGUF 量化丰富 |
| LMDeploy | 国内生态 | InternLM 系列、Triton backend |
| DeepSpeed-FastGen | Microsoft 生态 | Dynamic Splitfuse |
9.3 选型决策树¶
关键问题:
- 有 GPU 吗?否 → llama.cpp;
- 延迟敏感吗?否(吞吐优先) → vLLM;
- NVIDIA 还是 AMD?NVIDIA → TensorRT-LLM;AMD → vLLM ROCm;
- 需要复杂结构化输出 / 编排? → SGLang / LMDeploy。
9.4 Batching 策略对比¶
| 方式 | 利用率 | 适用 |
|---|---|---|
| Static Batching | 30-50% | 简单,相同长度请求 |
| Continuous Batching | 90%+ | 现代 LLM 服务标准 |
| Dynamic Batching | 60-80% | 中间方案,TGI 默认 |
Continuous Batching 必须配 PagedAttention——否则 batch 重组时 KV Cache 无法高效重排。
9.5 vLLM 详解¶
最流行的开源推理引擎。
核心特性:
- PagedAttention(vLLM 原创);
- Continuous Batching;
- Prefix Caching(
enable_prefix_caching=True); - Tensor Parallel(多 GPU);
- 量化:AWQ、GPTQ、FP8、INT8;
- OpenAI 兼容 API;
- LoRA 动态加载。
典型用法:
vllm serve meta-llama/Llama-3-8B-Instruct \
--tensor-parallel-size 1 \
--quantization awq \
--enable-prefix-caching \
--max-model-len 8192 \
--gpu-memory-utilization 0.9
何时选 vLLM:
- 默认选项;
- 通用 GPU 推理;
- 需要灵活量化与多模型;
- 不想花精力编译。
局限:
- 极致延迟不如 TensorRT-LLM;
- 某些自定义算子支持慢于 TRT-LLM;
- 大规模部署需要外部 load balancer。
9.6 TensorRT-LLM 详解¶
NVIDIA 官方,极致延迟。
核心特性:
- 编译期优化(fused kernel、shape inference);
- In-flight batching(vLLM Continuous Batching 的对应物);
- FP8/INT4/INT8 全精度;
- SmoothQuant 集成;
- 多 GPU:TP + PP。
何时选 TRT-LLM:
- 延迟严格(如 P99 < 200ms);
- NVIDIA H100/H200 部署;
- 高并发吞吐场景;
- 团队有专门推理工程师。
局限:
- 构建复杂(需先 build engine 再 deploy);
- 不灵活(改模型 / 量化方式需重新 build);
- 只 NVIDIA;
- 文档不如 vLLM 友好。
9.7 SGLang 详解¶
新晋引擎,**复杂程序场景**强项。
核心特性:
- RadixAttention:基于基数树的 prefix cache,自动复用任意前缀;
- 结构化输出:JSON 模式、regex 约束生成极快;
- 控制流:分支、循环、并行 call 可在引擎内表达;
- Frontend DSL:Python 风格写复杂 LLM 程序。
何时选 SGLang:
- 复杂 prompt 工程工作流;
- 大量结构化输出(JSON、function call);
- 多 prompt 前缀复用严重(如多 agent 共享 system prompt);
- 想用 RadixAttention 比 vLLM prefix cache 更激进的版本。
9.8 llama.cpp 详解¶
Georgi Gerganov 单人发起的项目,消费级硬件首选。
核心特性:
- 跨平台(CPU、GPU、Apple Silicon、AMD);
- GGUF 格式 + K-quants(Q4_K_M 等);
- 单二进制、零依赖;
- 服务器模式(llama-server);
- 量化丰富(2-8 bit)。
何时选 llama.cpp:
- 笔记本 / 桌面 CPU;
- 单卡消费级 GPU(如 RTX 4090 24GB);
- Apple Silicon(M1/M2/M3);
- 边缘设备 / 离线场景;
- 个人开发者与原型。
局限:
- 吞吐量不如 vLLM;
- 不适合大规模服务;
- 高级特性(prefix cache 等)较弱。
9.9 TGI 详解¶
HuggingFace 出品,企业稳定。
核心特性:
- Continuous Batching;
- FlashAttention 集成;
- 量化支持(AWQ、GPTQ);
- HF Inference Endpoints 默认;
- 稳定、文档好。
何时选 TGI:
- 已在 HF 生态;
- 需要 HF 官方支持;
- 不想踩 vLLM 的边界 bug。
局限:
- 性能略落后 vLLM;
- 社区活跃度不如 vLLM。
9.10 LMDeploy 详解¶
OpenMMLab / 上海 AI Lab 出品,国内 InternLM 系列官方。
核心特性:
- TurboMind 后端(高性能);
- PyTorch 后端(灵活);
- 量化:W8A8、W4A16;
- Triton Inference Server 集成;
- InternLM / Qwen 等中文模型优化好。
何时选 LMDeploy:
- 用 InternLM 系列;
- 国内环境;
- 需要企业级 Triton 部署。
9.11 性能调优通用 checklist¶
不论用哪个引擎,部署后按这个顺序排查:
- 量化:FP8(H100)/ AWQ INT4(A100);
- KV Cache 优化:启用 prefix cache、KV 量化;
- ** batching 参数**:调
max_num_seqs、max_num_batched_tokens; - Tensor Parallel:单卡装不下时再考虑;
- Speculative Decoding:如果可用,质量无损提升;
- Prefill / Decode 分离:大规模部署才考虑;
- HTTP 层:用更快的 web framework(如 grpc 替代 REST);
- 网络:跨机推理用 NVLink + InfiniBand。
9.12 性能 benchmark 工具¶
- vLLM benchmark:
benchmark_throughput.py、benchmark_serving.py; - GenAI-Perf(NVIDIA):TRT-LLM 官方;
- lm-eval-harness:质量评测(非性能);
- LLM-Perf:OpenAI 出的简易工具。
关键指标:
| 指标 | 含义 |
|---|---|
| Throughput (tokens/s) | 吞吐量 |
| TTFT (Time To First Token) | 首 token 延迟 |
| TPOT (Time Per Output Token) | 每 token 延迟 |
| P50/P99 latency | 长尾延迟 |
| GPU utilization | GPU 利用率 |
| Memory utilization | 显存利用率 |
工程实战要点¶
- vLLM 是默认选择:除非有明确理由选别的;
- TRT-LLM 适合延迟严格场景:但构建复杂、不灵活;
- SGLang 在结构化输出场景强:JSON / function call;
- llama.cpp 是消费级首选:笔记本 / 桌面 / 边缘;
- 不同引擎性能差异 2-5×:选错代价大;
- benchmark 必须用真实业务 prompt:不是默认 dataset;
- P99 比 mean 重要:长尾会"感知到慢";
- HTTP 层常被忽略:grpc / HTTP2 比默认 Flask 快 3-10×。
小结¶
- 推理引擎承担模型加载、调度、KV 管理、采样、API;
- 主流:vLLM(默认)、TRT-LLM(极致延迟)、SGLang(结构化)、llama.cpp(消费级)、TGI(HF 生态)、LMDeploy(国内);
- 选型核心:硬件 + 延迟 vs 吞吐权衡 + 业务场景;
- Continuous Batching + PagedAttention 是现代引擎标配;
- 性能调优顺序:量化 → KV 优化 → batching → TP → speculative → prefill/decode 分离;
- 关键指标:throughput / TTFT / TPOT / P99;
- benchmark 必须用真实业务 prompt。
练习题¶
- 一个工程师想在 4090 显卡上跑 70B 模型,应选什么引擎与量化方案?
- 为什么 vLLM 性能比 HuggingFace transformers 默认实现高 2-4×?
- TensorRT-LLM 与 vLLM 相比,主要牺牲了什么换来了什么?
- SGLang 的 RadixAttention 与 vLLM 的 prefix cache 有何区别?
- 解释 TTFT 与 TPOT 的区别,分别受什么因素影响。
- 一个服务 P50 = 100ms 但 P99 = 2s,可能的原因是什么?
- 写出一个 vLLM 部署 Llama-3-8B 的命令,要求 INT4 量化 + prefix cache。
- Continuous Batching 为什么必须配合 PagedAttention?
下一章:第十章 分布式训练