vllm的pageattention到底是怎么回事?
pageattention 经常听到的就是有两大优点一个是减少 内存块浪费另一个方面就是 减少内存碎片。这两点 主要就是克服了传统分配方式的痛点特别是传统方法都是连续存储而这个方法建立了一个block table 能够查表找到存储位置即逻辑上是连续的物理存储上是随机的。传统的方法一个是对某个请求静态分配一个很大的token_length这种对于很简单的请求的时候就会造成大量的空间浪费因为还有很多没用到嘛。还有一种方法 就是动态分配token长度 一种方法就是有多长就分配多长。 但是有个弊端就是对于模型来说有可能同时有多个请求进行并发的操作就像开多个窗口进行提问。这就会使得原本分配空间是 [AAA][BBBB]此时[A...],[B...]相当于两个不同的请求框内内容同时请求后就会在decoder的时候会生成新的token这样的话A请求继续扩展就不行了因为下一个位置存的B请求的token所以一般的操作就是预先对 各个请求多分配一些空间 即 [AAA_ _ _][BBBB_ _ _ _ _]这的弊端就也一样导致资源可能浪费很多还有另一种方法就是将空间不够的请求A重新一起复制到新的位置空间进行扩展。 但这也有一个很明显的弊端就是搬移大量数据时候的成本和时延磨损等。而pageattention是怎么解决这个问题的呢有两个关键的点一个是 将一个请求分配n个block每个block 的token数量相对比较小这样一个请求可能就存成了多个block而不是静态分配一样存在一大张存储空间中而这个block 并不是连续的 哪里有对应block大小的空间都可以被分配这就减少了存储空间碎片了。 它能把不连续的block利用起来的原因就是它是把存储池挨着挨着编码 为block 123...这样分配给A的需要多少就在A的block表中写对应的block标号就行 例如block table[3, 17, 8, 25, 41]逻辑顺序 0~4对应这 5 个物理块。综上就可以看出pageattention 就算浪费也只是浪费最后一个block-1大小的存储空间从而节省空间另外其存储并不要求连续且把存储空间切割成多个可以独立出来的小块这样也避免了存储碎片。