← 全部论文2405.05254v2 / r1
版本与下载

YOCO:You Only Cache Once 中文精读笔记

  • 论文:You Only Cache Once: Decoder-Decoder Architectures for Language Models。
  • 作者:Yutao Sun、Li Dong、Yi Zhu、Shaohan Huang、Wenhui Wang、Shuming Ma、Quanlu Zhang、Jianyong Wang、Furu Wei;Microsoft Research / Tsinghua University。
  • 版本:arXiv:2405.05254v2,2024-05-09;获取与研读日期:2026-09-20。
  • 材料:同版本原文 PDF;作者 main.tex、引用的 settings.tex 与符号宏、原始图件。已阅读正文 §§1–5 和附录 A–G,并用 PDF 核对编号、公式及结果。PDF 共 20 页,以下页码均为从 1 起计的 PDF 页码,与印刷页码一致。未执行作者源码,也未复现实验。

论文总览

YOCO 将语言模型分成前后两个因果解码器:前半段 self-decoder 用高效序列模块生成上下文化表示,再投影出唯一一份全局 KV 缓存;后半段 cross-decoder 的所有层共享这份缓存,各层只更新自己的 query 和隐状态。这样仍可对全部历史 token 做精确的 softmax attention,却不必给每一层保存独立的全长 KV。

这里的“once”指全局 KV 只保存一份,不是整个模型没有其他状态,也不是生成时只计算一次 attention。self-decoder 仍维护各层的固定大小递推状态或滑窗缓存;每个新 token 都要经过两部分,并把新 KV 追加到共享缓存。

最有力的贡献是计算依赖关系的改变:历史 token 的 cross-decoder 输出不再是未来生成所需的缓存,所以构建提示词缓存时可跳过这些输出。默认 3B 配置下,作者报告 1M 长度总推理显存约 12.4 GB,相对 Transformer 降低约 9.4 倍;512K 情境下预填充从约 180 秒降到不足 6 秒。与此同时,3B 下游任务与 160M–13B 的固定 token 预算实验显示质量具有竞争力。这些结果分别来自不同实验,不能合并成“任意规模、任意任务均更快更准”。

结构地图

原文章节解决的问题PDF 定位
1 IntroductionKV 内存和长提示词延迟瓶颈p.2
2 You Only Cache Once (YOCO)双解码器、共享缓存、推理依赖pp.3–5;图2–3、表1–2、式1–3
3 Design Choices of Self-DecodergRet 的三种形式与滑窗替代pp.5–6;式4–8
4.1 Language Modeling Evaluation3B、万亿 token 训练后的质量p.7;表3
4.2 Scalability Compared with Transformers160M–13B 扩展曲线pp.7–8;图4
4.3 Long-Context Evaluation单针、多针和长序列 NLLpp.8–9;图5–6、表4
4.4 Inference Advantages显存、容量、prefill、吞吐pp.9–11;图7–10
5 Conclusion总结与尚未验证的应用设想pp.11–12
A Chunk Parallelism for Long-Sequence Training of YOCO分块通信p.16;图11
B Chunk-wise Representation of Gated Retention等价展开pp.16–17;式9–11
C / D / E Hyperparameters…3B / 扩展曲线 / 长度扩展配置pp.17–18;表5–7
F Pseudo Code of Gated Retention三种计算形式的伪代码pp.18–19
G Comparisons with Transformer Variants联想召回与长任务诊断pp.19–20;表8、图12

一:动机——把逐层存储的历史改成共享记忆

常规自回归 Transformer 缓存每层历史 token 的 K、V,使下一步不用重算前缀。但随上下文长度 $N$ 和层数 $L$ 增长,缓存近似按 $LN$ 增长。GQA 降低 KV 头数,却没有移除层数因子。长提示词还需要在许多层中进行大规模因果 attention,导致很长的首次响应等待。

纯递推模型能够用固定大小状态压缩历史,但精确记住具体历史细节并非无代价。YOCO 的取舍是让前半部分使用高效递推或局部处理,同时为后半部分保留逐 token 的全局可寻址记忆。因此它不是把整个上下文都压成一个状态,也不是普通 encoder-decoder:两个部分都施加因果约束,输入和生成 token 都使用整套参数。(§§1–2,pp.2–4)

二:方法——先建一次记忆,再多层查询

2.1 数据流与基本块

原图2:YOCO 架构

来源:图2,PDF p.3,作者原始图件。自下向上看,前 $L/2$ 层产生共享 KV,后 $L/2$ 层的 query 随深度改变,K/V 则来自同一位置的 self-decoder 输出。图中的“共享”不表示各层的 attention 分布相同。

符号含义与形状(简化为未展开多头)
$X^0$$N\times d$ 的 token embedding
$L$总层数,前后各半
$M=X^{L/2}$self-decoder 输出,$N\times d$
$\hat K,\hat V$全局共享 KV;采用 GQA 时实际宽度由 KV 头数决定
$\hat Q^l$cross-decoder 第 $l$ 层独立计算的 query
$C$滑动窗口长度,固定超参数
$S_n$gRet 单头递推状态,形状 $d_k\times d_v$

前半部分是 pre-RMSNorm + efficient self-attention(ESA)+ 残差,再接 RMSNorm + SwiGLU + 残差:

$$Y^l=\operatorname{ESA}(\operatorname{LN}(X^l))+X^l,$$

$$X^{l+1}=\operatorname{SwiGLU}(\operatorname{LN}(Y^l))+Y^l.$$

这里 LN 实际使用 RMSNorm。SwiGLU 为 $(\operatorname{swish}(XW_G)\odot XW_1)W_2$。前半部分的关键约束是推理状态不随 $N$ 增长。(式1,p.3)

交界处只投影一次:

$$\hat K=\operatorname{LN}(M)W_K,\qquad \hat V=\operatorname{LN}(M)W_V.$$

后半部分每层计算:

$$\hat Q^l=\operatorname{LN}(X^l)W_Q^l,$$

$$Y^l=\operatorname{Attention}(\hat Q^l,\hat K,\hat V)+X^l,$$

$$X^{l+1}=\operatorname{SwiGLU}(\operatorname{LN}(Y^l))+Y^l.$$

Attention 使用因果 mask,且支持 GQA。顶层输出接 next-token 分类器。因果 mask 必不可少:训练时虽然把整段 KV 都算出来,位置 $n$ 仍只能读取 $m\le n$ 的缓存。(式2–3,p.4)

2.2 默认 self-decoder:门控保留机制(gated retention, gRet)

gRet 给 Retention 加上由当前输入决定的逐头衰减门。忽略 batch 和 head 维度,原文式4定义:

$$Q=(XW_Q)\odot\Theta,\quad K=(XW_K)\odot\bar\Theta,\quad V=XW_V,$$

$$\Theta_n=e^{in\theta},\qquad \gamma=\operatorname{sigmoid}(XW_\gamma)^{1/\tau},$$

$$D_{nm}=\begin{cases}\prod_{i=m+1}^{n}\gamma_i,&n\ge m,\\0,&n$\Theta$ 表示位置旋转,$\tau$ 调节门值向 1 靠近的程度,越接近 1 越少遗忘。$D$ 是因果衰减矩阵;这里没有 attention 的 softmax。逐头标量门而非逐元素门是作者面向 tensor core 的设计选择。(§3.1,p.5)

同一运算可递推计算(式5,p.5):

$$S_n=\gamma_nS_{n-1}+K_n^\top V_n,\qquad O_n=Q_nS_n.$$

状态的维度不随序列长度增长,但每层每头都需要一份。固定内存指固定于长度,不是与层数和头维度都无关。 展开递推可见,旧 token 的外积恰好乘上从它之后到当前的所有门值,因此与并行形式等价。

教学例子:$S_0=0$ 时,$S_2=\gamma_2K_1^\top V_1+K_2^\top V_2$。第一个 token 被遗忘多少取决于第二步门值;当前 token 没有额外衰减。

多头实现将各头结果拼接,做逐头 GroupNorm,再通过 swish 输出门和 $W_O$。这些归一化与门控也是完整模块的一部分,单写 $Q_nS_n$ 不是完整网络层。(式7,p.6)

2.3 分块计算:训练并行与推理递推的桥梁

逐 token 递推不利于 GPU 并行;直接构造整个 $N\times N$ 衰减矩阵又昂贵。分块做法在块内并行、块间递推,prefill 和长序列训练采用这一形式;逐 token generation 使用递推形式。

下面是本次从式4–5重新推导、统一行列约定后的教学写法,不是逐字照抄式6。块起点为 $a=(i-1)B$,定义 $\beta_j=\prod_{t=1}^{j}\gamma_{a+t}$,并令 query 对应行 $j$、key 对应列 $k$:

$$D^{(i)}_{jk}=\mathbf1_{k\le j}\frac{\beta_j}{\beta_k},$$

$$O_{[i]}=(Q_{[i]}K_{[i]}^\top\odot D^{(i)})V_{[i]}+\operatorname{diag}(\beta)Q_{[i]}R_{i-1},$$

$$R_i=\beta_B R_{i-1}+\sum_{k=1}^{B}\frac{\beta_B}{\beta_k}K_{a+k}^\top V_{a+k}.$$

第一项是当前块内的因果历史,第二项是前面所有块的压缩状态。状态更新中,每个块内 token 需衰减到块末。这样 $R_i=S_{iB}$,等价性直接来自把总和按当前块与旧块拆开。

原文核验提醒:式6(p.6)把 $D_{[i]}(j,k)$ 写成 $j\le k$ 时 $\beta_k/\beta_j$;按紧随其后的 $QK^\top$ 常规行列约定,这与式4的因果方向不一致。附录 B(pp.16–17)还有 $n$ 与 $n-1$ 乘积上界及指标混用;附录 F(p.18)伪代码把已赋值的 gt 写成了未定义的 g。这些材料适合理解思路,不能直接当作已验证实现。重实现时应以式4–5为依据,对三种形式做数值等价测试;本次未运行作者实现验证。

2.4 替代选择:滑动窗口 attention(SWA)

只允许 $i-C

2.5 为什么可以提前结束 prefill

原图3:预填充和生成路径

来源:图3,PDF p.4,作者原始图件。提示词首先经过 self-decoder 填充共享 KV;历史提示词位置的 cross-decoder 输出无需保存。生成时,当前位置的 query 在上半部分逐层更新并读取全局 KV。

通常 next-token logits 仍需要提示词最后一个位置的 cross-decoder 计算。省掉的是全部历史位置的上半段批量计算,不是完全不用上半段就能预测第一个 token。 训练若要对所有位置计算 loss,也仍需所有相应输出。原文 §1 p.2 有一句写成“进入 self-decoder 前退出”,与图3和 §2.3 相矛盾;此处依据具体计算图与 §2.3,正确位置是进入 cross-decoder 前。

项目TransformerYOCO适用前提
KV / 状态内存$O(LND)$原文表1:$O((N+L)D)$固定窗口、头维度等隐藏常数
更明确的缓存数量$O(LN)$$O(N+CL)$SWA 情况,且长序列时 $N\gg CL$
prefill attention 计算$O(LN^2D)$表2:$O(LND)$使用高效模块和提前退出

表1–2(p.4)是简化复杂度,不能把 $D$ 当成包含全部实现细节的精确字节公式。gRet 状态实际为逐头矩阵;若头维度也视为变量,必须显式计入它的乘积。参数、FFN、临时激活和通信同样影响实际成本。YOCO 没有消除 generation 阶段读取长 KV 的成本,也没有把训练中的全局 attention 自动变成线性。

2.6 分布式训练(附录 A,p.16)

把序列分块放在不同设备。self-decoder 在设备边界传递递推状态或必要的局部窗口;cross-decoder 的共享 KV 只需一次 all-gather,而非每一层重复收集。图11解释了通信依赖的简化,但正文未提供独立的通信带宽或端到端训练加速消融,不能直接赋予一个训练加速倍数。

三:实验——分清四种不同证据

实验对象和协议指标及比较角色
§4.1 训练 token 扩展3B gRet,训练至1.6T,保留1T checkpoint8项 LM Eval Harness zero-shot 分数,越高越好;与公开预训练模型比实用质量
§4.2 参数扩展160M、400M、830M、1.4B、2.7B、6.8B、13B,各10B训练tokenvalidation LM loss,越低越好;相同数据/训练设置的架构比较
§4.3 长上下文3B继续训练到64K、256K、1M;无长指令微调数据检索准确率↑、累积平均NLL↓
§4.4 部署 profiling默认采用§4.1的3B配置,32K–1M,最后1,024 token作为生成总推理显存↓、prefill秒数↓、含prefill与生成的吞吐↑

3B 模型:26层、隐藏维度3072、FFN8192、24个Q头/8个KV头、head dimension 128,非embedding参数2.83B;训练长度4096、batch 4M token、AdamW $(0.9,0.95)$、峰值学习率 $3.2\times10^{-4}$。5T 是学习率日程目标,实际只训练1.6T。(表5,p.17;§4.1)

参数扩展实验不是上述3B训练的缩小版:长度2048、batch 0.25M token、40k steps、AdamW $(0.9,0.98)$,通过 FFN 宽度对齐参数:Transformer 为 $8d/3$,YOCO 为 $3d$;gRet head dimension 为256。图4不能被解释成各规模均训练充分的 compute-optimal scaling 证明。(附录D,pp.17–18)

推理 baseline 已包含 GQA、Flash-Decoding 和 kernel fusion;YOCO 的 gRet 使用 Triton 内核,chunk size 256,在 H100-80GB 硬件上测试。论文未给出足以完全重建每个长度的 batch、并行设备配置、计时重复次数及误差区间。引言的7B、4卡背景例子不能当成§4.4默认3B实验配置。

四:结果——有效性与边界一起读

4.1 语言模型质量(表3,p.7)

模型 / 训练token八项平均分↑对应比较
OpenLLaMA-3B-v2 / 1T0.619公开Transformer baseline
StableLM-base-alpha-3B-v2 / 1T0.612公开Transformer baseline
YOCO-3B / 1T0.634对以上分别高1.5和2.2个百分点
YOCO-3B / 1.6T0.636对自身1T高0.2个百分点
YOCO-3B-1M / 长度扩展后0.645又增加了长序列继续训练

八项是 ARC-C、ARC-E、BoolQ、HellaSwag、OBQA、PIQA、Winogrande、SciQ;表中为原文分数口径,未充分注明各任务的归一化细节。StableLM-3B-4E1T 的多项结果缺失,因此没有可比的完整平均分,不能补算成0分。

质量并非每项都赢:1T 时 YOCO 的 BoolQ 为0.645,低于 OpenLLaMA 的0.657;HellaSwag 为0.689,低于0.700。1T到1.6T也有个别任务回落。公开模型的数据、tokenizer与训练过程不是严格统一的,所以这些结果支持“有竞争力”,不能单独隔离出架构的因果收益。延长上下文后的0.645也混合了额外训练效应。

4.2 参数规模扩展(图4,pp.7–8)

原图4:参数规模与验证损失

横轴为非embedding参数规模,纵轴为验证loss,越低越好;不同曲线分别对应 Llama 风格 Transformer、YOCO-SWA 和 YOCO-gRet。相同10B token条件下,YOCO在160M–13B保持竞争力,gRet变体整体更好。作者把收益解释为 attention 与 retention 的归纳偏置互补,并提到1:3交错混合也有类似现象;这不是共享缓存本身带来所有质量收益的严格消融证明。图中未配完整原始点表或多种子误差线,本笔记不从图像臆造精确差值。

4.3 长上下文:检索、聚合、预测要分别判断

长度扩展配置(表7,p.18):

长度继续训练token学习率RoPE θ
65,5366B$8\times10^{-5}$640K
262,1444B$4\times10^{-5}$5M
1,048,5761.5B$2\times10^{-5}$80M

共额外11.5B token;上采样超过目标训练长度的长文档。不是直接把4K模型零训练外推到1M。

原图5:百万长度单针检索

来源:图5,p.8。横轴为上下文长度,纵轴为插入深度,颜色为准确率;城市名与magic number组成needle,每个深度/长度配置重复10次取均值。近乎全绿说明此合成单针任务表现接近满分,不等于百万长度的多步推理或文档综合理解已解决。

多针结果是在 128K 下测得(表4,p.8),$N$ 为needle数而不是上下文长度:

模型1针2针4针8针
YaRN-Mistral-128K 7B0.020.120.080.20
LWM-1M-text 7B1.000.900.760.62
MiniCPM-128K 2.4B1.001.000.540.56
ChatGLM3-128K 6B0.940.720.520.44
YOCO-3B-1M 3B0.980.980.840.56

YOCO在4针上突出,但8针低于LWM且与MiniCPM持平;因此作者“优于”部分模型的整体概括不能解释为每个needle数都严格更好。不同模型规模、长度训练与数据也不同。

图6(p.9)的书籍和repository-level代码实验选择超过1M token的验证样本,报告随已处理长度变化的累积平均负对数似然 NLL,越低越好。两组总体下降,支持模型利用长距离信息的解释;但这不是固定同一预测位置、只改变可见历史的受控曲线,累积平均还混入位置与样本难度的变化。原文段落标题提到perplexity,实际图注指标是NLL,两者不能直接混用。

4.4 推理:最大的收益来自长提示词和缓存容量

原图7a:推理总显存

来源:图7a,p.10。横轴长度、纵轴GB;绿色YOCO随长度增长较慢,橙色Transformer增长明显。插图显示32K也有收益。这里是权重、激活和缓存的总量,不是只测KV。

条件原文结果位置与注意点
3B、1M,总推理显存YOCO 12.4GB;Transformer约9.4倍图7/§4.4 p.10;图标注9.38×
3B、32K,总推理显存约1.95×差距图7插图;不等于26×
65B、每token KV内存约80×减少图8 p.10;是层数相关的缓存指标,不是总内存
32K,prefill2.87×加速图9 p.11
512K,prefill约180秒→不足6秒§4.4 p.10,图9标30.3×
1M,prefill图9标71.82×p.11;引言四舍五入为71.8×
512K,总推理吞吐4.5→43.1 token/s,约9.6×§4.4 p.11;包含prefill与生成

65B 情况下,1GB缓存约能容纳YOCO的128K token,对比Transformer的1.6K;这不是说1GB就能加载65B模型权重。总显存收益小于KV倍数,因为权重等部分还存在。

prefill优势来自跳过历史位置的cross-decoder,以及self-decoder高效计算。吞吐优势还来自显存节省允许更大batch。9.6×不是固定batch的单步decode加速,也不等于每个生成token延迟缩短9.6×。 论文的测量细节不足以脱离其内核和硬件直接外推服务SLA。

4.5 附录诊断:全局记忆为何有价值

附录G.1(p.19)比较160M、12层、隐藏维度768的模型。H3是含两层attention的混合版;Mamba采用其double-SSM布局;RetNet和gRetNet调整value及FFN维度以匹配参数。

模型Valid. Set↓AR-Hit↓First-Occur↓
Mamba3.6451.5554.126
RetNet3.6331.4664.131
Hybrid H33.5911.2514.130
gRetNet3.6001.3544.116
Transformer3.5641.2194.104
YOCO-SWA3.5531.2024.094
YOCO-gRet3.5301.1994.067

原文表8将这些指标称为perplexity,此处保留原名与数值,不自行取指数或改标loss。AR-Hit针对上下文中出现过的bigram续写,衡量联想召回;First-Occur偏向不能直接从上下文重现的预测。YOCO两种分组均有竞争力,且相对纯gRetNet的AR-Hit差距更明显,支持“保留可寻址全局记忆有用”的解释;仍不构成对所有状态空间模型的普遍判断。

附录G.2(p.20)继续训练2B token、长度16,384,考察ZeroSCROLLS的Qasper、GovReport、QMSum、NarrativeQA。图12横轴为输入长度、纵轴为答案perplexity;YOCO与Transformer整体较好。Sparse Transformer保持2,048窗口且不改RoPE base,这个对照与其他模型长度扩展方案不同。评估的是答案语言建模分数,不是四项任务的生成准确率或ROUGE。

五:结论、局限与值得继续追问的问题

可靠结论是:共享跨层全局KV在保持全局attention的同时,改变了缓存与prefill的依赖结构;在本论文评估范围内,质量具有竞争力,长序列部署成本显著下降。论文把“高效压缩状态”和“逐token外部记忆”组合起来,而非只选择其中之一。

主要边界如下:

  1. 缓存共享约束了表示:cross-decoder深层可改变query与FFN,但不能写入新的逐层KV。哪些任务特别依赖深层重编码历史,本文没有系统隔离。
  2. 全局缓存仍线性增长:长序列decode仍需访问历史KV;压缩、索引、稀疏检索是未来工作。
  3. 训练与推理成本不同:early exit适用于构建生成所需缓存;完整训练loss并不能据此跳过全部cross-decoder。
  4. 质量证据范围有限:1M单针测试不等于1M多针;公开模型比较不是完全受控;没有普遍的多种子显著性证据。
  5. 系统复现需补充条件:需确认batch、精度、设备数、并行策略、warmup及吞吐统计分子;原文未完整交代。
  6. 实现材料需校验:分块公式与伪代码有前述索引/变量问题,不能直接复制运行。

作者提出YOCO+BitNet+Groq、多模态多self-decoder、KV压缩/索引以及预缓存支持RAG等方向(§5,pp.11–12)。这些是展望,不是本论文已经完成的实验。

本次分析建议的后续实验:在同数据与token预算下单独消融“共享KV”和“gRet混合”;固定batch测prefill、首token与单步decode;在固定目标位置比较不同可见历史长度;用小张量检查并行、递推、分块形式及梯度的一致性。这些建议未在本次研读中执行。

研读交付范围

本笔记基于同版本作者源码与PDF,不是全文翻译;英文幻灯片见 slides.en.pdf,可编辑源文件见 slides.en.tex。图件来自作者原始资源,PDF图仅转为PNG供Markdown显示,没有生成或修改实验数据。