在运行大模型时,GPU显存的高效利用至关重要。PagedAttention技术并非一种新的注意力机制,而是一种巧妙的显存管理方案。它通过借鉴操作系统的内存分页思想,将显存切分为固定大小的块进行管理,有效解决了传统KV Cache存储方式中因需要连续内存而导致的显存浪费与碎片化问题,从而显著提升了GPU的推理效率和并发处理能力。
智能速览
PagedAttention的核心是优化KV Cache的显存存储方式,而非注意力机制本身。
传统连续分配显存的方式,在处理不确定长度的序列时会造成大量空间浪费。
显存碎片化问题是限制GPU效率的另一大瓶颈,空闲空间难以被利用。
PagedAttention将显存切分为固定大小的“块”,通过一个块表进行高效管理。
通过块表的映射,逻辑上连续的数据可以存储在物理上不连续的显存块中。
该技术有效解决了显存浪费与碎片化,提升了GPU的吞吐量和服务能力。
精华内容
要理解PagedAttention的精妙之处,需先审视传统方法在处理模型推理时遇到的两个核心困境:显存的巨大浪费与难以避免的碎片化问题。
传统方法的困境
大模型推理过程中,需要存储每个已生成Token的Key和Value向量,即KV Cache。传统做法是在物理显存中申请一段连续空间。由于模型输出长度不确定,为防止空间不足,系统通常会按最长可能序列预留显存。例如,一个仅输出6个Token的简单问答,也可能被分配2048个Token的显存空间,造成超过99%的浪费。若尝试动态分配以节省空间,又会引发碎片化问题。比如,显存中存在两段空闲的1024-Token空间,但一个需要1025-Token空间的序列却无法存储,因为空间不连续。
分页管理的思路
PagedAttention的思路借鉴了操作系统的内存分页机制。它不再请求一段庞大的连续显存,而是将整个物理显存预先切分成一个个固定大小的“块”,例如每个块可容纳16个Token。然后,系统维护一个“块池”,所有空闲块的编号都存放在池中,代表其底层物理空间可用。当一个新序列请求存储KV Cache时,系统会为其创建一个“块表”,这个表是一个逻辑数组,用于记录该序列使用了哪些块。
块表的精妙之处
当序列的KV Cache增长时,系统只需从块池中取出一个空闲块的编号,填入该序列的块表中。这个过程只涉及编号操作,非常轻量,对推理性能影响极小。最关键的是,块表中的块编号(如[2, 9, 10, 12])在逻辑上是连续的,但其对应的物理显存块在物理位置上可以完全不连续。这样一来,程序在访问时无需关心物理地址是否连续,从而彻底规避了显存碎片化问题。
效率的显著提升
通过按块分配,PagedAttention将显存浪费降至最低。一个仅需4个Token空间的序列,只会占用一个16-Token的块,浪费最多12个Token,而非数千。由于消除了对物理连续性的依赖,所有离散的空闲显存块都能被充分利用。最终,同一张显卡能够容纳更多的KV Cache,在同一时段服务更多用户,GPU的利用率和吞吐量得到实质性提升,降低了大模型推理的单位成本。
PagedAttention通过借鉴操作系统的经典分页思想,为AI推理阶段的显存管理难题提供了优雅且高效的解决方案。它不仅释放了被浪费的硬件潜能,也为更大规模模型的部署和应用铺平了道路。未来,类似的底层优化是否还会带来更多惊喜?