5000 万 token 的"长期记忆":靠 KV 落盘而不是重计算,让 12B/31B 模型"记得更久也更便宜"
- 关联论文:2610.10845
- 作者:flyP
- 更新:2026-10-09
一句话结论
"长上下文"不是只能靠更大的 attention 窗口——论文实测了一个公开包 galahad-kv,把每个 ~16k token 块的 KV 状态加密落盘到本地 NVMe,加载时字节级一致不重计算,在单卡 H100 + vLLM 上用 Gemma 4 12B / 31B 跑了 5000 万 token 的真实文本,100/100 块零重计算加载回来,加载比重算快 2.8–4.3×、省 GPU 能量 8.8–12.3×,且在"百万 token 之前种的事实"问答上 12B 模型 82/100、31B 模型 98/100 全对,两个模型都没瞎编。
解决的真问题
LLM 用文本的能力被两件事同时卡住:
- 上下文窗口大小(attention 看到多远)
- 每次送 prompt 都重算 KV——即使模型本身支持 1M token,你把 1M token 灌进去推理一次的算力成本就足以劝退大多数生产场景
业界主流应对:
- 超长上下文模型(Gemini 1.5 1M、Llama 3.1 405B 等):attention 本身扩窗,但 prefill 单次成本 ≈ O(n²) 暴涨
- RAG:把长文切成段、按需检索,但检索本身有 recall 损失,丢失"全文级推理"
- KV cache 压缩/卸载:把不活跃 KV 卸到 CPU 内存或磁盘,但通常不可字节级恢复——需要重计算或精度损失
本工作走第三条路:让 KV 状态可字节级复用。这不是"扩大注意力窗口",而是"在窗口不变的前提下,让窗口可换页"——这跟操作系统把内存页换到磁盘是一个思路。
核心方法
1. 记忆层 galahad-kv 的工作方式
for each ~16k-token block in input:
forward_pass(block) # 标准 vLLM prefill
kv_state = extract_kv() # 从 vLLM 拿到 KV
encrypt(kv_state) # 加密
write_to_local_nvme(block_id, kv_state)
later, on query with full history:
for each needed block in [b0, b1, ..., bN]:
kv = load_from_nvme(block_id)
decrypt(kv)
# 字节级一致,无 recompute
关键不变量:写入时与加载时的 KV 字节级一致(论文强调 "byte-exact, without recomputing")。这意味着:
- 不需要为"再加载"重新跑 prefill
- 不损失模型精度(与重新 prefill 等价)
- 同一 KV 可被多查询复用
2. 实验设定(与论文一致)
- 硬件:单卡 NVIDIA H100
- 推理栈:vLLM
- 模型:Gemma 4 12B、Gemma 4 31B
- 数据规模:5000 万 token 真实公共文本
- 块大小:~16,000 tokens
- 加密:落盘前加密,本地 NVMe
- 评测协议:明确"built to resist common ways of gaming long-context benchmarks"——具体细节原文未明确,但说明作者考虑过 benchmark 污染问题
3. 评测维度
- 正确性维度:在 prompt 中"几百万 token 之前"埋事实,模型能否在后续问答中正确回忆
- 效率维度:加载 vs 重算的速度比、GPU 能耗比
- 稳定性维度:50M token 整段过程中 GPU 显存曲线
关键实验与数字
以下数字全部从 abstract 提炼,原文未明确处会标注。
- 字节级一致性:探测 100 个块,从加密存储加载回来全部与原始 KV 字节级一致(100/100 = 100%)
- 深度覆盖:从 0 token 到 5000 万 token 深度均验证(depths from 0 to 50M tokens)
- 加载速度 vs 重算:
- 12B 模型:加载比重算快 2.8× 至 4.3×
- 31B 模型:同上区间
- 不同区间指不同块大小/上下文深度,原文未明确逐一标注
- GPU 能量:加载使用 GPU 能量比重算少 8.8× 至 12.3×
- GPU 显存稳定性:50M token 整段流式过程中显存保持平坦("GPU memory stayed flat over the whole 50M-token stream")——这是工程上极为关键的指标
- 长程事实回忆:
- 12B 模型:种在百万 token 之前的事实,问答正确率 82/100
- 31B 模型:98/100
- 两个模型都没瞎编("Neither model made up an answer")——这是评估抗 hallucination 的关键
亮点与局限
亮点
- 问题定义清晰:把"长上下文"和"长期记忆"严格区分开——本文是后者。前者改 attention 窗口,后者改"页表管理"。
- 字节级可复现:100/100 块零重计算加载,是非常硬的工程声明。
- 能源账本诚实:8.8–12.3× 能量节省是产品决策的硬通货,比"快 N 倍"更有 ROI 说服力。
- 抗 benchmark 污染设计:作者主动声明"built to resist common ways of gaming long-context benchmarks"——这是 abstract 罕见的自证。
- 开源可复现:单 GPU 复现路径,公开软件 + 免费许可——与若干闭源 long-context 方案对比有可验证优势。
- 显存平坦:50M token 过程中无显存膨胀,意味着可以长时运行而不 OOM。
局限(诚实标注)
⚠️ 一次只加载一个块:abstract 明示 "one block is loaded at a time"——意味着不是真正跨块的注意力。问题答案仍然依赖问题落在哪一块以及该块内部能否独立回答。跨块推理(如"比较 block 3 和 block 47 的观点")能不能做,原文未明确。 ⚠️ 写入是一次性成本:把 50M token 全部 prefill 一次的代价仍要付——本质是把"一次大开销"换成"持久资产"。这对一次性灌库可接受,对每次请求动态灌入不友好。 ⚠️ 磁盘占用是 TB 级:abstract 明确 "the store takes terabytes of local NVMe disk"——50M token × 31B 模型 KV 容量直接落盘是 TB 级别(粗估:31B 模型 16k token 块的 KV ≈ 数十 GB × 数千块)。 ⚠️ 回答质量仍依赖模型本身:82/100 vs 98/100 的差距在 31B 上更稳,12B 仍有 18% 失败——这与模型长程能力绑定,galahad-kv 本身不提升模型能力上限。 ⚠️ 抗 gaming 协议细节:abstract 提了一句但未给具体清单,复现者需自查。 ⚠️ 加密存储恢复的安全边界:单卡本地场景安全模型清晰,多卡/多节点共享存储下的密钥管理与并发读写安全模型原文未明确。
对工程落地的启发
- 长文档问答可走"KV 落盘 + 按需加载"路径:在 RAG 与超长上下文之间,galahad-kv 提供了第三条路——对一次写入、多次查询的场景尤其合适。
- 能源成本进入 LLM 选型:8.8–12.3× 能量节省在欧盟/加州的能源合规语境下,可能比速度提升更有战略价值。
- "长期记忆"≠"无限上下文":若产品要的是"全文级跨段推理",galahad-kv 还不够;若是"会话级 + 文档级持久状态",则正中下怀。
- TB 级本地存储可接受:很多企业的 2U 服务器本身就配 30+ TB NVMe,比起长期付云端 GPU 时薪更可控。
- 不要混淆"加载快"与"理解好":评测同时跑了 fact recall——只跑速度不跑质量会高估方案价值。
与同方向工作的关系
- Mamba / RWKV / Linear Attention(替代 attention):用 O(n) 注意力换长程能力,但会改模型架构——galahad-kv 不改模型,仅管理 KV 状态。两条路线可叠加。
- KV cache compression(H2O, Scissorhands):压缩 KV 容量以放下更长上下文,但会损精度。galahad-kv 是无损方案。
- StreamingLLM / Attention Sink:用滑动窗口 + 重要 token 保留换"无限"流,是另一种"换页"思路——但精度损失模式与 galahad-kv 不同。
- Anthropic prompt caching / OpenAI prompt cache:商业系统层的等价思路,galahad-kv 走开源 + 自托管。
- LangChain / LlamaIndex 的 ConversationSummaryBufferMemory:应用层记忆压缩方案,galahad-kv 在更底层。
- 学术脉络:与"系统视角的 LLM 推理优化"(vLLM, PagedAttention, FlashAttention)一脉相承——本工作把 PagedAttention 的"页"延伸到"盘"。
适合谁读
- LLM 基础设施 / 推理平台工程师:KV 卸载、显存管理、长时间会话系统的必读。
- 企业 AI 平台架构师:评估"长上下文 vs RAG vs KV 落盘"三选一的硬材料。
- RAG 团队负责人:理解"长期记忆"技术栈,避免把 RAG 当万能膏药。
- 能源/合规敏感的算力买家:8.8–12.3× 能量账本直接关联 TCO。
- ⚠️ 不适合:寻找"模型本身能处理 10M token attention"的人——本工作不做这件事。
八、工程落地坑(≥5,三段式)
坑 1:把"长上下文"与"长期记忆"混为一谈
- 现象:产品 PRD 写"支持 1000 万 token 上下文",团队评估后选了 galahad-kv。
- 影响:galahad-kv 一次只加载一个 ~16k 块(abstract 明示),不提供跨块联合 attention——用户问"对比第 3 块和第 47 块"时模型可能答错或瞎编。
- 修复:在 PRD 里把"长上下文"拆为"长程召回(KV 落盘可解)"与"全文级推理(需超长 attention 或 RAG)"两件事,分别选型。
坑 2:忽略写入的一次性成本
- 现象:产品上线初期每次会话开始都重灌 50M token 上下文。
- 影响:写入是一次性 prefill 成本——若写入频次等于查询频次,能源/速度优势被吃光。
- 修复:把 galahad-kv 限定在"会话前/文档入库一次,查询 N 次"的模式;写入路径独立计费。
坑 3:低估磁盘容量需求
- 现象:采购 1 TB NVMe 装 31B 模型的 50M token KV 库。
- 影响:31B 模型单 16k 块 KV 容量在数十 GB 量级(具体数字 abstract 未明),50M token 拆 ~3000+ 块 = 总量级 TB 起跳。1 TB 几天就满。
- 修复:采购前用目标块数 × 单块 KV 容量估算(建议 31B 模型起步 4 TB,可用 ZNS NVMe 减少写放大)。
坑 4:跨卡/集群部署时假定单卡安全模型
- 现象:把 galahad-kv 部署到多卡推理集群,KV 文件落到共享 NVMe。
- 影响:加密密钥管理、并发读写锁、租户隔离全部引入新攻击面——abstract 只承诺"单卡本地 NVMe + 加密",多卡语义原文未明确。
- 修复:在多卡部署前补一层密钥管理服务(KMS)+ 租户隔离目录;先把单卡方案跑通再考虑横向扩展。
坑 5:忽略模型本身能力上限
- 现象:上线 12B 模型 + galahad-kv,期待"百万 token 之前事实召回 95%+"。
- 影响:实测 82/100 = 82%,仍有 18% 漏召——galahad-kv 不提升模型能力,只让窗口内推理成本下降。
- 修复:模型选型按"目标召回率"反推;12B 跑不到 95% 就上 31B 或更强模型;别让 KV 层背能力的锅。
坑 6:忽视"长程 vs 跨段"质量差异
- 现象:A/B 测试只跑 fact recall,结论"长程 OK",上线后用户报"对比不同章节的差异"答错。
- 影响:KV 落盘不等同于跨块 attention——"X 文件第 3 段讲 A、第 47 段讲 B,B 与 A 矛盾吗"这类问题需要多块联合推理。
- 修复:A/B 协议里加"跨段对照类"query;上线前用 §三 的 100 问标准组测一遍;不行就上 RAG 兜底。
坑 7:能源账本算错
- 现象:报告里只写"加载快 4.3×",忽略 GPU 能量维度。
- 影响:决策层可能用 GPU 小时单价算 TCO,错过 8.8–12.3× 能量维度——尤其在 PUE 1.3+ 的机房、欧盟能效合规下,能源账比速度账更重要。
- 修复:把 GPU 能量(kWh / 千次查询)作为独立 KPI 报给采购;按区域电价换算年度 TCO。
边界声明
- 本解读只基于 abstract + paper card,未读 PDF 全文,具体数字以原文为准。
- 抗 gaming 协议的具体清单、单块 KV 容量、跨块 attention 是否支持——均原文未明确,落地前必须自查。
- GitHub 仓库
galahad-kv是否已公开 release、license 具体类型原文未明确,独立验证后引用。 - 作者归属(Sietse Schelpe)已与 arXiv author block 一致;机构归属未独立核验。
工程落地与核查(Jay)
事实核查摘要
| 核查项 | 结论 | 风险等级 |
|---|---|---|
| "5000 万 token 真实文本" | abstract 原话 "50 million tokens of real text" | ✅ 低 |
| "100/100 块字节级一致" | abstract 明示 "100/100 blocks recovered byte-exact" | ✅ 低 |
| "加载快 2.8–4.3×" | abstract 原话 | ✅ 低 |
| "GPU 能量少 8.8–12.3×" | abstract 原话 | ✅ 低 |
| "82/100、98/100 事实问答正确" | abstract 原话 | ✅ 低 |
| "Neither model made up an answer" | abstract 原话(抗幻觉关键声明) | ✅ 低 |
| "one block is loaded at a time" | abstract 明示(跨块推理限制) | ✅ 低(已知局限) |
| "TB 级 NVMe" | abstract 原话 "terabytes of local NVMe disk" | ⚠️ 中(需实测单块 KV 精确大小) |
| 作者 Sietse Schelpe | paper card 声明与 arXiv author block 一致 | ✅ 低(待 fetch 确认) |
GitHub galahad-kv release |
abstract 提 "公开包"但未给链接,需 fetch arXiv 首页找仓库地址 | ⚠️ 中(首次使用前必查) |
工程落地 Checklist
- galahad-kv GitHub 仓库可用性:abstract 说"公开包 galahad-kv"但未给 URL,需访问 arXiv 首页或
arxiv.org/abs/2610.10845找 GitHub 链接;首次集成前必验 200 OK + license。 - 单块 KV 精确容量:abstract 未给 31B 模型单块 KV 大小。粗估方法:
2 × num_layers × hidden_size × kv_heads × seq_len × 2 bytes(fp16)——实测前按估算值 ×1.2 采购 NVMe,留安全边界。 - NVMe 顺序读写 vs 随机读延迟:KV 文件按 block_id 存储,查询时需要随机读多个块。NVMe 顺序带宽(~7 GB/s)与随机读延迟(~100 µs)差异巨大;在 16k 块场景下,随机读 100 个块约 ~10ms,latency 敏感场景(<100ms P99)需先压测。
- 加密解密吞吐:AES-NI 加密 31B × 16k tokens KV 状态的耗时——abstract 未披露。生产部署前测
openssl enc -aes-256-gcm吞吐,确保加密不成为瓶颈。 - H100 独占 vs 共享场景:所有数据基于单卡 H100;多租户环境下 NVMe 共享读写会引入 IO 争用——多租户部署前必须压测 IOPS 上限。
坑点补遗(flyP 节未覆盖)
坑 8:NVMe 写放大缩短 SSD 寿命
- 现象:KV 状态按 block 加密后反复覆写,ZNS NVMe 可缓解但非所有磁盘都是 ZNS。
- 影响:高频写入场景(如每天重建 KB)会导致 TLC/QLC SSD 写放大,1–2 年内可能达到 DWPD 上限触发只读。
- 修复:使用 ZNS NVMe 或在写入路径加写合并层;高写入场景监控 nvme smart-log 的 data_units_written。
坑 9:Gemma 4 特定结果无法直接迁移 - 现象:所有数据在 Gemma 4 12B/31B 上测得,换到 Llama 3.1、Mistral 等架构,KV 容量与加载速度比可能不同。 - 影响:不同模型的 attention head 数、kv head 映射、hidden size 均影响 KV 大小与加解密吞吐;Gemma 特化调优可能在其他模型上失效。 - 修复:选定目标模型后在目标硬件上实测 KV 大小 + 加载延迟,不要直接用 abstract 数字做容量规划。
坑 10:"50M token 整段流式" ≠ "任意时刻显存平坦" - 现象:abstract 强调 "GPU memory stayed flat",解读为"显存完全恒定"。 - 影响:flat 是指 50M token KV 全落盘后显存不增长,但加载过程本身需要显存接收 KV(解密后、解码前的临时 buffer)。对 31B 模型批量加载 100+ 块时,峰值显存可能远超稳定态。 - 修复:实测"加载 100 块瞬间峰值显存" vs "稳定态显存"的差值;以此差值作为并发加载的安全边界依据。