理解vllm

0 阅读2分钟

KV Cache问题

image.png

Transformer架构的self attentin机制,在LLM推理过程中,每一个token都需要与前面的token做注意力机制:

  • “非常”,需要用自己的Q向量与“中国”,“的”,“历史”的K向量查询,得到注意力权重
  • 然后通过对“中国”,“的”,“历史”,“非常”的V向量计算加权求和,得到自己的输出

这里前三个token的K,V是已经计算过的,并且它们的值不受新的Token的影响,所以KV可以缓存,以提高推理速率。

image.png

以13B的模型为例:

  • 参数占用25GB显存
  • KV Cache占用12GB显存

但实际上KV Cache的利用率只有20-40%,存在大量浪费。浪费原因主要如下:

  • KV Cache预分配。因为LLM并不知道需要多少KV Cache空间,所以一般以请求的max_token来分配。但每次请求达到max_token的情况是很少的;
  • 即使输出达到了max_token,在输出第一个token的时候,对应的max_token的显存空间也已经提前占用了,其他并发请求无法复用;
  • 缓存碎片。根据不同的输入prompt,对应的KV cache空间也不同。这会造成一个现象,比如第一个短prompt的请求已经推理完毕,对应KV cache空间释放,但释放出来的显存空间不足以给下一个长Prompt的请求使用,造成了缓存空间的碎片堆积;

vllm对KV cache的优化 - page attention

image.png

vllm将显存按照block划分,每个block为4个token。生成的KV会被填入block里,block本身在物理内存中可以是不连续的。当有新的token生成时,它们的token会被继续填入未被填满的block中:

image.png

所以实现了,按需分配,无需提前分配,减少了缓存碎片,最大的碎片浪费即为3个token。缓存利用率可以提升到96%。

vllm对KV cache的优化 - KV Block共享

image.png

在这种情况下,输入的prompt可以共享kv cache,只存储一份即可。