TiffanyBlews's Blog

我们所经历的每个平凡的日常,也许就是连续发生的奇迹。

LLM Infra 学习笔记

以下内容来自这篇 ICML 的综述 tutorial

LLM Infra 深度学习笔记:从算法到系统

第一部分:核心挑战与技术全景

核心矛盾: LLM Serving 面临的主要挑战是显存墙(Memory Wall)计算墙(Compute Wall)。Transformer 的自回归生成机制导致了内存受限(Memory-bound)的特性,特别是在长序列场景下 。

优化分类体系 (Taxonomy):
目前的优化技术主要分为两大类 :

  1. 算法创新 (Algorithmic Innovations): 修改模型结构或解码过程。
  2. 系统优化 (System Optimizations): 改进底层系统(内存、调度、内核),不改变模型语义。

第二部分:算法创新 (Algorithmic Innovations)

这一层面的优化旨在通过“更聪明的计算”来减少工作量。

1. 解码算法 (Decoding Algorithm)

传统的自回归解码(Auto-regressive)需要逐个生成 Token,速度受限于串行依赖。

  • 投机解码 (Speculative Decoding/Inference):
    • 原理: 利用一个小模型(Draft Model)快速生成多个候选 Token,然后由大模型(Target Model)并行验证。打破了串行依赖,因为验证过程是并行的 。
    • 代表工作:
      • SpecInfer: 基于树(Tree-based)的推测,生成 Token Tree 进行并行验证 。
      • Medusa: 不使用独立小模型,而是在大模型上增加额外的 Head 来预测后续 Token,已被 TensorRT-LLM 集成 。
    • 效果: 在不牺牲准确性的情况下,推理性能提升 2-3 倍 。
  • 非自回归解码 (Non-autoregressive Decoding): 尝试一次性并行生成所有 Token,但在 Token 依赖关系强的场景下,准确性不如自回归 。
  • Early Exiting (早期退出): 对于简单的 Token 生成,不需要跑完所有 Transformer 层,通过中间层的分类器提前输出,减少计算量 。

2. 架构设计 (Architecture Design)

针对 Transformer 结构的固有瓶颈进行改造。

  • Attention 简化与 KV Cache 优化:
    • MQA (Multi-query Attention) & GQA (Group-query Attention): 多个 Query Head 共享一组 Key/Value Head,显著减少 KV Cache 的显存占用和加载量 。目前 LLaMA-2, Falcon 等均采用此方案。
    • Sliding Window / StreamingLLM:
      • 发现: 起始 Token(Attention Sinks)对语义贡献最大,必须保留。
      • 机制: 保留起始 Token 和最新的滑动窗口 Token,丢弃中间部分。这使得模型可以处理无限长的流式输入,且计算量不随长度增加 。
  • 混合专家模型 (MoE, Mixture of Experts):
    • 原理: 条件计算(Conditional Computing)。将模型拆分为多个 Experts,每个 Token 经由 Router 只激活部分 Expert。
    • 优势: 在增加参数量(提升模型容量)的同时,保持推理时的计算量(FLOPs)不变 。
    • CoE (Combination of Experts): SambaNova 提出的架构,相比 MoE 具有更大的扩展性,旨在降低训练成本 。
  • 线性 Attention 与 RNN 变体: 试图打破 $O(L^2)$ 复杂度,如 Mamba (SSM), RWKV, RetNet 。

3. 模型压缩 (Model Compression)

  • 量化 (Quantization):
    • Weight-only: 仅量化权重(如 GPTQ, AWQ),保留激活为 FP16,适合显存受限场景 。
    • Weight + Activation: 同时量化权重和激活(如 SmoothQuant W8A8),适合计算密集型场景 。
    • 挑战: 激活值的异常值(Outliers)使得量化比权重更难 。
  • 剪枝 (Pruning): 结构化剪枝(Structured Pruning)如 LLM-Pruner,移除整行/列或 Head,便于硬件加速 。

第三部分:系统优化 (System Optimizations)

这一层面的优化旨在通过“更高效的工程”来压榨硬件性能。

1. 显存管理 (Memory Management)

显存是 LLM 推理的核心瓶颈,尤其是 KV Cache。

  • PagedAttention (vLLM 核心技术):
    • 问题: 传统 KV Cache 预分配连续显存,导致严重的内部碎片(Internal Fragmentation)和显存浪费 。
    • 方案: 借鉴操作系统的虚拟内存(Virtual Memory)分页思想。将 KV Cache 切分为非连续的 Blocks,按需分配。
    • 收益: 极大地提升了显存利用率,从而允许更大的 Batch Size,显著提高吞吐量 。

2. 请求调度 (Request Scheduling)

  • Continuous Batching (Orca 核心技术):
    • 问题: 传统 Static Batching 必须等待 Batch 中最长的序列生成完,短序列才能返回,导致 GPU 空转 。
    • 方案: 迭代级调度(Iteration-level scheduling)。一个序列生成结束(遇到 EOS)立即移出,新请求立即加入 Batch,无需等待整个 Batch 结束 。
    • 现状: 已被 vLLM, TensorRT-LLM, RayLLM 等所有主流框架采用 。

3. 内核优化 (Kernel Optimization)

  • FlashAttention (v1 & v2):
    • 原理: IO 感知(IO-aware)。利用 GPU 的 SRAM(高速缓存)进行分块计算(Tiling),减少与 HBM(显存)之间的数据搬运次数。将复杂度从 $O(N^2)$ 的内存访问优化为线性 。
  • FlashDecoding:
    • 场景: 针对长序列(Long Context)生成阶段的优化。
    • 原理: 在 Sequence Length 维度进行并行计算(Split-K),解决 Batch Size 较小时 GPU 利用率不足的问题 。
  • FlashDecoding++: 进一步引入异步 Softmax 和硬件资源优化 。

4. 并行计算 (Parallel Computation)

当单卡显存不足以放下模型时,需要分布式推理。

  • Tensor Parallelism (TP): 切分模型层内部(如矩阵乘法),粒度最小,通信频繁,通常用于单机多卡(NVLink 环境) 。
  • Pipeline Parallelism (PP): 将模型按层切分到不同设备,流水线执行。通过微批次(Micro-batches)减少气泡 。
  • Sequence Parallelism (SP) / Context Parallelism: 针对超长序列,将序列切分到不同设备。Megatron 的实现结合了 Ring Attention 。

第四部分:训练基础设施 (Training Infra)

虽然重点是 Serving,但掌握 Infra 必须了解训练侧的演进 。

  1. Megatron-LM 演进史:
    • 第一代: 引入 Tensor Parallelism (TP) 和 Model Parallelism 。
    • 第二代: 协同优化 TP, PP, DP。优化了 Pipeline 的气泡 。
    • 第三代: 支持 Sequence Parallelism,并实现了选择性重计算(Selective Recomputation),即只重算计算量小但占显存大的激活值 。
  2. DeepSpeed:
    • ZeRO (Zero Redundancy Optimizer): 核心特性。去除数据并行中的显存冗余。
    • Offloading: 将计算或存储卸载到 CPU/NVMe,降低显存门槛 。

第五部分:主流框架对比与选型

根据 和 的分析:

框架 核心技术 显存管理 调度策略 适用场景
vLLM PagedAttention Block-level (Paged) Continuous Batching 高吞吐量要求、易用性要求高的场景。社区最活跃。
TensorRT-LLM In-flight Batching, Tensor Core 优化 PagedAttention In-flight Batching NVIDIA 官方,追求极致性能(FP8, Kernel 优化),但在定制化上门槛较高。
LightLLM Token-level memory Token-level Token-level 更加细粒度的显存管理,适合学术研究。
FlexFlow-Serve SpecInfer - - 专注于低延迟,利用 SpecInfer 进行投机解码。
DeepSpeed-MII ZeRO-Inference - - 适合多节点大规模模型推理。

第六部分:总结与关键知识点速记

  1. 为什么要做 LLM Infra? 解决显存不够(存不下)和计算太慢(等太久)的问题。
  2. 显存优化两大神器: PagedAttention(解决碎片化,提升 Batch Size)、Quantization(W8A8/W4A16,降低显存占用)。
  3. 速度优化两大神器: FlashAttention(减少 IO 访问)、Speculative Decoding(打破串行依赖)。
  4. 调度优化核心: Continuous Batching(随进随出,不留空转)。
  5. 未来趋势: 软硬协同(FP8 硬件支持)、长窗口优化(FlashDecoding, Sequence Parallel)、投机推理的普及。