Token Lab搜索

SYSTEMS / ENGINEERING BRIDGE

KV 内存、分页与服务时限

区分分配效率、模型计算与排队延迟。

学习指南与本课目录LEARNING CONTRACT

理解 → 实现 → 研究

目标:解释本课机制、复现一个例子、测试一个失败案例。读完不自动代表掌握。

机制与假设

PagedAttention 处理 KV 分配与共享,不会消除注意力计算,也不保证延迟目标。分别测量 prefill 与 decode,将排队计入用户延迟。前缀缓存只在前缀和缓存标识匹配时有效,还要考虑淘汰与隔离。

Text / 原始公式
KV bytes = 2 × layers × KV_heads × head_dim × tokens × bytes_per_element
pages = ceil(tokens / block_size)
unused_slots = pages × block_size − tokens

手算例子

32 层、8 个 KV 头、头维 128、4096 token、每元素 2 字节,单序列 KV 为 536,870,912 字节,即 512 MiB(不含元数据)。块大小 16 时,33 token 分配 48 槽,浪费 15 槽。分页减少连续分配要求,但尾块仍有空隙。

实现练习

在固定序列长度列表上比较块大小 8/16/32,报告槽利用率、页表项和独立实测延迟;分配算术不能预测 GPU 速度。

交付代码、固定种子、原始结果与一个反例。这里是实验规范,不是已运行的 GPU benchmark。

为什么 tokens/s 提高但 p99 变差?

更大 batch 可提高设备利用率,却增加排队或请求干扰。固定到达过程及输入输出分布,同时报告吞吐和延迟。

arXiv ↗ · PDF ↗

原创教学例子,来源核对于 2026 年 10 月。这些是与工程相关的基础机制,并非覆盖所有最新模型。

系统课程与检查点 →工程专题目录 →
MATHEMATICAL REVIEW · 2026-10-26

假设、参考实现与验收

同时计 K/V,使用 KV 头数而不是 query 头数;序列×批次仅乘一次。字节公式不含激活、权重、分配碎片和注意力工作区。

已复核公式条件、单位及算例。实现隔离一个数值机制,不训练完整策略,也不控制真实硬件。

逐层 K 与 V 张量 → KV 头 × 头宽 × token 数 → 乘层数及每值字节数 → 512 MiB 逻辑缓存 · 另计开销
机制图:从上到下跟踪每次变换。

运行前:预测一个边界情况

批次翻倍则 MiB 翻倍;仅修改 query 头数不改变 KV 存储。

提示:隔离假设

固定基线输入,只改变一个参数或边界;同时比较数值与声明单位。单例通过仅验证该样例。

最小可运行算例

将算例及所链接模块保存在同一目录。使用 Node.js 22 或更高版本,然后运行 node kv-serving.mjs. 无需第三方运行依赖。

const solve=()=>{
const layers=32,kvHeads=8,headDim=128,sequence=4096,batch=1,bytes=2;
return 2*layers*kvHeads*headDim*sequence*batch*bytes/2**20;
};
const actual=solve();
const expected=512;
if(JSON.stringify(actual)===JSON.stringify(expected)){console.log('PASS',actual)}else{
const a=[actual].flat(), b=[expected].flat();
if(a.length!==b.length||a.some((v,i)=>!Number.isFinite(v)||Math.abs(v-b[i])>1e-10))throw Error('Numerical mismatch');
console.log('PASS within 1e-10',actual);
}
参考输出——先预测再展开
512

测试与迁移

批次翻倍则 MiB 翻倍;仅修改 query 头数不改变 KV 存储。

在下方笔记记录输入、代码版本、期望值和实测值;再构造违反上述假设的反例,解释原结论为何不再成立。

下载完整代码包(.tar.gz) · 完整参考代码与回归检查

预测、检验与证据记录

展开答案前先预测一个结果;练习后记录差异和迁移测试。记录仅存本地,在不同语言版本间共用。

打开记录/导出/清除 →

数学复核范围逐篇记录,不代表完成论文实证复现;可在笔记中记录疑似错误。 复核范围