上篇讲到了KVcache,KVcache就是将KV对存放到显存中用来加快推理过程的技术。
但是KVcache有一个缺点:如何合理的分配显存?学过操作系统的人肯定都懂,如何合理的分配内存是个大问题,解决方法就是使用分页解决。无独有偶,PageAttention就是参考了OS中的内存分配方法来实现的。
背景
在模型推理时,使用KVcache后需要按照最长prompt分配显存。可能会有三种情况出现:
1. 预分配后没有使用这块显存
2. 预分配后需要使用这块显存,但是在生成前期没有使用这块显存
3. 显存中的外碎片
和OS很类似
解决方法
OS中内存分配原理
先回忆一下OS中的内存分配原理
通过页表来查询离散的物理地址,而程序看到的是连续的虚拟内存
内存被分成多个page块。
物理显存
将显存分成多个KVCache 块,来进行管理。
每个KV块中可以缓存4个token的KVcache中
逻辑显存
这就是和OS相同的方法,使用向量表来进行映射。
特性
OS中有Copy on write机制,PageAttention也参考过来了。
写时复制(Copy-on-write,COW),有时也称为隐式共享(implicit sharing)。COW 将复制操作推迟到第一次写入时进行:在创建一个新副本时,不会立即复制资源,而是共享原始副本的资源;当修改时再执行复制操作。通过这种方式共享资源,可以显著减少创建副本时的开销,以及节省资源;同时,资源修改操作会增加少量开销。
首先两个相同任务但是要求输出有不同时候会用到,prompt都是这句话,这句话会在显存中只存一次,即初始的KV块是共享的。
但是当自循环生成文本的时候,它就会看引用数量,如果为2就会重新选择一个block来进行缓存,并且将原有的块引用-1。实现显存的高效应用。只有当block的引用为0的时候,显存才会被释放,与OS相同。
参考视频:
怎么加快大模型推理?10分钟学懂VLLM内部原理,KV Cache,PageAttention_哔哩哔哩_bilibili