三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

DeepSeek V4 百万 token 上下文背后的注意力革命:CSA + HCA 混合架构深度拆解

DeepSeek V4 百万 token 上下文背后的注意力革命:CSA + HCA 混合架构深度拆解

DeepSeek V4 百万 token 上下文背后的注意力革命:CSA + HCA 混合架构深度拆解


2026 年 8 月,DeepSeek V4-Flash 正式公测,API 价格打到 $0.01/M tokens;而更早发布的 V4-Pro 直接把原生上下文拉到 1M token,输出上限 384K。vLLM 官方博客给出的数字更夸张:同样 1M token 上下文、BF16 精度,V4 的 KV Cache 只要 9.62 GiB,而 V3.2 风格的 61 层 MLA 堆栈需要 83.9 GiB,省了约 88.5%;相比 GQA+BF16 基线,KV Cache 更是只有约 2%。百万 token 从"研究演示"变成"可服务",靠的不是堆显存,而是一场注意力架构的底层革命。智源《2026 十大AI技术趋势》里有一句判断:**推理优化远未触顶**。本文就从 KV Cache 的数学本质出发,把 V4 的 CSA + HCA 混合注意力一层层拆开。


![DeepSeek V4 注意力架构](https://picsum.photos/seed/17861154258883/800/400)


一、先看瓶颈:KV Cache 为什么是"算力墙"前面那堵"带宽墙"


自回归生成每个 token 都要重读全部历史 token 的 K/V,这就是 KV Cache:用空间换时间。标准 MHA 下单请求的显存占用:


Memory_KV = 2 × L × N_kv × d_head × S × b_kv


以 Llama-2-70B 为例(80 层、MHA 64 个 KV 头、每头 128 维、BF16):单 token 就需要 2 × 80 × 64 × 128 × 2B = 2.5 MB,128K 上下文就是 320 GB。即便换成 GQA-8 也还要约 40 GB——和模型权重同量级。更致命的是 Decode 阶段 GPU 是memory-bound:算力在等数据从 HBM 搬过来,真正瓶颈不是"算不完"而是"搬不动"。


二、MLA:把 token 变"瘦"的优雅解法(V2/V3 的贡献)


DeepSeek V2 引入的 MLA(Multi-head Latent Attention)思路很直接:别存完整的 K/V,存低维潜在向量


压缩: c_t = x_t @ W_DKV # [hidden] -> [512] 还原: k_nope = c_t @ W_UK # 训练/Prefill 阶段才需要 v = c_t @ W_UV 缓存: [kv_c(512维), k_pe(64维)] # 每 token 仅 576 维


原始 KV 维度是 128 × 128 = 16384,压缩到 512 + 64 = 576,压缩比 93.3%。最精妙的是"矩阵吸收":Decode 阶段把上采样矩阵 W_UK 吸收进 Q 的投影矩阵,注意力直接对压缩向量做点积,根本不用还原 K/V——数据搬运量接近 MQA,表达能力却保留 MHA 级别。


但 MLA 有一个隐性天花板:它只是把每个 token 变"瘦",没有减少 token 的数量。注意力的复杂度 O(n²) 纹丝不动:上下文从 8K 到 1M,计算量增长 (1M/8K)² ≈ 15625 倍。MLA 解决了"存",没解决"算"。


三、V3.2 的过渡:NSA 稀疏索引器


V3.2 的 Native Sparse Attention(NSA/DSA)迈出第一步:维护一份 FP8 量化的索引 K Cache 快速打分,TopK 选出 top-2048 个 token 做精确 MLA,其余全部跳过。它证明了稀疏性可行,但有两个硬伤:索引器本身 `q @ k_cache.T` 仍是 O(N) 全量扫描;且压缩后的 576 维潜在向量依然全量存储。它只是 MLA 框架内的补丁。


四、V4 的答案:CSA + HCA 混合注意力


V4 干脆重写注意力,三管齐下:物理压缩 token 数量K=V 共享直接减半缓存逆 RoPE 恢复平移不变性。61 层注意力 = 30 层 c4a(CSA)+ 31 层 c128a(HCA),每层都带 128-token 滑动窗口。


4.1 CSA(Compressed Sparse Attention):精确检索型注意力


CSA 分三步:压缩 → 闪电索引 → 局部注意力。


第一步,压缩(等效 4x):每个压缩 token 是 8 个原始 token 的加权和、步长 4(相邻块重叠 4 个 token,避免跨边界信息丢失)。1M token → 约 250K 压缩条目:


import numpy as np def compress_tokens(h: np.ndarray, stride: int = 4, width: int = 8): """CSA 风格重叠压缩: 每 width 个 token 加权和, 步长 stride. h: [seq, d] 原始隐状态 返回压缩 token 列表, 每个覆盖 [4j-4, 4j+3], RoPE 锚点 4j """ seq, d = h.shape compressed = [] for j in range(0, seq, stride): lo, hi = max(0, j - stride), min(seq, j + width - stride) block = h[lo:hi] weights = np.linspace(0.5, 1.0, len(block)) # 示例: 软加权 weights /= weights.sum() compressed.append((weights[:, None] * block).sum(axis=0)) return np.stack(compressed) if compressed else np.zeros((0, d)) h = np.random.randn(1_000_000, 512).astype(np.float32) c = compress_tokens(h) print(f"原始 {h.shape[0]} token -> 压缩 {c.shape[0]} token (等效 {h.shape[0]/c.shape[0]:.1f}x)")


第二步,闪电索引器(top-512):用 FP4 精度存索引 KV(比 FP16 小 4 倍),用 ReLU-scored 点积打分(比 softmax 快),每个 query 只保留 top-512 个最相关压缩块——V3.2 的 DSA 要 2048,这里砍到 512。


第三步,滑动窗口(128):保留最近 128 个未压缩 token 的逐 token 注意力,保证因果性约束下局部信息不丢。


算一笔账:等效 4x 压缩 + top-512 稀疏 + 128 窗口,每个 query 实际只关注约 640 个 token,相比全量 1M,计算节省约 1500 倍。还有个意外收获:top-k 硬截断天然去噪——百万上下文里海量无关 token 的微小注意力累加正是幻觉来源之一,一刀切掉。


4.2 HCA(Heavily Compressed Attention):全局语义型注意力


HCA 走另一条路:128x 压缩、不做稀疏选择。每个压缩 token 是 128 个原始 token 的加权和、步长 128(无重叠)。1M token 压缩后只剩约 8K 条目,top-k 直接设 8192 全覆盖,等价于对全局的"稠密注意力"。计算量从 O(n²) 降到 O(n²/128)。


设计哲学是对称的:c128a 层建"全局地图"(速览全文),c4a 层做"精准定位"(精读关键段)——就像人读长文档,先翻目录再查细节。


4.3 K=V 共享 + 逆 RoPE:缓存再减半


V4 让 K 和 V 用同一个向量(shared_kv),KV Cache 直接砍半。但 K 加过 RoPE 后,注意力输出会携带绝对位置信息、破坏平移不变性,所以输出端要施加逆 RoPE:`R(-i)·a_i = Σ w_p·R(j_p - i)·k_{j_p}`。SWA 缓存格式是 FP8 的 584B/token(NoPE 448B + RoPE 64B + scale)。


五、配套工程:mHC、FP4 QAT 与 Muon


架构之外,V4 还有三招:


• **mHC(Manifold-Constrained Hyper-Connections)**:用可学习的流形约束超连接替代残差流,层间通道拓宽 4 倍(n_hc=4),混合矩阵约束在 Birkhoff 多胞体上(双随机矩阵,每行每列和为 1),谱范数上界为 1——61 层深网训练不炸的数值保障。

• **FP4 QAT**:MoE 专家权重和 CSA 索引器直接在 4bit 感知训练下量化(不是事后 PTQ),1.6T 总参数、49B 激活的 V4-Pro 才扛得住存储与部署。

• **Muon 优化器**:主体参数用 Muon(Newton-Schulz 正交化保证梯度良态),Embedding 用 AdamW。


六、落到工程:vLLM 怎么接


V4 在 vLLM 里是全新的组件体系:`deepseek_compressor.py`(压缩器)、`sparse_swa.py`(滑动窗口缓存)、`deepseek_v4_attention.py`(注意力核心),配 Triton/CUDA 融合算子。Day-0 支持(SGLang + Miles 同步上线)意味着这套架构从论文到生产只用了 24 小时。部署示例:


# vLLM 0.11+ 直接服务 V4-Flash(FP4 专家权重 + CSA/HCA) python -m vllm.entrypoints.openai.api_server \ --model deepseek-ai/DeepSeek-V4-Flash \ --max-model-len 1048576 \ --quantization fp4 \ --tensor-parallel-size 8


七、小结:一条"瓶颈驱动"的进化线


回头看 DeepSeek 五代演进,每一代只解决一个核心瓶颈:V1 验证能力 → V2 用 MLA 打掉带宽瓶颈(推理成本降 90%+)→ V3 极致 MoE 打掉训练成本 → V3.2 用 NSA 试水稀疏 → V4 用 CSA+HCA 正面拆掉 O(n²) 的算力墙,让 1M context 的 KV Cache 降到 GQA 基线的 2%。


启示很明确:当上下文走向百万级,注意力优化的主战场从"把 token 变瘦"转向"把 token 变少"。压缩 + 稀疏 + 混合层级分配,正在成为长上下文时代的标配范式。推理优化的路还远没到头——这也正是 2026 年最值得下注的底层方向。


← 返回列表