3. 大模型推理基础
大模型推理(Inference)与训练在计算模式上有着本质区别。训练阶段是前向传播与反向传播的反复迭代,而推理阶段则是一次前向传播的“快照”,其核心目标是在满足延迟(Latency)和吞吐量(Throughput)约束的前提下,尽可能高效地利用GPU资源。要深入理解DeepSpeed推理引擎的优化策略(如内核融合、张量并行、显存优化),首先必须透彻理解Transformer的解码机制、自回归生成的过程瓶颈,以及KV Cache这一“空间换时间”的核心技术。本章将系统梳理这些基础概念,并建立衡量推理性能的关键指标体系。
上图展示了本章的核心知识框架:自回归生成是推理的基本逻辑,KV Cache 是决定推理效率的关键工程手段,而延迟与吞吐量则是衡量系统性能的最终标尺。DeepSpeed 的所有优化技术,本质上都是在围绕这三者进行权衡与改进。
3.1 Transformer 架构与推理视角的重新解读
Transformer 架构(Vaswani et al., 2017)由编码器(Encoder)和解码器(Decoder)组成。但在生成式大模型(如 系列、LLaMA、Qwen)中,我们通常只使用解码器部分,并采用“因果掩码”(Causal Mask)确保每个位置只能关注到它之前的 。从推理的角度看,Transformer 解码器层可以简化为两个核心子层:自注意力(Self-Attention)和前馈网络(FFN)。
在推理过程中,每个 的向量表示需要依次经过这两个子层。自注意力机制的计算公式为:
Attention(Q, K, V) = softmax(Q × K^T / √d_k) × V
其中,Q(Query)、K(Key)、V(Value)均由输入向量与对应的权重矩阵相乘得到。在训练阶段,所有 的 Q/K/V 可以并行计算;但在推理阶段,由于自回归特性,我们只能逐个生成 ,这导致计算模式发生了根本变化。
3.2 自回归生成:逐个 的串行过程
自回归生成(Autoregressive Generation)是指模型将自身输出的 作为下一步的输入,循环迭代直到满足终止条件。这个过程可以拆分为两个阶段:
- Prefill(预填充)阶段:处理用户输入的 Prompt,并行计算所有输入 的 K/V 值,并生成第一个输出 。此阶段计算密集,GPU 利用率较高。
- Decode(解码)阶段:逐个生成后续 。每步仅输入一个 ,但需要与缓存中的所有 K/V 进行注意力计算。此阶段内存带宽受限,GPU 利用率通常较低。
这种串行特性决定了推理延迟的构成:TTFT(Time To First )主要由 Prefill 阶段决定,而TPOT(Time Per Output )则由 Decode 阶段决定。在实际部署中,我们通常希望 TTFT 尽可能短(用户等待首字响应),同时 TPOT 保持稳定(避免生成卡顿)。
| 阶段 | 输入规模 | 计算特征 | 瓶颈 | 对延迟的影响 |
|---|---|---|---|---|
| Prefill | 整个 Prompt(如 512 ) | 矩阵-矩阵乘法(GEMM),并行度高 | 计算吞吐(FLOPs) | 决定 TTFT |
| Decode | 单 (逐步) | 矩阵-向量乘法(GEMV),并行度低 | 内存带宽(显存读取) | 决定 TPOT 和整体生成时长 |
理解这两个阶段的差异至关重要,因为 DeepSpeed 推理引擎会针对不同阶段采用不同的优化策略。例如,在 Prefill 阶段使用更大的 Batch Size 以提高计算效率,而在 Decode 阶段则通过内核融合减少内存访问次数。
3.3 KV Cache:空间换时间的核心工程
KV Cache 是推理优化中最基础也是最重要的技术。它的核心思想是:在 Prefill 阶段计算并存储所有历史 的 K 和 V 矩阵,在 Decode 阶段直接复用,避免重复计算。
KV Cache 的显存占用可以精确计算:
显存占用(字节) = 2(K 和 V) × 层数 × 注意力头数 × 头维度 × 序列长度 × 精度字节数
以 LLaMA-7B 模型为例(32 层,32 个头,头维度 128,FP16 精度),当序列长度为 2048 时:
KV Cache 大小 = 2 × 32 × 32 × 128 × 2048 × 2 字节 ≈ 1.07 GB
这意味着,仅 KV Cache 一项就可能占用接近模型权重(约 14GB)的显存。对于长序列或大并发场景,KV Cache 的管理成为显存规划的核心挑战。
DeepSpeed 在 KV Cache 管理上提供了多种优化手段,包括:
- KV Cache 量化:将 FP16 的 K/V 值量化为 INT8,显存占用减半,但需注意精度损失。
- Paged KV Cache:借鉴操作系统虚拟内存的分页思想,将 KV Cache 分块存储,减少显存碎片。
- KV Cache 卸载:将不常用的 KV Cache 临时卸载到 CPU 内存,为新的请求腾出 GPU 显存。
3.4 推理延迟与吞吐量:性能的度量衡
在评估推理系统性能时,我们通常关注以下核心指标:
| 指标 | 定义 | 测量方式 | 优化目标 |
|---|---|---|---|
| TTFT | 从请求发出到收到第一个 的时间 | 客户端记录请求时间与首包到达时间差 | 越小越好,通常要求 < 500ms |
| TPOT | 生成每个输出 的平均时间 | 总生成时间 / 输出 数 | 越小越好,通常要求 < 100ms |
| 吞吐量 | 系统单位时间内处理的 数或请求数 | 总 数 / 总时间 或 请求数 / 秒 | 越大越好,体现系统整体效率 |
| 并发数 | 系统同时处理的请求数量 | 监控系统活跃请求数 | 在延迟约束下最大化并发 |
延迟与吞吐量之间存在天然的矛盾:增加 Batch Size 可以提高吞吐量,但会延长每个请求的排队时间和计算时间,导致延迟上升。DeepSpeed 推理引擎通过动态批处理(Dynamic Batching)和连续批处理(Continuous Batching)技术,在两者之间寻找最优平衡点。
3.5 案例拆解:一个 7B 模型的推理性能分析
假设我们使用单张 A100-80GB GPU 部署 LLaMA-7B 模型,输入 Prompt 长度为 512 ,期望输出 1024 。我们通过实际测量得到以下数据:
- Prefill 耗时:180ms(TTFT = 180ms)
- Decode 阶段:共 1024 步,总耗时 8.2 秒,平均 TPOT = 8ms
- 总延迟:180ms + 8200ms = 8380ms
- 吞吐量:1024 / 8.38s ≈ 122 /s
通过分析,我们发现 Decode 阶段占据了 97.8% 的时间。进一步使用 nsys 或 ncu 性能分析工具,发现 GPU 的 SM(流式多处理器)利用率仅为 35%,而显存带宽利用率达到 85%。这证实了 Decode 阶段是内存带宽瓶颈。
针对此问题,我们采用 DeepSpeed 的 kernel_injection 策略,将 QKV 投影和注意力计算融合为单个内核,减少显存读写次数。优化后,TPOT 从 8ms 降至 6.2ms,总延迟降至 6.5 秒,吞吐量提升至 157 /s,提升约 28%。
3.6 常见误区与总结
在理解大模型推理基础时,以下误区需要特别警惕:
- 误区一:将训练时的 Batch Size 直接用于推理。训练时大 Batch 有利于梯度计算,但推理时大 Batch 会显著增加 KV Cache 显存占用和 Decode 延迟,需要重新调优。
- 误区二:忽略 Prefill 阶段的影响。虽然 Prefill 时间占比小,但对于交互式应用(如聊天机器人),TTFT 直接影响用户体验。优化 Prefill 通常需要减少 Prompt 长度或使用更高效的注意力实现(如 FlashAttention)。
- 误区三:认为 KV Cache 越大越好。KV Cache 本质是“空间换时间”,但显存是有限资源。当 KV Cache 占用超过可用显存时,系统会触发显存交换或重新计算,反而增加延迟。合理的做法是设置最大序列长度和最大并发数,控制 KV Cache 总量。