从 8K 到 1M token 的长上下文之路:NSA → DSA → V4 → GLM IndexShare → LongCat → MiniMax MSA,以及视频 DiT 的探索
Contents
随着上下文从 8K 扩展到 128K、200K 乃至 1M token,标准 full attention 的三大瓶颈急剧放大:
稀疏化是这条演进路线上的必然选择:只让每个 query 访问少数最相关的历史 token,把 O(n²) 的 full attention 降低到接近 O(n·k),其中 k ≪ n。
NSA 是最早将稀疏注意力做成端到端可训练基础模块的方法,基于 GQA 架构,设计了三条并行分支:
对历史 KV 做粗粒度压缩,block size=32,stride=16。提供全局上下文视野,成本低。
基于当前 query 从历史 block 中选 top-k,block size=64,n=16 blocks。提供细粒度精确检索。
保留最近 w=512 token 的局部窗口,保证局部语言连续性。
下图展示 NSA 三分支在注意力矩阵上的覆盖模式(token 序列长 N,当前 query 位于最后几行):
每个 query 看所有历史
粗粒度压缩块覆盖全程
top-k block 稀疏选择
局部滑动窗口
压缩 + 选择 + 窗口并行
| 参数 | 值 | 含义 |
|---|---|---|
| Compression block size l | 32 | 多少 token 压成一个 compressed KV |
| Compression stride d | 16 | 压缩块滑动步长 |
| Selected block size l' | 64 | 精确检索的粒度 |
| Selected block count n | 16 | 每 query 选多少 block |
| Sliding window w | 512 | 局部窗口 token 数 |
| 实际 attend token(selected) | 1024 | 16 × 64 |
NSA 局限:是 block 级别检索,无法精确定位单个重要 token;但 block 粒度索引次数少,硬件访存更连续,适合从训练阶段引入。
DSA 由 DeepSeek-V3.2-Exp 引入,接在 MLA(Multi-head Latent Attention) 上,核心是两步 token 级精确检索:
轻量 attention 打分头,对全量历史 token 计算相关性分数,成本低但仍是 O(n)。
每 query 选 top-k=2048 历史 token,主 MLA attention 只在这些 token 上计算。上下文无论多长,主 attention 成本固定。
扫描全量历史(轻量)
只看 top-k token(token 级精确)
DSA 的关键优势:decode 时主 attention 只看固定 k=2048 个 token,与上下文总长无关——无论 128K 还是 1M,计算量相同。
但 indexer 本身仍要扫描全量历史,top-k 操作和分散 gather 带来新的系统瓶颈,这催生了后续 GLM、LongCat、V4、MiniMax 的改进。
DeepSeek-V4 引入 hybrid attention,将 CSA 和 HCA 在不同层交替使用:
先 4x 压缩 KV(4 token → 1 entry),再在压缩序列上做 top-k sparse selection。搜索空间缩小 4x,检索仍有较高精度。
激进的 128x 压缩,在极短压缩序列上做 dense attention。不追求精确检索,提供极低成本的全局摘要通道。
4x 压缩后 sparse select
128x 压缩后 dense attend
CSA / HCA / Window 交替
graph LR
subgraph V4["DeepSeek-V4 Hybrid Layers"]
L1["Layer N\nCSA\n(精确检索)"] --> L2["Layer N+1\nHCA\n(全局摘要)"] --> L3["Layer N+2\nLocal Window\n(局部连续)"] --> L4["Layer N+3\nCSA..."]
end
KV["原始 KV Cache"] -->|"4x 压缩"| CSA_C["压缩 KV\n(1/4 长度)"]
KV -->|"128x 压缩"| HCA_C["极压 KV\n(1/128 长度)"]
CSA_C --> L1
HCA_C --> L2
KV --> L3
GLM-5.2 在 DSA 基础上提出 IndexShare:相邻 Transformer 层的 token 重要性高度相关,可以共享同一组 selected indices,大幅减少 indexer 运行次数。
4层,每层独立运行 indexer
1次 indexer,4层复用 indices
graph TD Q["Query (1M context)"] Q --> IDX["Lightning Indexer\n(运行 1 次)"] IDX --> TOPK["Top-k Indices"] TOPK --> L1["Layer N Attention"] TOPK --> L2["Layer N+1 Attention"] TOPK --> L3["Layer N+2 Attention"] TOPK --> L4["Layer N+3 Attention"] L1 -. "各层自己算 attention weights" .-> OUT["输出"] L2 --> OUT L3 --> OUT L4 --> OUT
潜在风险:共享 indices 降低每层选择自由度。GLM-5.2 选择每 4 层共享(而非更多)正是在表达能力和效率之间取得平衡。
LongCat-Flash 与 LongCat-2.0 在 DSA/GLM 基础上进一步工程化,提出三项改进:
选 token/block 时考虑硬件访存,避免 selected KV 过于碎片化,尽量变成连续/可合并的内存读取。
相邻层 attention saliency 稳定,一次 index 可给多层使用。与 GLM-5.2 IndexShare 同源思路。
先粗粒度 block recall,再在候选 block 内做细粒度 token 选择。避免对全量 token 做高成本 top-k。
先选候选 block
候选 block 内 token 级 top-k
MSA 基于 GQA,结构最为简洁:仅两支,避免 NSA 三支并行的复杂度,专注于 block-level 连续访存:
为每个 query / GQA group 选择 top-k block,k=16 blocks(每 block 128 tokens)。
只对被选中的 block 做精确 softmax attention。实际 attend = 16 × 128 = 2048 tokens,与上下文总长无关。
16 个 block × 128 tokens
block sparse(左)vs token sparse(右)
MSA 的工程优势:block 粒度保证连续访存,kernel 实现简洁,在 H800 等 GPU 上实测加速效果明显。
| 方法 | 架构基础 | 主要粒度 | 核心创新 | 适合场景 |
|---|---|---|---|---|
| NSA | GQA | compressed + selected + window (block) | 端到端可训练三分支,hardware-aligned | 训练推理统一的长上下文基础模块 |
| DeepSeek DSA | MLA / MQA | token / fine-grained top-k | Lightning Indexer + 固定 k=2048 主 attention | MLA 模型降低长上下文 attention 成本 |
| DeepSeek-V4 CSA/HCA | MQA | compressed block top-k / heavily compressed | 4x/128x 压缩 + CSA/HCA 层间交替 | 1M token 级上下文和多粒度记忆 |
| GLM-5.2 IndexShare | MLA / MQA+ | token top-k + cross-layer shared indices | 每 4 层共享 indexer,降低 top-k 打分成本 | 长上下文 agent / coding,indexer 成本显著时 |
| LongCat-Flash/2.0 | MLA / MQA+ | GLM++ 三项工程优化 | SI + CLI + HI,流式感知 + 层级 indexing | 代码 agent、仓库级输入、长上下文产品 |
| MiniMax MSA | GQA | block-level top-k | 简洁双支,连续 block 访存,kernel 友好 | 生产部署,H800 等 GPU 真实加速 |
新方法不再把上下文视为等价 token 数组,而是分成多种记忆形态:
最近几十到几百 token,精确访问
关键历史片段,top-k 精确检索
全局背景,压缩 dense memory
以及 Cross-layer cached indices:高频复用的 top-k 候选集,跨层/跨步共享。
DSA 之后,主 attention 成本大幅下降,但 indexer 的全历史打分、top-k 操作、候选 gather 变成新的系统瓶颈。
本质都在回答同一个问题:如何让 indexer 更便宜、候选更连续、KV 更少、跨层更可复用?
两条路线:
先压缩 KV,再稀疏选择;或压缩到足够短后 dense attend。代表:DeepSeek-V4。
不先压缩,让模型或 index branch 选择少数 block。代表:MiniMax MSA。
未来长上下文架构很可能不是 pure sparse 或 pure compression,而是多种记忆并存。
10.4 训练阶段原生支持比后验稀疏更重要。NSA、DeepSeek、GLM、LongCat、MiniMax 都倾向在 continued training / mid-training 中引入稀疏机制。硬改成 sparse 往往损失长程能力。
视频和 NLP 都是长序列建模,sparse attention + SWA 在视频里是合理方向;但视频 token 数量和 diffusion 推理方式让 LLM 式 token-level sparse 很难直接搬过来。
基本结构可以是:local window(短程)+ sparse memory(远程一致性)
不动 DiT 架构,不引入新 indexer
full attention → block sparse + SWA
实验设置:wan1.3b(128×128, 前5s推5s)、wan5b(128×128, 前10s推20s),对比不同 KV Cache 策略。
| 方法 | KV 压缩比 | 描述 | 细节质量 |
|---|---|---|---|
| MHA full hist | 1x(无压缩) | 完整历史 KV Cache,基准 | 最好 |
| MQA | ~num_heads x | Multi-Query Attention | 下降 |
| kv3d c8 | 8x | 对 KV Cache 做 8 倍压缩 | 明显下降 |
| kv3d 122 266 | 4x | 对 KV Cache 做 4 倍压缩 | 下降 |
MQA 或压缩都对回访的细节影响很大——数值指标难以反映细节好坏的差异。
静态回访任务处于 retrieval 表达能力范围内,但 retrieval 不能解决动态 memory 能力。需要设计能体现访问历史 KV Cache 优越性的场景。
2D 炸毁地图障碍物小游戏(动态 memory 任务):无法靠静态记忆完成的任务(需安放炸弹、引爆炸弹,追踪动态状态)。
结论:记录所有 KV Cache 是学会动态 memory 的必要条件。直接训练 sparse 会爆炸(训练不稳定)。
| 配置 | 顺序 | 动态任务表现 |
|---|---|---|
| GT(Ground Truth) | 从左 | 完整动态记忆 |
| sparse + first frame + SWA | 中 | 部分动态能力 |
| first frame + SWA(无 sparse) | 从右 | 缺失动态记忆 |