Illustration comparing Memory management within the operating system and in LLM using vLLM[2] PagedAttention将KV Cache划分为固定大小的物理页,每个物理页存储一定数量token的KV向量(如4或3个token)。与传统框架需要为每个请求预留连续显存空间不同,vLLM允许不同请求的KV Cache分布在非连续的物理页中,通过逻辑块与物理块的映射表实现高效访问。
在prefill阶段,vLLM仅分配必要的物理页,而非预先为整个序列预留最大长度空间。例如,一个7 token的输入会被分配到两个物理页(前4 token和后3 token)。这种按需分配的策略避免了传统方法中大量未使用的预留空间,将显存浪费限制在单页内,显著提高了显存利用率。
在生成阶段(decode阶段),PagedAttention算法通过物理页索引计算当前token与所有历史token的注意力。虽然KV Cache分布在多个非连续物理页中,但通过页表映射,模型仍能访问完整的上下文信息。这种机制保证了自注意力的连续性,同时避免了显存碎片化问题。具体来说,当计算新token的注意力时,模型会遍历该请求所有逻辑块对应的物理页,获取所有历史token的KV向量。这种设计使得不同长度的序列可以共享显存页,提高了显存的利用率和灵活性。
当GPU显存不足时,vLLM会采用类似操作系统页面置换的机制,将部分KV Cache页交换到CPU内存中。这种Swap机制允许系统在显存紧张时,主动牺牲某些victim sequence的KV Cache,腾出空间供其他序列继续生成。当这些被交换的序列需要继续生成时,再将其KV Cache从CPU内存取回。对于这个场景,这篇文章[3]举了一个很好的例子进行参考。
这种分页机制的优势在于:
显存利用率接近100%,减少了60%-80%的显存浪费
支持长上下文(如128K或10M token)的高效处理
兼容INT4量化等技术,进一步降低显存占用
2. 请求调度与Continues Batching
Continues Batching是vLLM的另一项关键技术,它打破了传统框架"一次推理一个batch直到结束"的模式,以token为最小调度单位,动态合并多个请求的批处理任务,避免GPU空闲等待,提高利用率。
在介绍Continues batching之前,我们先了解一下vLLM服务器执行的一个基本步骤engine_step。vLLM的服务在处理请求时会调用一个叫EngineCoreProc的进程,这个进程会维护一个请求队列并处理请求。在处理请求部分,使用的是一个while循环,伪代码如下所示:
while True:
if not has_request_in_queue():
wait_for_new_request()
engine_step()
可以看到,如果请求队列里有请求的话,就执行engine_step。一个step有两种可能:prefill或decode(生成一个新token)。目前主流大模型基本是Decoder-Only的模型架构,所以在生成某个序列的下一个token时,必须要先计算出这个序列所有的顺序token(例如输入的prompt)的Key和Value,这个阶段就是prefill的阶段,这个阶段由于要连续计算多个token的Q、K、V向量(Query、Key和Value向量),所以是计算密集型的任务。在prefill阶段结束后,开始进行decode阶段,也就是生成序列的下一个token,此时需要之前所有token得Key和Value向量,计算下一个token的Q、K、V向量。目前推理引擎基本都会利用KV Cache的方式将前面的K、V向量进行缓存,避免重复计算,以此提升生成速度。所以在decode阶段主要是高GPU内存缓存需求(访存密集型)的场景,而非计算密集型场景。基于这个基础,目前LLM推理框架例如vLLM和SGLang都推出了对应的prefill-decode分离的功能,主要考虑到prefill和decode对硬件资源的诉求不同,因此将其分离在不同的设备上进行推理,以进一步提升系统的吞吐。
再回到engine_step的运行,在每一个engine_step开始的时候,scheduler组件会决定这个step做什么。V0版的Scheduler会遵循两个规则:
先到的Sequence先处理
Victim Sequences > New Sequences > Running Sequences
1. 企业级模型推理部署工具vllm使用指南 - 部署最新deepseek-v3-0324模型:https://zhuanlan.zhihu.com/p/1914740230273099340
2. Introduction to vLLM and PagedAttention:https://www.runpod.io/blog/introduction-to-vllm-and-pagedattention
3.【AI Infra漫谈系列】揭秘vLLM推理逻辑:https://zhuanlan.zhihu.com/p/697858922
4. vLLM V1: A Major Upgrade to vLLM's Core Architecture:https://blog.vllm.ai/2025/01/27/v1-alpha-release.html
5. 揭秘老黄演讲中关键技术:PD分离!UCSD力作,LLM吞吐量跃升4倍:https://baijiahao.baidu.com/s?id=1827006277573818899&wfr=spider&for=pc
6. Throughput is Not All You Need: Maximizing Goodput in LLM Serving using Prefill-Decode Disaggregation:https://hao-ai-lab.github.io/blogs/distserve/
7. Disaggregated Prefilling:https://docs.vllm.ai/en/stable/features/disagg_prefill.html#development