vLLM学习整理

学习材料:https://docs.vllm.ai/en/latest/design/arch_overview

一、vLLM整体架构

二、PageAttention

原理

问题:传统KV Cache为了保证连续存储,需要预留较大连续地址空间,导致显存利用率不高。

解决思路:借鉴虚拟内存分页管理的思想:每个进程都在虚拟地址中运行,虚拟地址通过MMU映射对应具体的物理地址。

方法

将KVCache按block单位(vLLM中默认16),拆分成多份,存储在逻辑block块中;维护一个虚拟block到物理block的映射表,该表主要内容包括:逻辑块id到物理块id的映射关系 和 每个块已经使用的数量。

  • 在Prefill阶段,根据prompt长度申请连续的逻辑块,并将其映射到不要求连续的物理块中。然后计算得到kv值存入其中。(逻辑连续,物理不连续)
  • 在Decode阶段,读取KV Cache (看起来是连续的逻辑块,背后映射到了不连续的物理块中)进行attention运算。新生成的KV Cache填入到连续的逻辑块中;如果当前的逻辑块已满,则vLLM会开辟新的逻辑块,并更新映射表。

Prefix Caching

这样KV Cache的存放就非常灵活,引出Prefix Caching(前缀缓存)机制,每个逻辑块存满后会计算一个Hash值,该值由自身token和前一个块的hash值产生;当hash值相同时则共用一组物理块,并引用计数+1。当释放时则-1,只有到0时才释放物理块。

Swapping

当多个请求导致物理块全部用完时,vLLM会根据FCFS策略,将优先级低的请求的所有逻辑块swap到cpu或者磁盘上。等GPU显存充分时再加载回来。

分布式TP并行

在TP场景下每张卡输入的token是一样的,只是按head切分后每张卡计算得到对应head的KV Cache。所以每张卡维护各自的逻辑块-物理块的映射关系即可。

评论