@akshay_pachaar: vLLM 如何避免一个长 prompt 拖慢其他请求:(分块预填充,讲得明明白白)每个 LLM 请求都有两个阶…
摘要
一篇技术解析,介绍 vLLM 的分块预填充(chunked prefill)如何防止长 prompt 阻塞并发的解码请求,涵盖延迟权衡、混合批处理,以及 vLLM V1 中的 `--max-num-batched-tokens` 参数。
查看缓存全文
缓存时间: 2026/10/05 19:37
vLLM 是如何防止一个长 prompt 卡住其他请求的:
(分块预填充(chunked prefill),一次讲清楚)
每个 LLM 请求都包含两个阶段。
Prefill(预填充) 会并行处理完整的输入 prompt。这个阶段计算量很大,会构建请求的 KV cache,并生成第一个输出 token。
Decode(解码) 则逐个生成后续的响应 token。每一步都要反复读取模型权重和 KV cache,因此主要受限于内存带宽。
现在想象一下:请求 A 正在解码并流式输出 token,此时请求 B 携带一个 32K token 的 prompt 到达。
如果没有分块预填充,vLLM 会在一次大块计算中处理完 B 的整个 prompt。在这段时间内,请求 A 无法生成下一个 token,因此它的响应看起来像卡住了。
分块预填充 把 B 的 prompt 拆分成更小的 token 区间。vLLM 可以先处理一个分块,让活跃的请求有机会进行一次解码,然后在后续迭代中继续处理 B 的预填充。
该 prompt 依然会被完整处理,只是不再以一整块的方式独占 GPU。
这就引出了一个重要的延迟权衡。
→ 较小的分块能让活跃的响应持续流动。
它们会更频繁地把控制权交还给调度器,减少对那些已经在接收答案的用户来说的 token 间延迟抖动。
→ 较大的分块能帮助新请求更快启动。
在处理完所有 prompt 分块之前,B 无法生成第一个 token。更大的分块可以用更少、更高效的批次完成这部分工作,通常会改善首 token 延迟(time to first token)。
→ 分块过小会带来额外开销。
后面的分块必须对前面分块产生的 token 状态执行 attention。过度拆分会反复读取更多的 KV cache,可能降低 GPU 利用率。
→ 混合批次可以更充分地利用 GPU。
预填充属于计算密集型,而解码属于内存密集型。将预填充分块与活跃的解码调度在一起,可以让这两类工作在同一次迭代中更高效地共享资源。
不存在通用的最优分块大小。
长 prompt、大量并发请求以及严格的流式输出要求,通常更偏向较小的分块。而那些优先追求首 token 延迟的工作负载,使用较大的分块可能更有优势。
在 vLLM V1 中,--max-num-batched-tokens 控制一次迭代中可以调度多少个 token,它是调节这一权衡的主要配置项之一。
分块预填充并不会减少长 prompt 本身产生的计算工作量。它只是阻止这部分工作去决定其他所有人何时能收到下一个 token。
如果你想了解更多相关内容,我写了关于 LLM 中批处理策略的完整解析。
文章全文摘录如下。
相似文章
@_avichawla:LLM 调度循环,清晰讲解:(收藏这篇)每当用户向 LLM 发送一个 prompt,生成的推……
一篇讲解 LLM 服务调度循环的教学文章,解释推理请求如何经过等待队列、批量构建、prefill、decode 和 continuous batching,使 GPU 在不同请求先后完成时仍保持满载运行。
@_avichawla: LLM推理中的预填充与解码。你是否注意到,LLM的第一个令牌总是需要片刻才出现…
解释LLM推理的两个阶段——预填充和解码,详细说明GPU瓶颈如何从预填充时的计算受限转变为解码时的内存受限,以及KV缓存的重要性。
@athleticKoder:一篇关于LLM推理原理的1600字笔记,涵盖:1. 注意力机制——token交互的唯一场所 2. KV缓存——为何...
一篇详细阐述LLM推理关键概念的推文:注意力机制、KV缓存、分块预填充以及批处理技术,包括vLLM和SGLang中使用的连续批处理。
问题:为什么 vLLM 的预填充速度远超其他推理引擎?
用户分享了基准测试结果,显示 vLLM 的预填充性能显著快于 llama.cpp 和其他引擎,并质疑这种速度差异背后的技术原因。
深入vLLM:高吞吐量LLM推理系统剖析(2025)
深入探讨vLLM用于高吞吐量LLM推理的架构与组件,涵盖调度、分页注意力、连续批处理、高级特性、扩展、服务及基准测试。