跳转至

第九章 推理引擎

导读

工程师做完模型选型后,第一个真实决策是:用什么推理引擎跑这个模型?本章对比 vLLM、TensorRT-LLM、SGLang、TGI、llama.cpp、LMDeploy 等主流推理引擎,给出选型框架。

9.1 推理引擎做什么

推理引擎(Inference Engine)是把模型权重变成可服务 API 的中间件,主要承担:

  1. 模型加载:从权重文件初始化,支持多 GPU 切分;
  2. 请求调度:batch、并发、排队;
  3. KV Cache 管理:PagedAttention、prefix cache 等;
  4. 算子优化:FlashAttention、INT4 kernel、fused MLP;
  5. 采样:temperature、top-p、top-k、beam search;
  6. 流式输出:SSE、WebSocket;
  7. 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 选型决策树

推理引擎选型决策树

关键问题

  1. 有 GPU 吗?否 → llama.cpp;
  2. 延迟敏感吗?否(吞吐优先) → vLLM;
  3. NVIDIA 还是 AMD?NVIDIA → TensorRT-LLM;AMD → vLLM ROCm;
  4. 需要复杂结构化输出 / 编排? → SGLang / LMDeploy。

9.4 Batching 策略对比

Static vs Continuous 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

不论用哪个引擎,部署后按这个顺序排查:

  1. 量化:FP8(H100)/ AWQ INT4(A100);
  2. KV Cache 优化:启用 prefix cache、KV 量化;
  3. ** batching 参数**:调 max_num_seqsmax_num_batched_tokens
  4. Tensor Parallel:单卡装不下时再考虑;
  5. Speculative Decoding:如果可用,质量无损提升;
  6. Prefill / Decode 分离:大规模部署才考虑;
  7. HTTP 层:用更快的 web framework(如 grpc 替代 REST);
  8. 网络:跨机推理用 NVLink + InfiniBand。

9.12 性能 benchmark 工具

  • vLLM benchmarkbenchmark_throughput.pybenchmark_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。

练习题

  1. 一个工程师想在 4090 显卡上跑 70B 模型,应选什么引擎与量化方案?
  2. 为什么 vLLM 性能比 HuggingFace transformers 默认实现高 2-4×?
  3. TensorRT-LLM 与 vLLM 相比,主要牺牲了什么换来了什么?
  4. SGLang 的 RadixAttention 与 vLLM 的 prefix cache 有何区别?
  5. 解释 TTFT 与 TPOT 的区别,分别受什么因素影响。
  6. 一个服务 P50 = 100ms 但 P99 = 2s,可能的原因是什么?
  7. 写出一个 vLLM 部署 Llama-3-8B 的命令,要求 INT4 量化 + prefix cache。
  8. Continuous Batching 为什么必须配合 PagedAttention?

下一章:第十章 分布式训练