Skip to content

LLM 推理优化

AI 技术 ⭐⭐⭐ 高级 🔥🔥🔥 高频

💡 核心要点

LLM 推理优化是系统设计面试的高频考点。自回归解码的逐 Token 生成特性使推理成为 memory-bound 任务,KV Cache、量化、推测解码和持续批处理是四大核心优化技术。理解这些技术的原理和权衡,是设计高性能 LLM 服务的基础。

为什么推理优化重要

LLM 推理分为两个阶段:

  • 预填充(Prefill):一次性处理所有输入 Token,是 compute-bound(计算密集型)
  • 解码(Decode):逐个生成输出 Token,每步需要访问所有历史 KV 状态,是 memory-bound(访存密集型)

解码阶段是推理延迟的主要瓶颈——每生成一个 Token 都需要一次完整的前向传播,但实际计算量远小于显存读写量。优化推理的核心就是减少访存、提高并行度、降低精度换取速度

推理性能三角

指标含义优化方向
延迟(Latency)首 Token 时间(TTFT = Time To First Token)+ 每 Token 时间(TPOT = Time Per Output Token)模型压缩、推测解码
吞吐量(Throughput)每秒生成的 Token 数(tokens/s)批处理、并行化
成本(Cost)每百万 Token 的计算费用量化、缓存、模型选择

三者往往存在权衡:高吞吐可能增加单请求延迟,低精度量化降低成本但可能影响质量。


KV Cache(Key/Value Cache)

原理

在自回归生成中,每生成一个新 Token,模型需要对整个序列(包括所有历史 Token)计算注意力。如果每步都重新计算所有 Token 的 Key 和 Value,会产生大量冗余计算。

KV Cache 的核心思想:缓存已计算的 Key 和 Value 矩阵,新 Token 生成时只需计算当前 Token 的 Q/K/V,然后与缓存的 K/V 拼接即可。

KV Cache 显存开销

KV Cache 的大小随序列长度线性增长:

例如:LLaMA-70B(80 层、64 头、128 维、FP16)在序列长度 4096、batch=32 时,KV Cache 约需 40 GB 显存。

KV Cache 优化技术

Multi-Query Attention (MQA) 与 Grouped-Query Attention (GQA)

标准多头注意力中,每个头有独立的 K/V。MQA 和 GQA 通过共享 K/V 头来减少 KV Cache 大小:

方案K/V 头数Cache 大小质量代表模型
MHA= Q 头数100%最好GPT-3
GQAQ 头数 / g(分组)100/g %接近 MHALLaMA 2 70B, Qwen
MQA1极小略有下降PaLM, Falcon

PagedAttention(vLLM 核心)

传统实现为每个请求预分配连续显存块存放 KV Cache,但实际序列长度不可预知,导致严重的显存碎片化

PagedAttention 借鉴操作系统的虚拟内存分页思想:

  • 将 KV Cache 分成固定大小的页(Block)
  • 使用页表映射逻辑位置到物理显存
  • 按需分配,避免预分配浪费
  • 支持跨请求共享页(如共享 System Prompt 的 KV Cache)

显存利用率从传统方案的 ~50% 提升到 >95%

KV Cache 压缩

技术原理场景
H2O(Heavy-Hitter Oracle)保留注意力分数高的"重要"Token 的 KV,淘汰低分 Token超长序列
StreamingLLM保留开头 Token + 滑动窗口内 Token 的 KV流式/无限长度生成
KV Cache 量化将 KV Cache 从 FP16 压缩到 INT8/INT4显存受限场景

量化 Quantization

量化是将模型权重和/或激活值从高精度(FP32/FP16)转换为低精度(INT8/INT4)表示,以减少显存占用和加速计算。

量化基础

精度位宽压缩比说明
FP1616 bit基准标准训练精度
INT88 bit2x 压缩精度损失小
INT44 bit4x 压缩需要特殊处理

核心权衡:精度 vs 速度 vs 显存。INT4 量化可将 70B 模型从 140GB 压缩到 ~35GB,使其可在单卡(A100 80GB)上运行。

主流量化方案

方案类型原理优势局限
GPTQ训练后量化基于二阶信息(Hessian)逐层量化,需校准数据集精度损失小,推理快量化过程需数小时
AWQ训练后量化识别"重要"权重通道(基于激活分布),对其保持高精度比 GPTQ 更快量化,质量相当需要校准数据
GGUF训练后量化llama.cpp 格式,支持 CPU+GPU 混合推理,多种量化级别(Q4_K_M 等)灵活部署,CPU 可运行CPU 推理速度有限
SmoothQuant训练后量化将激活的量化难度"转移"到权重上同时量化权重和激活实现复杂
QLoRA训练时量化4-bit 量化模型 + LoRA 微调极低显存微调仅用于微调场景

量化实践建议

  • INT8 量化:几乎无损,推荐作为默认部署精度
  • INT4 量化:适合显存受限场景,推荐使用 AWQ 或 GPTQ
  • 本地部署:使用 GGUF 格式 + llama.cpp / Ollama
  • 微调:使用 QLoRA(4-bit 量化 + LoRA)

推测解码 Speculative Decoding

推测解码通过用小模型加速大模型推理,在不改变输出分布的前提下提升生成速度。

原理

关键保证:通过拒绝采样(rejection sampling),推测解码的输出分布严格等同于大模型直接生成——不是近似,而是数学上精确等价。

加速效果

加速比取决于小模型与大模型的一致率 α(小模型生成被大模型接受的概率):

其中 是小模型与大模型的速度比。典型场景下可实现 2~3x 加速

变体

变体特点适用场景
标准推测解码独立小模型作为 Draft Model通用场景
Self-Speculative跳过大模型部分层作为 Draft无需额外小模型
Medusa在大模型头部添加多个预测头,同时预测多个未来位置高一致率场景
EAGLE学习特征级别的 Draft,而非 Token 级别更高加速比

持续批处理 Continuous Batching

静态批处理的问题

传统静态批处理等待一批请求凑齐后一起处理,所有请求必须等最长的请求完成:

静态批处理:所有请求必须等最长请求完成才能释放,导致 GPU 大量空闲。

持续批处理:请求完成后立即释放资源,新请求可在任意解码步加入当前批次。

持续批处理(Iteration-Level Scheduling)

核心思想:在**每个解码步(iteration)**粒度进行调度——

  • 请求完成后立即释放资源
  • 新请求可在任意解码步加入当前批次
  • GPU 利用率从静态批处理的 ~30% 提升到 >80%

这是 vLLM、TGI 等推理框架的核心调度策略。


MoE 推理优化

MoE(Mixture of Experts)已是 2024-2025 年大模型的主流架构(DeepSeek-V3 671B / Mixtral 8x22B / LLaMA 4 / GPT-4o)。它在推理侧带来了与 Dense 模型不同的瓶颈——这是 2025-2026 年面试中"你了解 MoE 工程化吗"的高频追问点。

Dense vs MoE 推理特性

维度Dense(稠密)MoE工程含义
参数总量全部激活部分激活(如 DeepSeek-V3 671B 中只激活 37B)MoE 算力需求小,显存需求大
显存占用等于激活参数等于总参数(所有专家都要常驻显存)MoE 部署门槛反而更高
计算量 FLOPs与激活参数成正比与激活参数成正比MoE 推理速度可媲美小 Dense 模型
带宽瓶颈加载全部权重每 Token 仅加载被路由到的专家权重MoE 受显存带宽限制更显著
批处理友好度低(不同 Token 路由到不同专家,难凑批)MoE 需要专门的批调度

三大核心挑战

① 专家负载不均(Expert Load Imbalance)

理想情况下 N 个专家应均匀分担流量,但实际推理时少数"热门专家"会被反复路由,导致:

  • 热门专家所在 GPU 排队,冷门 GPU 闲置
  • 整体延迟由最热 GPU 决定(木桶效应)

应对

  • 训练时:辅助损失(auxiliary loss)惩罚不均衡,DeepSeek-V3 采用无辅助损失的偏置项动态调整
  • 推理时:副本部署热门专家(Expert Replication)、动态再分配

② 跨 GPU 通信开销(Expert Parallelism)

大型 MoE 必须把专家切分到多卡,每个 Token 在路由后要 All-to-All 通信送到对应专家的 GPU:

Token Routing (Decode 阶段):
  GPU 0 上的 Token → 被路由到 → GPU 5 上的 Expert 42
  GPU 3 上的 Token → 被路由到 → GPU 0 上的 Expert 7
  ...
  → 每步 Decode 都触发 All-to-All,是 MoE 推理的主要延迟来源

应对

  • Expert Parallelism + Tensor Parallelism 混合切分(DeepSpeed-MoE、SGLang)
  • 在节点内用 NVLink 减少跨节点流量
  • MoE-aware Prefill/Decode 分离:Prefill 阶段 Token 多易凑批,Decode 阶段单独优化

③ KV Cache 仍然是全量的

容易踩坑:MoE 只稀疏化了 FFN 层,Attention 层和 KV Cache 不变——所以 KV Cache 显存压力跟同等隐藏维度的 Dense 模型一样大。

MoE 工程化关键技术

技术解决问题代表实现
Expert Parallelism (EP)单卡装不下所有专家DeepSpeed-MoE、Megatron-LM
Expert Caching冷门专家按需 swap 进显存Mixtral 本地部署、llama.cpp MoE
Speculative Routing提前预测路由减少 All-to-All 等待研究阶段
Grouped Expert Layout把常一起激活的专家放同一 GPUDeepSeek-V3 部署经验
MoE 量化FP8 量化专家权重,显存减半DeepSeek-V3 原生 FP8、vLLM 0.6+

💡 面试加分点

能讲出 "MoE 模型推理时算力像小模型,显存像大模型,通信开销远大于 Dense" 这一句,就已经超出 80% 候选人。再补一句 DeepSeek-V3 用 FP8 + 无辅助损失负载均衡 + 多 Token 预测,整个面试官的眼睛会亮。


长上下文推理优化

随着 128K-1M Token 上下文成为主流,长上下文推理出现了与短文本完全不同的瓶颈——Prefill 阶段的注意力计算和 KV Cache 显存。本节聚焦推理侧的优化技术(与长度外推训练侧的 RoPE/YaRN 区分,详见 LLM 基础 — 长度外推)。

长上下文的两个瓶颈

阶段主要瓶颈数量级
Prefill(处理输入)注意力 计算100K Token 输入 ≈ 10× 短文本的 prefill 时间
Decode(生成输出)KV Cache 显存读写带宽100K Token 的 KV Cache 可达数十 GB

核心优化技术

① FlashAttention(必备基础)

把注意力计算重新组织为分块流式,所有中间矩阵不再实例化到 HBM,只在 SRAM 中运算:

  • 计算复杂度依然 ,但显存复杂度从 降到
  • 长上下文场景 prefill 提速 2-4×
  • 已是 PyTorch、vLLM、SGLang、TensorRT-LLM 的默认实现
  • 演进:FlashAttention-2(更好的并行)、FlashAttention-3(FP8 + Hopper 架构)

② Ring Attention(超长上下文必备)

当单卡装不下完整 KV Cache(如 1M Token)时,把 KV Cache 环形切分到多卡,Q 在卡之间"绕环"逐段计算:

GPU 0: Q + KV[0:250K]
GPU 1:     KV[250K:500K]   ← Q 旋转到 GPU 1 计算这段
GPU 2:     KV[500K:750K]   ← Q 继续旋转
GPU 3:     KV[750K:1M]
  • 让上下文长度线性扩展(卡数翻倍 → 上下文翻倍)
  • 是 Gemini 1.5 Pro、Claude 长上下文背后的关键技术之一
  • 代表实现:Megatron-LM Context Parallelism、vLLM 长上下文模式

③ Chunked Prefill

把超长输入的 prefill 切成多个小块,与其他请求的 decode 步交替执行

  • 解决"长 prefill 阻塞所有 decode 请求"的尾延迟问题
  • vLLM、SGLang、TensorRT-LLM 已原生支持

④ Prefix Cache / KV Cache 复用

多个请求共享相同前缀(System Prompt、Few-shot、长文档)时,KV Cache 只算一次跨请求复用

  • vLLM 的 Automatic Prefix Caching、SGLang 的 RadixAttention 是代表
  • Prompt Caching(API 层)配套,构成"前端缓存命中 + 后端 KV 复用"的完整链路

⑤ KV Cache 压缩 / 驱逐

超长对话中老 Token 价值递减,可主动丢弃或压缩:

  • StreamingLLM:保留 attention sink token(前几个)+ 滑动窗口
  • H2O / SnapKV:基于注意力分数动态淘汰
  • 适合无限长流式对话(如长期 Agent 会话)

推理引擎选型对比(2026 必背)

面试 Top 题:"vLLM、SGLang、TensorRT-LLM、llama.cpp 怎么选?"——能讲清各自核心优势 + 适用场景 + 真实数字,立刻区分中/高级工程师。

主流引擎核心差异

引擎核心技术强项弱项适用场景
vLLMPagedAttention(KV 分页)+ Continuous Batching吞吐量王者(业界标杆)、生态最广、开源活跃极致延迟不如 TensorRT-LLM、Windows 不友好通用首选:API 服务、高吞吐场景
SGLangRadixAttention(前缀树共享 KV)+ 编译器优化结构化输出 + Agent / RAG 场景吞吐第一(前缀复用率高)、官方 DSL上线晚于 vLLM,生态稍小Agent / RAG / 多轮对话 / 结构化输出
TensorRT-LLMNVIDIA 官方 + 编译期 Kernel 融合 + FP8单请求极致延迟最低(Hopper 架构上比 vLLM 快 1.5-2×)仅 NVIDIA GPU、编译时间长、配置复杂延迟敏感生产(聊天前端)+ Triton 集成
llama.cppGGUF 量化 + CPU/GPU 混合 + Metal唯一支持 Mac / 边缘 / 嵌入式、INT4 量化生态最完善吞吐弱、不适合多并发服务桌面应用、Mac 本地 LLM、边缘设备
TGI(HF Text Generation Inference)HuggingFace 官方 + 速度优化与 HuggingFace 生态无缝、易上手性能逐渐落后 vLLM/SGLangHF 用户快速原型
Ollamallama.cpp 封装 + 极简体验零配置本地体验服务化弱、性能受限 llama.cpp个人 / 小团队本地实验

PagedAttention vs RadixAttention 本质对比

PagedAttention(vLLM)—— 解决显存碎片

传统 KV Cache: 给每个请求预留 max_seq_len 显存 → 极大浪费

vLLM 思路: 像操作系统分页 → KV Cache 按 16 token 一块切分
  ├── 物理块池(连续 GPU 显存)
  └── 逻辑表(每请求一张 KV 块表)

效果: 显存利用率从 20-40% → 90%+,并发量翻 2-4 倍

RadixAttention(SGLang)—— 解决前缀重复

场景: 10 个用户问相同 System Prompt 的不同问题
  System Prompt: 2000 token(重复 10 次)
  用户问题: 200 token(10 个不同)

传统: 10 × 2200 = 22000 个 KV Cache 槽
SGLang: 2000(共享)+ 10 × 200 = 4000 个槽 → 节省 80%

实现: 用基数树(Radix Tree)按 token 前缀组织 KV Cache
       命中前缀的请求直接复用,不重算 prefill

💡 真实业务选型矩阵

业务类型推荐原因
OpenAI 风格 API 服务(高吞吐)vLLM默认最稳
企业知识库 RAG(长 System Prompt + 多用户)SGLangRadixAttention 前缀复用收益巨大
Agent / 多轮对话SGLang上下文重复率高
C 端聊天前端(极致首 token 延迟)TensorRT-LLMHopper FP8 + Kernel 融合最强
Apple Silicon Mac 本地llama.cpp / Ollama唯一选择
生产 NVIDIA Triton 集群TensorRT-LLM官方深度集成
快速试新模型vLLMTGI上线时间最快

量化方案速查

方案精度显存节省性能损失主流支持
FP16 / BF16(基线)16-bit0%全部
FP8(E4M3)8-bit< 1%TensorRT-LLM / vLLM 0.6+ / DeepSeek-V3 原生
INT8(W8A8)8-bit1-3%TensorRT-LLM / vLLM
AWQ INT44-bit 权重1-3%vLLM / TensorRT-LLM / llama.cpp
GPTQ INT44-bit 权重2-5%vLLM / TGI
GGUF Q4_K_M4-bit3-5%llama.cpp 独家、Mac/CPU 必选
GGUF Q2_K(极致压缩)2-bit10-20%仅嵌入式 / 探索性场景

⚠️ KV Cache 量化的隐藏陷阱

权重量化(FP8/INT4)已是生产共识,但 **KV Cache 量化(FP8 KV)**要谨慎: ① 长上下文场景(>32K)容易精度退化; ② Reasoning 模型(o1/R1 类)对 KV 精度更敏感,建议 FP8 KV 关闭; ③ vLLM 默认 KV 为 FP16,开 FP8 KV 必须先做评估集回归。

投机解码进阶:EAGLE / Medusa(2025 主流)

核心思想:让小模型/小头先猜几个 token,大模型一次验证多个,单步生成 2-3 个 token

方案实现加速比接受率
传统 Speculative Decoding用 7B 草稿模型给 70B 大模型猜1.5-2×60-70%
Medusa(2024)在大模型上加 N 个并行预测头(无需草稿模型)2-2.5×70-80%
EAGLE / EAGLE-2 / EAGLE-3(2024-2025)特征级猜测(不是 token,是 hidden state)3-4×80-90%(SOTA)
Lookahead Decoding用 Jacobi 迭代猜后续 token1.5-2×

vLLM / SGLang / TensorRT-LLM 均原生支持。生产场景首选 EAGLE-2/3(接受率高、显存开销小)。

黄金答题模板

面试官:你的推理服务怎么选型?

:按 4 个维度决策: ① 吞吐 vs 延迟:高吞吐选 vLLM(PagedAttention 显存利用率 90%+),极致延迟选 TensorRT-LLM(Hopper FP8 + Kernel 融合最强); ② 场景重复率:RAG / Agent / 多用户共享 System Prompt 选 SGLang(RadixAttention 前缀复用最高节省 80% KV 显存); ③ 硬件:仅 NVIDIA 才能用 TensorRT-LLM,Mac / 边缘只能 llama.cpp; ④ 量化:生产首选 FP8 权重(DeepSeek-V3 原生支持,TensorRT-LLM/vLLM 0.6+),4-bit 选 AWQ(精度好于 GPTQ),KV Cache 量化要小心精度回退。 加分项:上 EAGLE-2/3 投机解码——SOTA 加速 3-4×,2025 年起所有主流引擎都支持。

技术选型对照

场景推荐组合
128K 以内、单卡部署FlashAttention-2/3 + PagedAttention + Prefix Cache
1M+ 上下文、多卡部署+ Ring Attention / Context Parallelism
高并发长 prefill+ Chunked Prefill
无限长流式 Agent+ StreamingLLM 风格的 KV 驱逐

推理框架对比

框架开发者核心特性适用场景典型性能
vLLMUC BerkeleyPagedAttention、连续批处理、高吞吐高并发线上服务吞吐量最高
TGIHugging Face易部署、支持多种模型、生产就绪HF 生态快速部署中等
TensorRT-LLMNVIDIA深度 GPU 优化、FP8/INT4、Inflight Batching极致性能(NVIDIA GPU)延迟最低
SGLangStanford结构化生成优化(JSON/正则约束)、RadixAttention需要结构化输出的场景结构化生成最快
OllamaOllama一键本地部署、GGUF 格式、极简 API本地开发/测试适合个人使用
llama.cppggerganovCPU/GPU 混合推理、跨平台、量化支持边缘设备/CPU 部署CPU 最优

选型建议

  • 线上服务高并发 → vLLM
  • NVIDIA GPU 追求极致延迟 → TensorRT-LLM
  • 需要结构化输出 → SGLang
  • 本地快速实验 → Ollama
  • 边缘/嵌入式设备 → llama.cpp

常见陷阱

⚠️ 常见误区

  1. 认为量化一定会显著降低质量:INT8 量化几乎无损,INT4 在使用 AWQ/GPTQ 时质量损失也很小。量化前后应用具体任务的评估指标衡量,而非仅看困惑度(Perplexity)。

  2. 忽视 KV Cache 的显存占用:对于长上下文场景,KV Cache 的显存消耗可能超过模型权重本身。必须在系统设计中预留 KV Cache 的显存预算。

  3. 混淆延迟和吞吐量:高吞吐框架(如 vLLM)通过增大批次提升吞吐,但单请求延迟可能增加。面向实时交互的场景应优先优化延迟。

  4. 推测解码的适用条件:当小模型与大模型的一致率低(如领域差异大)时,推测解码可能不如直接推理。需根据具体任务评估一致率。


📝 面试真题3 道高频
1. 请解释 KV Cache 的原理及主要优化方法中等
2. GPTQ 和 AWQ 量化方案有何区别?如何选择?中等
3. 设计一个高吞吐 LLM 推理服务,你会如何选型和优化?困难

面试真题详解

Q1:请解释 KV Cache 的原理及主要优化方法

要点

KV Cache 利用自回归生成的特性——每步生成新 Token 时,历史 Token 的 Key 和 Value 不会改变——将已计算的 K/V 缓存起来,避免重复计算。

显存挑战:KV Cache 大小与 层数 × 头数 × 维度 × 序列长度 × 批大小 成正比,长序列场景下可能超过模型权重本身的显存占用。

三大优化方向

  1. 减少 KV 头数:GQA(分组共享 K/V 头)在质量几乎不降的前提下将 Cache 缩小到 1/g
  2. 优化显存管理:PagedAttention(vLLM)采用虚拟内存分页思想,按需分配、消除碎片,显存利用率从 ~50% 提升到 >95%
  3. 压缩/淘汰:H2O 保留高注意力分数的"重要" Token KV,StreamingLLM 保留开头+滑动窗口

Q2:GPTQ 和 AWQ 量化方案有何区别?如何选择?

要点

维度GPTQAWQ
原理基于二阶信息(Hessian 矩阵)逐层量化,最小化量化误差基于激活分布识别"重要"权重通道,对其保持高精度
校准数据需要,用于计算 Hessian需要,用于分析激活分布
量化速度较慢(数小时)较快
推理质量优秀与 GPTQ 相当或略优
生态支持AutoGPTQ、vLLM、TGIAutoAWQ、vLLM、TGI

选择建议

  • 两者质量接近,AWQ 量化速度更快,推荐作为首选
  • 如已有 GPTQ 格式模型(HuggingFace 上大量社区量化版本),直接使用即可
  • 本地/CPU 部署优先选择 GGUF 格式

Q3:设计一个高吞吐 LLM 推理服务,你会如何选型和优化?

要点

架构设计

  1. 推理引擎选择:vLLM(PagedAttention + 连续批处理),已验证的高吞吐方案
  2. 模型优化
    • 使用 GQA 模型(如 LLaMA 2 70B)减少 KV Cache
    • INT4/INT8 量化降低显存占用,提升单卡可服务的并发数
  3. 系统层优化
    • 连续批处理:在每个解码步粒度调度请求
    • Prefix Caching:缓存共享 System Prompt 的 KV Cache
    • 推测解码:对延迟敏感场景使用小模型加速
  4. 基础设施
    • 多实例负载均衡,按显存利用率路由
    • 请求队列 + 优先级调度
    • 流式返回(SSE)降低用户感知延迟
  5. 监控指标
    • TTFT(首 Token 时间)、TPOT(每 Token 时间)
    • 吞吐量(tokens/s)、GPU 利用率
    • P99 延迟、请求排队时间

权衡讨论:批次越大吞吐越高,但单请求延迟会增加。应根据 SLA 设置最大批次大小和排队超时。


延伸阅读