1. Prefix Caching核心原理剖析
在大规模语言模型推理场景中,Prefix Caching(前缀缓存)是一种显著提升推理效率的关键技术。其核心思想是利用自然语言生成任务的序列特性——当多个请求共享相同的前缀文本时,可以复用这些前缀对应的KV Cache(键值缓存),避免重复计算。
1.1 技术实现机制
vLLM实现Prefix Caching的核心数据结构是BlockHash链式结构。每个缓存块(block)存储时会被赋予一个基于内容生成的哈希值,这个哈希值具有以下特性:
-
内容敏感性:哈希值由块内token内容和前驱块的哈希共同决定,数学表达为:
code复制hash_i = H(hash_{i-1} || tokens_i)其中
H是哈希函数,||表示连接操作。这种链式结构确保只有完全相同的token序列才会产生相同的哈希值。 -
块级粒度:vLLM以固定大小的块(block)为单位管理缓存,典型配置为16或32个token一个块。这种设计平衡了内存局部性和管理开销。
-
多模态支持:通过
generate_block_hash_extra_keys()函数处理图像等非文本输入的哈希计算,使技术能适配多模态场景。
1.2 缓存检索流程
当新请求到达时,系统执行以下检索逻辑(对应get_computed_blocks()函数):
-
哈希序列生成:首先为请求的prompt生成每个块的哈希序列。例如对于prompt "The quick brown fox",假设块大小为3,则生成:
code复制[H(null,"The"), H(H1," qu"), H(H2,"ick"), ...] -
最长前缀匹配:通过
find_longest_cache_hit()在哈希空间查找最长匹配路径。例如已有缓存"The quick"对应的哈希链[H1,H2],新请求"The quick brown"的[H1,H2]部分可直接复用。 -
边界处理:即使全部token命中缓存,最后一个token仍需重新计算以获得logits(`max_cache_hit_length = num_tokens
