技术指南

分类预填充和解码服务

一种服务架构,将大型语言模型推理分为两个独立的阶段——预填充和解码——并在不同的 GPU 池上运行它们。

阅读时间:2分钟最后更新

概述

It matters because these two phases have opposite hardware appetites, and forcing them onto the same machines wastes capacity and hurts latency.

深入探讨

当法学硕士回答时,它分两个阶段进行。 Prefill 一次性读取整个提示并构建键值(KV)缓存;这是一个巨大的、并行的、受计算限制的突发,使 GPU 的数学单元饱和。然后,解码一次生成一个令牌,每一步都会读取整个 KV 缓存——内存带宽受限、计算量较轻的细流。一起运行时,长预填充会拖延每个人的解码(队头阻塞),并且对两者进行批处理会产生干扰。分解将预填充放在一个 GPU 池上,并在另一个 GPU 池上进行解码,通过 NVLink 或 InfiniBand 等快速互连在它们之间传输 KV 缓存。每个池都经过独立调整和扩展,提高了吞吐量,平滑了尾部延迟,并让操作员同时达到了严格的第一个令牌时间和每个输出令牌时间目标。

技术洞察

这两个阶段的瓶颈不同。 Prefill 并行处理所有提示标记,因此它的 FLOP 会随着提示长度而缩放,并且会最大化张量核心。解码是自回归的:每个新令牌都需要一次前向传递,从 HBM 重新读取完整的 KV 缓存,因此吞吐量由内存带宽而不是计算来控制。分解通过调整大小、批处理甚至为每个池选择不同的并行性来利用这一点,然后将 KV 缓存从预填充工作线程传送到解码工作线程。

战略影响

成本与预算

多年来,架构决策决定着性能和运营成本。

更清晰的判决

技术教育帮助团队选择正确的堆栈,而不仅仅是最新的堆栈。

质量控制

更好的工程选择可以减少生产中的可靠性事故。

分类预填充和解码服务的未来

预计分解将成为生产堆栈中的默认设置。 DistServe、Splitwise 和 Mooncake 等系统使其普及,而 vLLM 和 NVIDIA Dynamo 现在提供分类模式。研究正在推动 KV 缓存传输优化、跨请求的缓存池和重用、流量变化下预填充/解码比率的动态重新平衡,以及与前缀缓存和分块预填充的更紧密集成。随着上下文窗口增长到数百万个令牌,分离这些阶段对于经济高效、低延迟的服务变得越来越重要。

现实世界的实施

聊天助手将长文档提示路由到计算量大的预填充集群,然后从内存优化的解码集群流式传输回复,以保持打字延迟平稳。

NVIDIA Dynamo 和 vLLM 允许操作员部署单独的预填充和解码工作组,因此突发的长提示不会冻结后续的生成。

Mooncake(由 Moonshot AI 的 Kimi 使用)分解了预填充和解码,并添加了分布式 KV 缓存池以大规模减少冗余的即时重新计算。

代码完成服务专用于短提示的小型预填充池和大型解码池,因为大部分成本来自流式传输许多输出令牌。

风险与防护栏

优化一项基准测试可以隐藏更广泛的系统弱点。

基础设施和维护成本常常被低估。

随着系统变得更加复杂,安全性和可观察性差距可能会扩大。

实施路线图

1

在实施之前定义延迟、质量和成本目标。

2

在实际负载和数据条件下进行基准测试。

3

仪器监控错误、漂移和用户影响。

4

在扩展之前准备回滚和事件响应路径。

不断探索

Free newsletter

Get the daily AI briefing

Three verified AI stories every weekday morning, written in plain English. Free forever, no ads.

One email each weekday. Unsubscribe in one click. We never sell or share your address.

Test yourself

Take the Disaggregated Prefill and Decode Serving quiz

Instant feedback on every answer, and a shareable certificate with a verifiable ID once you pass a course.

开始测验

Support free AI education. AI Understanding is a 501(c)(3) nonprofit — no ads, no paywall, ever. Make a donation

下一个指南

Kubernetes 上的 KServe 和模型服务

常见问题

What is Disaggregated Prefill and Decode Serving?

一种服务架构,将大型语言模型推理分为两个独立的阶段——预填充和解码——并在不同的 GPU 池上运行它们。这很重要,因为这两个阶段具有相反的硬件需求,将它们强制到同一台机器上会浪费容量并损害延迟。

将预填充和解码分离到不同 GPU 池的核心硬件原因是什么?

预填充并行处理整个提示并使计算饱和,而解码每一步都会读取 KV 缓存,并受到内存带宽的限制,这与需要单独、独立调整池的需求相反。

哪些数据结构必须从预填充工作器传输到解码工作器?

Prefill为提示构建KV缓存;解码需要该缓存继续生成,因此缓存通过快速互连传送到解码池。

在共享 GPU 设置中,分解具体可以减少哪些问题?

在共享 GPU 上,长预填充突发可能会阻止正在进行的解码步骤;将它们分开可以防止干扰并稳定尾部延迟。

为什么预填充可以积极地进行批处理,但解码却可以从不同的调整中受益?

Prefill 一起处理所有提示标记,因此较大的批次可以很好地填充张量核心;解码一次生成一个令牌并由内存门控,因此它的扩展方式不同。

通常使用哪些互连在分解池之间移动 KV 缓存?

需要像 NVLink(节点内)和 InfiniBand(节点间)这样的高带宽、低延迟链路,这样 KV 缓存传输就不会成为新的瓶颈。