面试记录:KVCache、vLLM拟解决的问题

前言

这道题目相对来说简单一些,考验的是KVCachevLLM的实现原理。

KVCache

在一些博客中,我们能看到,KVCache有一大堆的计算流程。这里也就不再重复说明了,本质上来说,就是证明了:

生成式AI中,下一个token的生成仅依赖上一个token信息。这也就意味着,计算下一个token的时候,非常依赖于上一个token的计算结果,尤其是其中的QK

而当有了KVCache之后,之前计算过程中保存的QK就可以直接从缓存中获取,从而大大节省了计算量。也就是说,本质上还是用缓存减少计算量的特点,也就是通过空间换时间,用命中率代替计算量。

但在这里有一点需要明确的是,这一项确实有命中率的概念,但是命中率并不是最终的目标,因为核心目标只是希望预测下一个token的时候减少计算量,命中率是最终的现象。

vLLM

虽然说这个计算没有说很复杂,但由于计算量极大,因此需要vLLMPageAttention提供加速支持。

那么,vLLM又是做了什么事情呢?

首先,vLLM将所有的KVCache都分割为固定的块,每个块占据显存的一个部分,然后使用虚拟内存将离散存储的物理块映射到连续存储的逻辑块。

如果你有计算机基础的话,你会发现,这种管理方式与计算机原理中的分页表有着相似之处,只是管理的项并不是内存,而是显存。

所以,很明显,一个线程原本应当占据一整块存储空间,因为分页表机制,这个整块的存储空间被分割到多个物理存储空间中,但是又从逻辑上拼接为一个连续的存储空间。一方面,线程所需存储空间的分配更为灵活。同时,更为灵活的存储空间分配,减少了存储空间零散空余的问题,大幅提升了存储空间的利用率。

于是,回到vLLM,他所解决的问题也就非常明显:批处理计算过程中的显存碎片问题。

这里更需要注意一点,显存碎片问题与命中率基本上没有什么关系,所以不能往命中率上思考。