传统连续张量分配造成的严重显存浪费
在 vLLM 诞生之前,主流推理系统为请求分配 KV Cache 时,必须提前根据最大可能输出长度预先划定一段连续的物理显存空间。这种做法存在三个致命问题:
- 内部碎片 (Internal Fragmentation):用户实际只生成了 50 个 Token,系统却预留了 2048 个位置;
- 外部碎片 (External Fragmentation):显存总余量充足,但没有足够大的连续物理块供新请求使用;
- 无法共享上下文:在多轮对话中,相同的 System Prompt 在每个并发会话中都被重复冗余存储了一份。
操作系统级分页思想 (PagedAttention)
PagedAttention 彻底颠覆了连续分配假设:
- 逻辑块与物理块解耦 (Block Table):将每个序列的 KV Cache 切分为固定大小的小物理块(例如 Block Size = 16 Token),物理上离散存储在显存任意位置;
- 写时复制 (Copy-on-Write):同一个 System Prompt 对应的物理块可被无数个并发请求以只读指针的形式共享,直到某个请求需要写入新 Token 时才触发轻量拷贝。
配合 StreamingLLM 的注意力陷阱(Attention Sink)机制——固定保留最前方的 4 个起始 Token 与最近的滑动窗口 Token,使大模型能在恒定显存下支撑数十万 Token 的流式对话。
简易 Block Table 逻辑块物理映射器
import assert from "node:assert/strict";
function allocateBlock(freeList) {
return freeList.shift() || null;
}
const blocks = [101, 102];
assert.equal(allocateBlock(blocks), 101);原始资料与溯源链接
感谢阅读本文
如果你觉得内容有帮助,欢迎点赞支持或分享给同行开发者。
0 次阅读0 人赞过