大语言模型(LLM)的推理部署是 AI 工程化中最具挑战性的环节之一。从实验室里的 Jupyter Notebook 到生产环境中百万 QPS 的在线服务,中间隔着一条巨大的鸿沟。本文将深入剖析 LLM 推理优化的核心技术栈,涵盖从底层算子优化到上层服务编排的全链路实践。

一、LLM 推理的核心瓶颈

理解优化方向之前,必须先了解推理过程中真正的瓶颈在哪里。

1.1 计算密集 vs 内存密集

LLM 的自回归生成过程可以分为两个阶段:Prefill(预填充)阶段一次性处理全部输入 Token,属于计算密集型操作;Decode(解码)阶段逐 Token 生成,每次只计算一个新 Token,属于内存密集型操作。两个阶段的资源利用模式截然不同:Prefill 阶段 GPU 计算单元利用率高达 80%+,而 Decode 阶段 GPU 大量算力闲置,时间主要花在从 HBM 读取权重矩阵上。

1.2 显存墙

一个 7B 参数的 FP16 模型仅权重就需 14GB 显存。每增加一个并发请求,KV Cache 就要额外分配数十 MB 到数 GB 显存不等。一张 80GB 的 A100 在不做优化的情况下,可能只能支撑个位数的并发请求。

1.3 请求到达的随机性

在线服务的请求具有高度的突发性和不可预测性。传统的静态批次策略(把所有请求凑在一起处理)会导致长尾请求的延迟急剧膨胀。

二、KV Cache 与 PagedAttention

KV Cache 是 LLM 推理优化的里程碑式创新,也是理解后续所有优化的基础。

2.1 标准 KV Cache 的问题

在标准 KV Cache 中,系统为每个请求连续分配一块显存空间来存放自注意力机制中的 Key 和 Value 向量。然而,不同请求的生成长度差异极大(有的生成 10 Token,有的生成 2048 Token),导致显存碎片化严重。操作系统中的内存碎片问题在 GPU 显存上同样存在,甚至更为严重,因为 GPU 连续内存分配的限制更加严格。

2.2 PagedAttention:显存分页的革命

vLLM 团队提出的 PagedAttention 受操作系统虚拟内存启发,将 KV Cache 分割成固定大小的 Block(类似内存页)。每个请求的 KV Cache 以逻辑连续、物理离散的 Block 形式存储。这种设计的意义在于:第一,消除外部碎片。Block 大小固定,任何空闲 Block 都可以被任意请求使用,不存在因为尺寸不匹配导致的碎片浪费。第二,支持动态扩展。随着生成 Token 增多,按需分配新 Block,无需预先假设最大生成长度。第三,支持共享推理。在 Few-shot Learning 或多轮对话中,不同请求可能共享相同的 System Prompt 前缀或历史对话的 KV Cache,通过 Copy-on-Write 实现显存的零拷贝共享。

2.3 显存利用率对比

实测表明,PagedAttention 可将 KV Cache 的显存利用率从传统方式的 20%-40% 提升到接近 100%,这意味着同等硬件条件下吞吐量可以提升 2-4 倍。

三、Continuous Batching(连续批处理)

如果说 PagedAttention 解决了显存效率问题,Continuous Batching 则解决了计算效率问题。

3.1 Static Batching 的困境

在传统 Static Batching 中,一批请求中最长的那个决定了整批的等待时间。如果一个请求需要生成 2000 Token,同批中只需要 50 Token 的请求也要在那干等。这种同步等待机制对尾延迟(Tail Latency)是灾难性的。

3.2 Continuous Batching 的工作原理

Continuous Batching(也称 Iteration-Level Scheduling)的核心思想是:在每一次 Decode 迭代中动态调整批次组成。生成完毕的请求立即退出批次,新到达的请求立即进入批次。调度粒度从「请求级」细化到「迭代级」,GPU 在每一次前向传播中只处理当前活跃请求,避免了无效等待。

3.3 实现要点

实现 Continuous Batching 有三个关键技术点:一是 Preemption 机制——当新请求到来但显存不足时,可以抢占低优先级请求的 KV Cache Block,将其「换出」到 CPU 内存或暂存队列;二是 Chunked Prefill——将长输入的 Prefill 切分成多个 Chunk 与 Decode 交错执行,避免单个 Prefill 阻塞所有 Decode;三是高效的 调度器设计——基于 Watermark 算法预测显存使用,动态决定是否接受新请求。

四、量化技术深度解析

量化是最直接的推理加速手段,通过降低模型权重的数值精度来减少显存占用和内存带宽需求。

4.1 GPTQ:训练后量化的标杆

GPTQ(Generative Pre-trained Transformer Quantization)利用二阶 Hessian 信息在训练后进行权重量化。其奥秘在于逐列量化 + 最优量化顺序:按照 Hessian 逆矩阵的对角线大小决定每列的量化顺序(敏感度从低到高),已量化列的误差通过更新后续列来补偿。结果是在 4-bit 量化下,7B/13B 模型的困惑度(Perplexity)几乎不变。

4.2 AWQ:激活感知的权重量化

AWQ(Activation-aware Weight Quantization)洞察到:权重矩阵中不是所有列都同等重要。对应激活值较大的「显著通道」(Salient Channel)对模型输出的影响远大于其他通道。AWQ 的策略是:对显著通道保持高精度(FP16),其余通道做低精度量化。这种方法在 4-bit 下往往比 GPTQ 精度更高。

4.3 GGUF + llama.cpp:消费级硬件上的 LLM

GGUF(GPT-Generated Unified Format)配合 llama.cpp 实现了在消费级硬件上运行 LLM 的突破。GGUF 将模型权重、Tokenizer、配置信息打包为单一文件格式,支持 Q2_K、Q3_K_S、Q4_K_M、Q5_K_M、Q6_K、Q8_0 等多种量化等级。一个 Q4_K_M 量化的 7B 模型仅需约 4.3GB 内存,可以在 MacBook M2 上以每秒 30+ Token 的速度运行。

4.4 FP8 与硬件原生支持

NVIDIA H100/H200 GPU 原生支持 FP8(8-bit Floating Point)数据类型,不需要后训练量化即可直接使用。FP8 分为 E4M3(更高精度,用于前向传播)和 E5M2(更大动态范围,用于反向传播/梯度)两种格式。在生产推理中使用 FP8 可以在几乎不损失模型质量的前提下实现约 1.5-2 倍的速度提升。

五、投机采样(Speculative Decoding)

投机采样是一种巧妙的算法优化,它不以牺牲模型质量为代价换速度。

5.1 核心思路

自回归模型的每一步 Decode 都要从 HBM 加载全部权重(比如 70B 模型的 140GB FP16 权重),但 GPU 计算单元只在做简单的矩阵乘法。投机采样利用一个小型草稿模型(Draft Model,通常是目标模型的 1/10 大小)快速生成 K 个候选 Token,然后用目标模型一次性「验证」这 K 个 Token。

5.2 为什么有效

关键洞察:验证 K 个 Token 的时间约等于解码 1 个 Token 的时间。因为 Decode 模式下每步只计算 1 个新 Token 的注意力,GPU 受限于内存带宽而非算力。验证阶段可以像 Prefill 一样并行处理 K 个 Token,充分利用 GPU 的算力。如果草稿模型「猜对」了 K 个中的 M 个(M 通常接近 K),等效速度就提升了 M 倍。

5.3 接受率与草稿模型选择

草稿模型的「接受率」(Acceptance Rate)直接影响加速效果。当目标模型和草稿模型对某位置的 Top 预测高度一致时,接受率可达 90%+。实践中常用中型模型作为大型模型的草稿模型(如 7B 作为 70B 的草稿),或使用 Medusa 等投机头方案——在目标模型上附加轻量级并行头来同时预测多个位置的 Token。

六、FlashAttention:硬件感知的精确注意力

FlashAttention 通过 IO 感知的精确注意力算法解决了 Transformer 中注意力计算的内存瓶颈。

6.1 标准注意力的内存问题

标准 Attention 需要构建完整的 N×N 注意力矩阵并写入 HBM(高带宽显存)。当序列长度 N=8192 时,每个注意力头的中间矩阵就需要 256MB,128 个注意力头就需要 32GB——这已经超过了单层权重大小。而且 HBM 的读写延迟比 SRAM 慢一个数量级。

6.2 FlashAttention 的 Tiling 策略

FlashAttention 利用 GPU 片上 SRAM(约 20MB per SM)远快于 HBM 的特性,通过 Tiling(分块计算) 避免物化 N×N 注意力矩阵:将 Q、K、V 切分成小块,每次只将一个 Block 加载到 SRAM 中计算部分注意力结果,然后通过 Online Softmax 技术(记录修正因子)将各块结果合并。最终内存复杂度从 O(N²) 降到 O(N)。

6.3 FlashAttention-2 与 FlashAttention-3

FlashAttention-2 通过减少非矩阵乘法运算、优化 Warp 间并行和循环结构,将 HBM 访问效率进一步提升到理论峰值的 73%。FlashAttention-3 则是针对 Hopper 架构(H100)的异步计算特性,利用 Tensor Memory Accelerator(TMA)和 Warpgroup 级矩阵乘法异步重叠,实现了接近硬件理论峰值的性能。

6.4 PagedAttention + FlashAttention = vLLM

vLLM 将 PagedAttention 和 FlashAttention 集成在一起:PagedAttention 解决 KV Cache 的显存管理问题,FlashAttention 解决任意不规则 KV Cache Block 的高效注意力计算问题。这是当前开源 LLM 服务的事实标准。

七、张量并行与流水线并行

当模型大到一张 GPU 装不下时,必须引入模型并行策略。

7.1 Tensor Parallelism(张量并行)

张量并行将模型权重按维度切分到多张 GPU 上。以 Transformer 中的 MLP 层为例:Y = X · W,可以将 W 按列切成 [W1, W2],然后 X·W1 和 X·W2 分别在两张 GPU 上计算,最后做一次 All-Gather 聚合结果。Megatron-LM 的二维张量并行策略对 Attention 的 QKV 投影和 MLP 层的 Gate/Up 投影分别做不同的切分方向,使得每层只需要两次 AllReduce 通信。

7.2 Pipeline Parallelism(流水线并行)

流水线并行将模型的不同层分配到不同 GPU,每个 GPU 拥有的一组连续的层。这是最直观的模型切分方式,但著名的「流水线气泡」(Pipeline Bubble)问题导致 GPU 利用率有限。GPipe 的 F-then-B 调度策略和 Megatron-LM 的 1F1B(One Forward One Backward)调度各有取舍。在推理场景中,流水线并行的气泡问题更加突出,因为推理不需要反向传播。

八、TensorRT-LLM:推理部署的工业标杆

NVIDIA TensorRT-LLM(原 FasterTransformer)代表了当前 LLM 推理性能的最高水准。

8.1 架构概览

TensorRT-LLM 融合了多种优化技术:Custom Kernel(融合 Attention、GELU、LayerNorm 等算子)、In-flight Batching(连续批处理)、Paged KV Cache、GPTQ/AWQ 量化支持、Multi-GPU 多机推理、gRPC/PyTorch Backend 服务端等。

8.2 融合算子(Fused Kernels)

TensorRT-LLM 的核心是大量手工 CUDA Kernel。例如,它将 Multi-Head Attention 的 QKV 投影、位置编码、因果掩码、Softmax、Dropout、与 V 的乘法以及 Output 投影全部融合到单个 Kernel,避免中间结果写入 HBM。再如 GEMM + Bias + GELU + LayerNorm 的四合一融合,在 FP16 下可减少约 30% 的 Kernel Launch 开销和 HBM 读写。

8.3 In-flight Batching 与 Executor

TensorRT-LLM 的 Executor 层实现了与 vLLM 类似的 Iteration-Level Batching。每个迭代结束后检查完成的请求,将其从活跃批次中移除,将新请求加入。动态 Batch Size 机制使得系统在保持低延迟的同时充分利用 GPU 算力。

九、生产部署架构

9.1 推理服务的整体架构

一个标准化的 LLM 推理生产系统通常包含以下组件:

流量网关层:负责负载均衡、请求路由、速率限制。常用 Nginx + Lua 脚本或 Envoy Proxy。

模型服务层:托管 vLLM / TensorRT-LLM 实例。支持 A/B 测试、模型热更新、多模型共享 GPU。

调度层:接收用户请求、执行 Token 计费、管理并发配额、处理请求排队。

缓存层:响应缓存命中相同前缀的请求,大幅降低 KV Cache 的计算量。语义缓存使用 Embedding 相似度匹配近似相同的请求。

9.2 vLLM 部署实践

vLLM 的生产部署强烈推荐使用其 OpenAI 兼容 API 服务模式:

python -m vllm.entrypoints.open.api_server \
  --model meta-llama/Meta-Llama-3-8B-Instruct \
  --dtype auto \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.95 \
  --enable-prefix-caching \
  --enable-chunked-prefill \
  --max-num-seqs 256

关键参数说明:gpu-memory-utilization 0.95 尽可能利用全部 GPU 显存;enable-prefix-caching 启用 KV Cache 前缀缓存加速 System Prompt 复用;enable-chunked-prefill 将长 Prefill 切分避免阻塞 Decode;max-num-seqs 256 控制最大并发请求数。

9.3 性能基准调优

衡量推理服务的核心指标包括 TTFT(Time To First Token,首 Token 延迟)、TPOT(Time Per Output Token,每 Token 生成延迟)和 Throughput(吞吐量)。TTFT 取决于输入长度和 Prefill 效率,TPOT 取决于 KV Cache 的管理效率和 GEMM 性能。最优配置是在 TTFT 可接受的前提下最大化 TPOT 效率。Batch Size 越大单 Token 延迟越高但总吞吐量越大,需要在延迟 SLA 约束下找到甜蜜点。

十、未来趋势

LLM 推理优化领域正朝着几个关键方向发展:

MoE 推理优化:Mixture of Experts 模型(如 Mixtral、DeepSeek-V2)每次推理只激活部分专家,挑战在于如何在不同 GPU 上高效分配多个专家,同时避免 All-to-All 通信成为瓶颈。

长序列推理:当上下文窗口突破 128K、1M Token 时,KV Cache 的管理和注意力计算都面临根本性挑战。Ring Attention、Striped Attention、State Space Model 等新架构正在探索中。

一体化推理芯片:Groq LPU、Cerebras WSE 等专用芯片通过架构创新大幅提升推理吞吐量。Groq 的确定性数据流架构在 Llama-2-70B 上实现了 253 Token/s/用户的惊人速度。

多模态推理:GPT-4V、Gemini 等多模态模型引入图像/视频输入,视觉编码器的推理成本是文本的 100 倍以上,这带来了新的优化维度。

总结

LLM 推理优化的核心矛盾是「有限的 GPU 算力/显存 vs 极高的计算需求」。PagedAttention 化解了显存碎片、Continuous Batching 打破了同步等待、量化降低了数据搬运量、投机采样利用了算力冗余、FlashAttention 优化了注意力 IO。这些技术相互叠加,共同将推理成本从最初的数美元/千 Token 降到了几美分/千 Token,使 AI 的大规模商用成为可能。对于工程师而言,理解每一层优化的原理比调参更重要——只有明白了「为什么快」,才能在面对新瓶颈时找到正确的优化方向。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部