在大型语言模型推理中,Key-Value (KV) Cache 会占用大量的 GPU 显存。由于生成的长度未知,传统框架会预先分配最大长度的连续内存块,导致严重的内存碎片化(内部碎片和外部碎片),显存利用率通常只有 20%-40%。
vLLM 受到操作系统虚拟内存的启发,提出了 PagedAttention:
在计算 Attention 时:
# 伪代码:基于块的 Attention 计算 def paged_attention(query, key_cache, value_cache, block_table): out = [] for logical_block_idx in range(num_blocks): physical_block_idx = block_table[logical_block_idx] k_block = key_cache[physical_block_idx] v_block = value_cache[physical_block_idx] # 计算块内 attention out.append(compute_attention(query, k_block, v_block)) return aggregate(out)
这种方法使得内存碎片降低到接近 0(只有最后一个 Block 可能没填满),同时通过写时复制 (Copy-on-Write) 支持了 Beam Search 等解码算法的高效内存共享,吞吐量比 HuggingFace Transformers 提升了最高 24 倍。