11. DeepSeek 稀疏注意力( DSA )专题¶
⚠️ 时效性说明:本章涉及前沿模型/价格/榜单等信息,可能随版本快速变化;请以论文原文、官方发布页和 API 文档为准。
📌 定位说明:本章用于补齐 2025-2026 大模型前沿中的“DSA ( DeepSeek Sparse Attention )”认知缺口。内容基于公开资料与工程抽象进行讲解,重点是可理解、可对比、可落地,不等价于厂商内部未公开实现细节。
✅ 外部核验( 2026-02 ): - DeepSeek-V3.2-Exp 模型页(含 DSA 说明): https://huggingface.co/deepseek-ai/DeepSeek-V3.2-Exp - DeepSeek API 官方新闻( V3.2-Exp ): https://api-docs.deepseek.com/news/news250929 - 稀疏注意力相关论文( NSA , arXiv:2502.11089 ): https://arxiv.org/abs/2502.11089
⚠️ 边界声明: DSA 的完整实现细节并未全部公开,本章不对未公开内部实现作确定性断言。
目录¶
- 11. DeepSeek 稀疏注意力( DSA )专题
- 目录
- 1. 为什么需要 DSA
- 2. DSA 的核心思想
- 3. DSA 与 FlashAttention/MLA/GQA 的关系
- 4. 计算复杂度与显存开销分析
- 5. 简化实现:从 Dense 到 Sparse
- 6. 工程落地:训练与推理的注意事项
- 7. 面试高频问答
- 8. 本章小结与实践任务
- 相关阅读(建议)
1. 为什么需要 DSA¶
长上下文时代,标准注意力的核心瓶颈仍是:
- 计算复杂度随序列长度近似二次增长;
- 注意力分数矩阵尺寸大,带来显著显存和带宽压力;
- 在推理场景下,长序列 + 高并发会让延迟和吞吐难以同时满足。
在工程实践中,我们通常组合三类手段:
- Kernel 优化:如 FlashAttention ,降低 IO 开销;
- 缓存/调度优化:如 KV Cache 、 PagedAttention 、连续批处理;
- 结构层优化:如 GQA/MQA 、稀疏注意力(包括 DSA 方向)。
DSA 属于第 3 类:在注意力“连边结构”上做稀疏化,让每个 token 只与更关键的 token 交互,从而降低总体开销。
2. DSA 的核心思想¶
可以把 DSA 理解为“结构化 + 动态性兼顾”的稀疏注意力范式(教学抽象):
- 结构化稀疏:保留局部窗口、关键锚点(如全局 token )等稳定连接;
- 动态稀疏:根据当前输入特征,对候选连接进行选择;
- 精度保护:在关键位置保持高信息通路,避免简单截断导致质量显著下降。
一个常见思路如下:
- 先定义基础连接(局部窗口 + 全局 token );
- 再从剩余候选中基于打分选择 top-k ;
- 最终仅在稀疏连接上计算注意力。
这类设计的工程目标是:
- 相比全连接注意力,显著减少无效计算;
- 相比纯固定稀疏模式,提升输入自适应能力;
- 与 FlashAttention 、 KV Cache 、 GQA 等优化兼容。
3. DSA 与 FlashAttention/MLA/GQA 的关系¶
很多同学会把这些技术混在一起。可用“层次视角”区分:
| 技术 | 优化层次 | 主要作用 | 是否可组合 |
|---|---|---|---|
| DSA (稀疏注意力) | 算法结构层 | 减少注意力连边数量 | ✅ |
| FlashAttention | Kernel/IO 层 | 减少中间矩阵写回与显存访问 | ✅ |
| GQA/MQA | 注意力头参数化层 | 降低 KV 存储与访存开销 | ✅ |
| MLA | 注意力表示层 | 通过潜在空间压缩降低成本 | ✅ |
| PagedAttention | 推理内存管理层 | 提升 KV Cache 分配和并发效率 | ✅ |
结论: DSA 不是替代 FlashAttention/GQA/MLA ,而是可与它们叠加。
4. 计算复杂度与显存开销分析¶
设序列长度为 \(n\),每个 token 平均只保留 \(k\) 条注意力连接(\(k \ll n\)):
- Dense Attention :连接数约为 \(n^2\);
- Sparse Attention (理想化):连接数约为 \(n \cdot k\)。
当 \(k\) 远小于 \(n\) 时,理论计算规模可由二次下降到近似线性增长。
但在真实系统中要考虑:
- 稀疏索引维护与 gather/scatter 额外开销;
- kernel 对稀疏模式的支持程度;
- 稀疏策略导致的访存不连续性。
因此评估时要看“端到端收益”,而不只看 FLOPs 。
5. 简化实现:从 Dense 到 Sparse¶
下面给出教学用伪代码(强调思路,不代表生产最优实现):
import torch
import torch.nn.functional as F
def build_sparse_mask(seq_len: int, window: int, topk_idx: torch.Tensor) -> torch.Tensor:
"""
构建稀疏掩码(True 表示可见)
topk_idx: [seq_len, k],每个位置额外可见的索引
"""
mask = torch.zeros(seq_len, seq_len, dtype=torch.bool)
# 1) 局部窗口连接
for i in range(seq_len):
left = max(0, i - window)
right = min(seq_len, i + window + 1)
mask[i, left:right] = True
# 2) 动态 top-k 连接
row_ids = torch.arange(seq_len).unsqueeze(-1) # unsqueeze增加一个维度
mask[row_ids, topk_idx] = True
# 3) 自身连接
mask.fill_diagonal_(True)
return mask
def sparse_attention(q: torch.Tensor, k: torch.Tensor, v: torch.Tensor, mask: torch.Tensor):
"""
q, k, v: [B, H, N, D]
mask: [N, N]
"""
scale = q.size(-1) ** -0.5
scores = torch.einsum('bhnd,bhmd->bhnm', q, k) * scale
# 不可见位置置为 -inf
scores = scores.masked_fill(~mask.unsqueeze(0).unsqueeze(0), float('-inf'))
probs = F.softmax(scores, dim=-1)
out = torch.einsum('bhnm,bhmd->bhnd', probs, v)
return out
实际工程中通常会进一步把稀疏模式与高性能 kernel 结合,避免在 dense 矩阵上“先算后屏蔽”。
6. 工程落地:训练与推理的注意事项¶
6.1 训练阶段¶
- 从 dense warmup 到 sparse:先稳定训练,再逐步引入稀疏约束,避免早期收敛震荡;
- 监控稀疏连接分布:防止连边过于集中,导致信息瓶颈;
- 对齐评测集:重点跟踪长文本任务、检索增强任务、推理任务的质量变化。
6.2 推理阶段¶
- 与 KV Cache / PagedAttention 联动评估,关注吞吐与 P99 延迟;
- 在不同上下文长度( 4K/16K/32K/128K )分别压测;
- 评估“单位成本质量”:同质量下是否显著降低显存占用和推理成本。
6.3 与现有栈的兼容性建议¶
- 若你已有 FlashAttention + GQA :优先做小规模 A/B ,验证稀疏策略收益;
- 若你场景以短上下文为主: DSA 收益可能不如长上下文明显;
- 若你追求高并发服务:优先关注 DSA 与调度/缓存系统的协同效果。
7. 面试高频问答¶
Q1 : DSA 和 FlashAttention 的本质区别¶
答: DSA 是“连边结构优化”(减少要算的边), FlashAttention 是“kernel/IO 优化”(更高效地算这些边)。两者可叠加,不冲突。
Q2 : DSA 一定比 Dense 好吗¶
答:不一定。序列较短、稀疏 kernel 不成熟或访存不连续时,收益可能不明显;需要端到端压测。
Q3 :怎么判断 DSA 值不值得上生产¶
答:用统一评测集比较质量(准确率、鲁棒性)与系统指标(吞吐、 P99 、显存、成本),在“质量约束不退化”下再看收益。
8. 本章小结与实践任务¶
本章小结¶
- DSA 是长上下文时代的重要稀疏注意力方向;
- 它解决的是“算哪些边”,而 FlashAttention 解决的是“这些边怎么高效算”;
- 在工程上应与 GQA/MLA/KV Cache/PagedAttention 联合评估。
实践任务¶
- 在一个小型 Transformer 上实现“局部窗口 + top-k”稀疏掩码;
- 对比 dense vs sparse 的显存峰值、吞吐、 P99 延迟;
- 在 4K/16K/32K 上下文下做质量-性能曲线;
- 输出一份“是否上线 DSA”的技术决策文档(含回滚策略)。
附录 A : DeepSeekMoE 架构详解¶
📌 来源参考:本节内容综合自 DeepSeekMoE 论文及 Datawhale《Unlock DeepSeek》教程。
A.1 MoE 架构基础¶
混合专家模型(Mixture of Experts, MoE)的核心思想是将大模型分解为多个专门化的子网络("专家"),通过门控网络(Router)动态选择最相关的专家处理输入。
MoE 核心组件:
├── 专家网络(Experts):通常是 FFN 层的副本
├── 门控网络(Router/Gating):决定 token 发送给哪些专家
├── 路由策略:Top-K、专家选择(Expert Choice)等
└── 负载均衡:防止路由崩溃(某些专家被过度使用)
MoE 输出公式:
y = Σᵢ G(x)ᵢ · Eᵢ(x)
其中 G(x) 是门控权重,Eᵢ(x) 是专家 i 的输出
A.2 DeepSeekMoE 的两大创新¶
创新1:细粒度专家分割(Fine-Grained Expert Segmentation)
├── 将每个专家的 FFN 中间隐藏维度缩小为 1/m
├── 专家数量增加到 m 倍,激活数量也增加到 m 倍
├── 组合数从 C(N, K) 指数级增长
│ 例:16 专家 top-2 → 120 种组合
│ 64 专家 top-8 → 超过 40 亿种组合
└── 每个专家更专注,知识分离更彻底
创新2:共享专家隔离(Shared Expert Isolation)
├── 隔离 Nₛ 个专家为"共享专家"
├── 共享专家始终激活,捕获通用知识
├── 路由专家专注于专业化知识
└── 减少路由专家间的冗余
A.3 DeepSeekMoE 层输出公式¶
其中: - \(u_{l,t}\) 是 MoE 层输入 - \(N_s\) 是共享专家数量 - \(N_r\) 是路由专家数量 - \(g_{i,t}\) 是门控值(基于 top-K 路由计算)
A.4 负载均衡策略¶
DeepSeek MoE 负载均衡:
├── 专家级平衡损失: L_ExpBal = α₁ · Σ fᵢ · Pᵢ
├── 设备级平衡损失: L_DevBal = α₂ · Σ f'ᵢ · P'ᵢ
├── 无辅助损失策略(DeepSeek-V3):
│ └── 基于最近负载动态调整每个专家的偏置
└── 专家选择路由(Expert Choice):
└── 专家主动选择最适合的 token,天然负载均衡
附录 B :多头潜在注意力(MLA)¶
📌 来源参考:本节内容综合自 DeepSeek-V2/V3 论文及 Datawhale《Unlock DeepSeek》教程。
B.1 MLA 解决的问题¶
标准 MHA 的 KV Cache 问题:
├── 每层需要缓存所有 token 的 K 和 V
├── 长序列 + 多层 → KV Cache 占用巨大
├── 例:LLaMA-7B, seq=2048 → KV Cache ≈ 1GB
└── 推理时内存带宽成为瓶颈
GQA 的折中:
├── 减少 KV 头数,但信息损失
└── 是一种"有损压缩"
MLA 的思路:
├── 将 KV 压缩到低维潜在空间
├── 缓存的是压缩后的潜在向量(远小于原始 KV)
├── 推理时从潜在向量还原 KV
└── 实现接近无损的压缩
B.2 MLA 核心公式¶
MLA 注意力计算流程:
1. 压缩:将输入投影到低维潜在空间
c_t = W_dk · h_t (压缩 KV 到潜在向量)
2. 还原:从潜在向量还原 K 和 V
k_t = W_uk · c_t (还原 K)
v_t = W_uv · c_t (还原 V)
3. 注意力计算:标准 Attention
Attention(Q, K, V) = Softmax(QK^T / √d) · V
缓存策略:
├── 训练时:缓存 c_t(低维),推理时还原
├── 推理时:同样缓存 c_t,按需还原 KV
└── 缓存大小 = 压缩维度 × seq_len × num_layers × 2
B.3 MLA vs GQA vs MHA 对比¶
| 特性 | MHA | GQA | MLA |
|---|---|---|---|
| KV 头数 | h | g (g < h) | 压缩到潜在空间 |
| 缓存内容 | 原始 K, V | 原始 K, V | 压缩潜在向量 |
| 信息保留 | 完整 | 有损(头合并) | 近似无损(可还原) |
| 缓存大小 | 最大 | 中等 | 最小 |
| 适用模型 | GPT-3, LLaMA | LLaMA-2, Mistral | DeepSeek-V2/V3 |
📝 本章练习¶
🤔 思考题¶
- MLA vs MHA:Multi-Head Latent Attention (MLA) 相比标准 Multi-Head Attention 减少了多少 KV Cache?压缩比是多少?
- 稀疏注意力:DeepSeek 的 Native Sparse Attention (NSA) 中的"稀疏"体现在哪里?如何保证稀疏化后的信息不丢失?
- DSA 架构:DeepSeek 的 MLA + MoE 组合架构为什么能在保持高性能的同时大幅降低推理成本?
💻 代码实践¶
- 入门:实现一个简化的 MLA 层,对比与标准 MHA 的 KV Cache 大小差异
- 进阶:实现 Top-K 稀疏注意力,在长序列上对比与全注意力的速度和精度差异
💡 参考答案
#### 思考题参考答案 **1. MLA vs MHA** MLA 通过将 KV 压缩到低维潜在空间,KV Cache 大小减少约 **4-8 倍**。 - MHA:缓存所有头的完整 K、V(维度 d_model × num_layers × 2) - MLA:只缓存压缩后的潜在向量(维度 d_latent << d_model) 压缩比取决于潜在维度 d_latent 的选择,DeepSeek-V2 中约 4 倍压缩。 **2. NSA 稀疏注意力** "稀疏"体现在:不是对所有 Token 计算注意力,而是选择性地关注重要的 Token 子集。 保证信息不丢失的方法: - 分块策略:将序列分块,块内全注意力,块间稀疏 - 重要 Token 保留:通过路由机制识别关键 Token - 累积信息:通过压缩向量保留历史信息摘要 **3. MLA + MoE 组合** - **MLA**:减少 KV Cache → 推理时显存需求大幅降低 → 支持更大 Batch Size - **MoE**:只激活部分 Expert → 计算量远小于参数量 → 推理速度快 - 组合效果:参数量大(知识多)但推理成本低(MLA 降显存 + MoE 降计算)相关阅读(建议)¶
- LLM 学习/01-基础巩固/02-注意力机制详解
- LLM 学习/04-前沿探索/04-模型架构创新
- 模型优化/12-FlashAttention 原理与实现
- 模型优化/13-推测解码与推理加速
- DeepSeekMoE 论文:Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models
- DeepSeek-V2 论文:A Strong, Economical, and Efficient Mixture-of-Experts Language Model
最后更新日期: 2026-04-21 适用版本: LLM 学习教程 v2026