VLLM模型推理框架的原理和整体架构是怎样的?

摘要:Page Attention是优化KV-cache内存管理的方法,可解决预留浪费、内部及外部内存碎片化问题,通过将KV-cache划分为固定大小Block,利用Block Table维护逻辑与物理映射,有效管理非连续内存;同时处理Softm
PageAttention原理分析 Page Attention也是一种优化方法(区别于MLA,page attention是对内存进行分配管理)。参考论文[1]中描述,对于KV-cache存在3个问题: 1、预留浪费 (Reserved):为将来可能的 token 预留的空间,这些空间被保留但暂未使用,其他请求无法使用这些预留空间; 2、内部内存碎片化问题(internal memory fragmentation):系统会为每个请求预先分配一块连续的内存空间,大小基于最大可能长度(比如2048个token),但实际请求长度往往远小于最大长度,这导致预分配的内存有大量空间被浪费。 3、外部内存碎片化问题(external memory fragmentation):不同内存块之间的零散空闲空间,虽然总空闲空间足够,但因不连续而难以使用。 只有 20.4%-38.2% 的token是被使用的,大部分都被浪费掉了。Page Attention允许在非连续的内存空间中存储连续的 key 和 value 。具体来说,Page Attention将每个序列的 KV-cache 划分为块,每个块包含固定数量 token 的键和值。在注意力计算期间,Page Attention内核可以有效地识别和获取这些块。如何理解上面描述呢?还是借用论文中的描述: 比如说按照上面Prompt要输出(假设只输出这些内容):“fathers brought a car”,一般的套路可能是:比如说:“Four score and seven years ago our xxxxx”(xxx代表预留空间)因为实际不知道到底要输出多少文本,因此会提前预留很长的一部分空间(但是如果只输出4个字符,这预留空间就被浪费了),因此在page attention里面就到用一种“分块”的思想处理,以上图为例,分为8个Block每个Block只能存储4个内容,因此就可以通过一个Block Table来建立一个表格告诉那些Block存储了多少,存储满了就去其他Blobk继续存储。整个过程如下: 上述过程描述如下:具体而言,Page Attention 首先将 Key/Value 的连续显存空间划分为固定大小的 Block(页),每个 Block 作为最小的内存分配与调度单元。随后,引入一个 Block Table(页表) 来维护逻辑序列位置与物理 Block 之间的映射关系,用于记录每个 Block 当前的存储状态与可用容量。 一个小问题:分块之后注意力计算过程,因为我的KV被存储在不同的block中,由于Block table存在可以直接去索引不同Blcok中KV值,这样一来对于Q、K、V三者计算不成问题,不过关键问题就是:Softmax 的分母需要全局信息,Block (不管是Flash Attn还是Page Attn都需要面对这个问题)是分开的,怎么办? 在softmax计算过程中:\(\sigma= \frac{e^{z_i}}{\sum_{j=1}^K e^{z_j}}\) 由于分块可能导致值过小进而导致数值溢出问题,除此之外计算需要所有token的分数一起归一化,因此首先会对上面的公式改进为:\(\sigma= \frac{e^{z_i-m}}{\sum_{j=1}^K e^{z_j-m}}\)也就是将每块都去减去当前的最大值(避免溢出问题)。
阅读全文