优化大型语言模型性能:并发请求的预填充与解码
执行摘要
优化大型语言模型(LLM)性能需要管理 预填充阶段(处理输入提示)和 解码阶段(生成后续 token)之间的根本差异。通过实现连续批处理和分块预填充,开发者可以最大化 GPU 资源利用率,并显著提升总 token 吞吐量——TNG 在标准 vLLM 部署中使用分块预填充观察到吞吐量提升了 50%。
Token 生成的两个阶段
LLM 以自回归方式生成文本,这意味着每个新 token 都依赖于所有前面的 token。该过程被划分为两个不同的计算阶段:
预填充阶段
- 功能:通过处理所有输入提示 token 来计算第一个输出 token。
- 计算特性:高度并行且 GPU 计算密集。由于所有输入 token 在开始时已知,模型可以一次性计算整个提示的键和值向量。
- 关键指标:以 Time to First Token (TTFT) 为衡量。
解码阶段
- 功能:逐个计算每个后续 token。
- 计算特性:顺序执行且受内存带宽限制。每个 token 只需计算一组键和值向量,但模型必须在每一步从 GPU 内存访问权重和键值(KV)缓存。
- 关键指标:以 Time Per Output Token (TPOT) 为衡量。
资源利用率与吞吐量
GPU 利用率在这两个阶段之间差异显著。单个长提示的请求在预填充阶段可以使 GPU 计算能力饱和。相反,单个请求的解码阶段几乎不使用计算资源,这意味着通过将多个请求批处理在一起以填满 GPU 的计算容量可以提升吞吐量。
吞吐量通常在低并发水平(内存受限阶段)时随并发线性增长,直至 GPU 计算能力饱和(计算受限阶段),此时吞吐量保持不变,无论并发进一步增加。
并发处理策略
推理引擎使用不同的批处理策略来处理同时到达的多个请求,每种策略在延迟和效率之间有不同的权衡。
静态批处理
静态批处理将请求分组为固定批次,处理直到批次中最长的请求完成后才开始新批次。
- 优势:优化 TPOT,因为解码阶段不被中断。
- 劣势:资源利用率极低,且可能导致非常高的 TTFT,因为新请求必须等待整个前批次完成。
连续批处理(预填充优先)
连续批处理会立即移除已完成的请求并插入新请求。“预填充优先”策略在新请求到达时立即安排预填充。
- 优势:通过立即处理新请求来最小化 TTFT。
- 劣势:会中断已有请求的解码阶段。由于预填充操作占据 GPU 执行时间的大部分,解码阶段的并发请求可能在一次大型预填充的整个期间只能生成一个 token,导致流式输出出现“暂停”。
分块预填充
分块预填充将输入提示拆分为更小的块,分布在多个步骤中。这使得在预填充过程中可以进行多个解码步骤。
- 优势:通过并行运行计算密集型预填充和内存受限的解码,最大化资源效率。这通过防止 token 生成的完全暂停来降低平均 TPOT。
- 影响:TNG 报告称,在标准 vLLM 部署中使用分块预填充可实现 总 token 吞吐量提升 50%。
- 权衡:会导致 TTFT 略有增加,并需要调节块大小(通常在 512 到 8192 token 之间),以平衡 TTFT 与 TPOT 的优先级。