3、vLLM核心概念:PagedAttention、Continuous Batching、量化与推理优化

要理解vLLM为何能在版本升级中持续获得吞吐提升,首先需要掌握其底层四大核心概念:PagedAttention、Continuous Batching、量化与推理优化。这四个概念并非孤立存在,而是层层递进、相互配合的关系。PagedAttention解决显存碎片化问题,Continuous Batching提升GPU利用率,量化降低显存与带宽压力,而推理优化则从算法与算子层面进一步压榨硬件潜力。本节将逐一拆解其原理,并说明它们如何共同作用于吞吐提升。

3.1 PagedAttention:显存管理的分页革命

传统推理框架在生成每个token时,会为请求预先分配连续的KV Cache(键值缓存)显存块。这种静态分配方式存在两大问题:一是内部碎片——预分配的最大长度往往大于实际生成长度,造成显存浪费;二是外部碎片——不同请求的KV Cache大小不一,导致显存空洞无法被利用。据统计,传统方式下KV Cache的显存浪费可达60%以上。

vLLM借鉴操作系统虚拟内存的分页思想,提出了PagedAttention。它将KV Cache划分为固定大小的物理块(Block),每个块通常存储16个token的键值向量。逻辑上连续的KV Cache可以映射到非连续的物理块中,通过块表(Block Table)维护映射关系。当请求生成新token时,只需按需分配新的物理块,无需预留连续空间。

核心优势:

  • 近零碎片:物理块按需分配,内部碎片仅存在于最后一个块中(平均浪费<1个块大小)。
  • 显存共享:多个请求可以共享相同的物理块(如beam search中的多个候选序列),进一步节省显存。
  • 高吞吐基础:显存利用率提升2-4倍,意味着同一GPU可以并发处理更多请求。
逻辑视图(连续) Block 0 token 0-15 Block 1 token 16-31 Block 2 token 32-47 Block 3 token 48-63 块表映射 物理视图(非连续) 物理块 7 ← Block 0 物理块 2 ← Block 1 物理块 5 ← Block 2 物理块 1 ← Block 3 空闲 空闲 空闲 空闲 请求B 请求B 请求C 请求C 逻辑块可映射到任意物理块,空闲块可被其他请求复用

上图中,逻辑上连续的Block 0-3被映射到物理上分散的块7、2、5、1,而物理块3、4、6等空闲块可分配给其他请求。这种灵活性使得显存利用率大幅提升,为高并发推理奠定了基础。

3.2 Continuous Batching:动态调度提升GPU利用率

传统的静态Batching(Static Batching)将多个请求组成一个批次,等待批次中所有请求都完成生成后才释放资源。由于不同请求的生成长度差异巨大,短请求必须等待长请求完成,导致GPU在等待期间出现大量空闲计算周期。

Continuous Batching(连续批处理)打破了这一限制。它在token级别进行动态调度:每当一个请求完成生成(或达到最大长度),立即从等待队列中取出新请求加入当前批次。这样GPU始终在处理有效计算,消除了批次间的等待空隙。

对比维度 静态Batching Continuous Batching
调度粒度 请求级别(整个序列) Token级别(每步生成)
GPU空闲率 高(等待短请求完成) 低(即时补充新请求)
吞吐量 基线 提升2-3倍
实现复杂度 简单 需要迭代级调度器

vLLM的调度器在每个解码步骤后检查批次状态,将已完成的请求移出,并将排队中的请求加入。配合PagedAttention的按块分配机制,新请求可以立即获得显存块,无需等待连续空间。这种协同设计使得vLLM在长尾请求场景下(如聊天机器人、代码生成)表现尤为突出。

3.3 量化:压缩模型,降低显存与带宽压力

量化是将模型权重和激活值从高精度(如FP16)转换为低精度(如INT8、INT4)的过程。对于LLM推理,量化带来三重收益:

  • 显存减半:FP16(2字节)→ INT8(1字节)→ INT4(0.5字节),模型体积和KV Cache占用同步缩小。
  • 带宽降低:从HBM读取更少字节,缓解内存带宽瓶颈(LLM推理通常是带宽密集型)。
  • 计算加速:INT8/INT4矩阵乘法在支持Tensor Core的GPU上吞吐更高。

vLLM支持多种量化方案,包括GPTQ(训练后量化)、AWQ(激活感知量化)和FP8(8位浮点)。其中AWQ通过观察激活分布,保护对模型输出影响最大的权重通道,在INT4精度下仍能保持接近FP16的准确率。

量化选择建议:

  • 追求极致吞吐且对精度损失不敏感:使用INT4 AWQ或GPTQ。
  • 需要平衡精度与性能:使用INT8或FP8。
  • 注意:量化后需用校准数据集验证模型输出质量,避免出现严重退化。

3.4 推理优化:从算法到算子的全面加速

除了上述三大核心机制,vLLM还集成了多种推理优化技术,它们共同作用于吞吐提升:

  • 算子融合(Kernel Fusion):将多个细粒度算子(如LayerNorm + Residual Add + Activation)合并为单个CUDA Kernel,减少内核启动开销和显存读写次数。
  • CUDA Graph:捕获模型计算图并重放,消除Python调度和PyTorch框架开销,单步延迟可降低30%-50%。
  • 投机解码(Speculative Decoding):使用小型草稿模型(Draft Model)一次生成多个候选token,再由大模型验证。若草稿准确率高,可显著减少大模型的解码步数。
  • 前缀缓存(Prefix Caching):对相同系统提示词(如ChatML模板)的KV Cache进行复用,避免重复计算。

常见误区:

  • 误区1:认为量化是“免费的午餐”。实际上,INT4量化可能导致模型输出质量下降,尤其在数学推理和代码生成任务中。
  • 误区2:将Continuous Batching与Dynamic Batching混为一谈。Dynamic Batching仅在请求级别调度,而Continuous Batching在token级别调度,效果差异显著。
  • 误区3:忽略PagedAttention的块大小配置。块大小过小会增加块表开销,过大则增加内部碎片,需根据平均生成长度调整。

3.5 四者协同:吞吐提升的完整链路

在实际推理中,四个概念形成闭环:量化压缩模型和KV Cache体积 → PagedAttention高效管理KV Cache显存 → Continuous Batching动态填充GPU计算间隙 → 推理优化进一步降低单步延迟。vLLM的版本升级正是围绕这四个维度持续改进——例如新版本优化了块分配算法、改进了CUDA Graph捕获策略、增加了新的量化格式支持,从而在每次升级中带来可观的吞吐提升。