摘要:本文在 Decoder-only Transformer、LLaMA 架构与 DeepSeekMoE 架构的基础上,系统介绍 DeepSeek-V2 的架构设计及与 MHA/GQA/MQA、LLaMA、Mixtral 等主流架构的对比。内容包括:DeepSeek-V2 的整体定位(236B 总参数、21B 激活、128K 上下文)、Multi-head Latent Attention(MLA)的低秩 K-V 联合压缩与解耦 RoPE、DeepSeekMoE 在 V2 中的使用及设备受限路由与负载均衡、模型超参与长上下文扩展(YaRN),以及与其他架构的对比表。旨在帮助读者理解 DeepSeek-V2 如何通过「省 KV 缓存」与「省激活计算」同时实现经济训练与高效推理。
关键词:DeepSeek-V2;MLA;Multi-head Latent Attention;低秩 K-V 压缩;解耦 RoPE;DeepSeekMoE;KV cache;大语言模型
论文:DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model(DeepSeek-AI, 2024)
💡 理解要点:DeepSeek-V2 是在 Decoder-only Transformer 骨架下,同时革新注意力与 FFN 的 MoE 大模型:用 MLA 大幅压缩 KV cache、用 DeepSeekMoE 做稀疏 FFN。相比 DeepSeek 67B,训练成本省 42.5%、KV cache 降 93.3%、最大生成吞吐约 5.76×,且仅用 21B 激活参数即可达到开源第一梯队表现。
1. 概述:DeepSeek-V2 在 Transformer 家族中的位置
DeepSeek-V2 仍属 Decoder-only 架构:每层由注意力模块 + FFN(此处为 MoE)组成,无 Encoder、无交叉注意力。与 Decoder Only Transformer 和 LLaMA 相比,其两大创新为:
- 注意力:用 Multi-head Latent Attention(MLA)替代标准 MHA。MLA 通过低秩 K-V 联合压缩把推理时的 KV cache 从 $2n_h d_h l$ 压到约 $(d_c + d_h^R) l$,并配合解耦 RoPE 使推理时无需为前缀 token 重算 key,从而显著提升推理吞吐与长上下文能力。
- FFN:用 DeepSeekMoE 替代稠密 FFN,通过细粒度专家切分与共享专家隔离,在总参数 236B、每 token 仅激活 21B 的前提下达到强性能。

因此,单层 DeepSeek-V2 的数据流可概括为:归一化 → MLA(含解耦 RoPE)→ 残差 → 归一化 → DeepSeekMoE → 残差。其他细节(如层归一化、激活函数)与 DeepSeek 67B 保持一致;除非特别说明,下文均沿用 LLaMA 架构中的符号与维度约定。
🔍 实际例子:若序列长度 L = 4096、隐藏维度 d = 5120、层数 l = 60,则标准 MHA 每 token 的 KV cache 约为 $2 \times 128 \times 128 \times 60 \approx 196$ 万元素;MLA 下仅缓存 $d_c + d_h^R$ 维的潜在向量与解耦 key,每层约 $512 + 64 = 576$ 维,总约 $576 \times 60 \approx 3.5$ 万元素,约为前者的 1/56。
下文先详述 MLA 的动机与数学形式,再简述 DeepSeekMoE 在 V2 中的配置与路由/均衡设计,最后给出超参、长上下文与架构对比。
2. Multi-head Latent Attention(MLA):动机与标准 MHA 回顾
2.1 标准 MHA 的符号与维度(简要复习)

设当前层输入为 $\mathbf{h}_t \in \mathbb{R}^d$(t 为 token 位置,d 为隐藏维度),头数 $n_h$,每头维度 $d_h$(满足 $d = n_h d_h$)。MHA 先得到:
$$\mathbf{q}_t = W^Q \mathbf{h}_t, \quad \mathbf{k}_t = W^K \mathbf{h}_t, \quad \mathbf{v}_t = W^V \mathbf{h}_t,$$
其中 $W^Q, W^K, W^V \in \mathbb{R}^{d_h n_h \times d}$。将 $\mathbf{q}t, \mathbf{k}t, \mathbf{v}t$ 按头切分为 $\mathbf{q}{t,i}, \mathbf{k}{t,i}, \mathbf{v}{t,i} \in \mathbb{R}^{d_h}$,则第 i 头的注意力输出为:
$$\mathbf{o}{t,i} = \sum{j=1}^{t} \mathrm{Softmax}j\left( \frac{\mathbf{q}{t,i}^T \mathbf{k}{j,i}}{\sqrt{d_h}} \right) \mathbf{v}{j,i},$$
最终输出 $\mathbf{u}t = W^O [\mathbf{o}{t,1}; \ldots; \mathbf{o}{t,n_h}]$。推理时需要缓存所有位置的 $\mathbf{k}{j,i}, \mathbf{v}_{j,i}$,即每 token 每层 $2 n_h d_h$ 个元素,共 $2 n_h d_h \cdot l$。
2.2 为什么需要压缩 KV cache?
在自回归生成时,模型需要缓存所有已见 token 的 Key 和 Value,以便在生成下一个 token 时与当前 Query 做注意力。标准 Multi-Head Attention(MHA)下,每层、每 token 需缓存 $n_h$ 个头的 K、V,即 $2 n_h d_h l$ 个元素($n_h$ 为头数,$d_h$ 为每头维度,l 为层数)。长序列、大模型时,KV cache 成为显存与带宽瓶颈,限制 batch 大小与序列长度,从而限制推理吞吐。
首先,为什么只缓存 K/V,不缓存 Q?
第 t 步的注意力大致形如:$\mathrm{Attn}t = \mathrm{softmax}(Q_t K{1:t}^\top / \sqrt{d_h}) V_{1:t}$。我们可以看到, $Q_t$ 只依赖'当前这一个 token'的隐藏状态 $\mathbf{h}t$,而你每生成一个新 token 都会重新算一次 $\mathbf{h}t$,顺带重新算一遍 $Q_t$ 成本非常小;并且 $Q_t$ 只在这一刻用一次,用完就可以丢弃。 $K{1:t}, V{1:t}$ 则依赖所有历史 token:后续第 t+1 步仍然需要和这些历史位置做注意力,如果不缓存,就要在每一步把前缀所有 token 从头 forward 到当前层再算一遍 K/V,会非常浪费算力。
我们再解释地更进一步:在 decoder-only 的自回归生成里,第 t 步只能「看见」位置 1 到 t 的 token(掩码),所以参与注意力的 Key、Value 就是这 t 个位置的表示——把它们按位置堆叠成矩阵,就记作 $K_{1:t}$ 和 $V_{1:t}$(形状分别为 $t \times d_h$);当前步的 Query 只有当前位置的 $Q_t$(形状 $1 \times d_h$)。于是注意力分数 $Q_t K_{1:t}^\top$ 表示「当前位置对每个历史位置的相关性」,softmax 后对 $V_{1:t}$ 做加权求和,得到当前步的注意力输出。直观上就是:用当前 token 提一个问题($Q_t$),到历史记忆($K_{1:t}, V_{1:t}$)里检索并汇总。
所以工程上采用的策略是:每个新 token 现算 Q、现算它自己的 K/V,并把这一步的 K/V 追加到缓存里;后面再也不重算历史 token 的 K/V。这也是公式里只统计 K/V 缓存、不统计 Q 的原因。
我们再来回答,为什么必须'缓存',而不是每一步都重算所有 K/V?
因为,如果不缓存,第 t 步你要对 1…t 所有 token 重算一遍当前层的隐藏状态和 K/V,相当于每一步都在做一次「长度为 t 的全序列前向」,生成一整句的整体复杂度会从「注意力本身的 $O(L^2)$」变成更糟糕的级别。有了缓存之后,第 t 步只对新增的这个 token 做一遍前向,拿到当前层的 $K_t, V_t$ 加进缓存,然后直接用缓存中的 $K_{1:t}, V_{1:t}$ 做注意力即可,前缀部分完全不用重算,大幅降低生成时的实际 FLOPs。
换个直观比喻:$Q_t$ 像你当前输入的一条查询语句,用完就丢;$K/V$ 像已经构建好的「数据库索引和数据本身」,需要一直常驻内存,供后续所有查询反复使用。

GQA(Grouped-Query Attention)和 MQA(Multi-Query Attention)通过减少 K、V 的头数来减小 cache,但往往伴随能力损失(论文在附录 D.1 中给出了 MHA / GQA / MQA 的对比,MHA 在多项基准上明显优于 GQA/MQA)。MLA 的目标是:在保持甚至略优于 MHA 表现的前提下,大幅减少 KV cache,从而兼顾能力与推理效率。
💡 理解要点:可以把 KV cache 想象成「为每个已出现的词建一张索引卡片」;MHA 下每张卡片很大(每头一份 K、V),MLA 通过「先压成一张小卡片(潜在向量),需要时再展开」的方式,让同样显存能放下更多 token 的索引,从而支持更大 batch 或更长上下文。
3. MLA 的核心:低秩 K-V 联合压缩
3.1 用一个小向量表示 K、V
MLA 的核心思想是:不直接为每个 token 存「多头 K、V」,而是先通过一个共享的低维潜在向量表示 K、V 的信息,推理时只缓存这个潜在向量;需要算注意力时,再通过上投影得到 K、V(或通过矩阵结合律把上投影吸收进 Q 或 O,见下)。
数学形式(论文式 9–11):
$$\mathbf{c}_t^{KV} = W^{DKV} \mathbf{h}_t \in \mathbb{R}^{d_c},$$
$$\mathbf{k}_t^C = W^{UK} \mathbf{c}_t^{KV}, \quad \mathbf{v}_t^C = W^{UV} \mathbf{c}_t^{KV},$$
其中:
- $\mathbf{c}_t^{KV} \in \mathbb{R}^{d_c}$:K-V 的联合潜在向量,$d_c \ll d_h n_h$(DeepSeek-V2 中 $d_c = 512$,而 $d_h n_h = 128 \times 128 = 16384$);
- $W^{DKV} \in \mathbb{R}^{d_c \times d}$:下投影;
- $W^{UK}, W^{UV} \in \mathbb{R}^{d_h n_h \times d_c}$:上投影,分别得到压缩后的 K、V。
推理时只需缓存 $\mathbf{c}_t^{KV}$,因此每 token、每层的 KV 相关缓存从 $2 n_h d_h$ 降为 $d_c$。进一步地,由于矩阵乘法的结合律,在计算注意力时可以把 $W^{UK}$ 吸收进 $W^Q$ 侧、把 $W^{UV}$ 吸收进 $W^O$ 侧,从而在推理时甚至不必显式算出 $\mathbf{k}_t^C, \mathbf{v}_t^C$,只需用潜在向量参与运算,进一步省计算。
🔍 实际例子:$d_c = 512$ 时,每层每 token 只存 512 个数,而不是 128 个头 × 128 维 × 2(K+V) = 32768 个数,单层就减少约 64 倍元素。
3.2 Query 的低秩压缩(训练时省激活显存)
为降低训练时的激活显存,MLA 对 Query 也做低秩压缩(不改变推理 KV cache 量,但减少前向中的大矩阵):
$$\mathbf{c}_t^Q = W^{DQ} \mathbf{h}_t \in \mathbb{R}^{d_c'}, \quad \mathbf{q}_t^C = W^{UQ} \mathbf{c}_t^Q,$$
其中 $d_c' \ll d_h n_h$(DeepSeek-V2 中 $d_c' = 1536$)。这样 Q 也先经「下投影 → 上投影」再参与注意力,训练时中间激活更小。
3.3 解耦 RoPE:为什么必须、怎么做
LLaMA 架构等模型使用 RoPE(Rotary Position Embedding)在注意力内对 Q、K 按位置做旋转,以注入位置信息。若直接对压缩后的 $\mathbf{k}_t^C = W^{UK} \mathbf{c}_t^{KV}$ 施加 RoPE,则 RoPE 矩阵会「夹在」$W^{UK}$ 与 $\mathbf{c}_t^{KV}$ 之间。推理时我们希望把 $W^{UK}$ 吸收到 $W^Q$ 侧,从而不显式算 K;但 RoPE 与 $W^{UK}$ 不满足交换律,吸收后等价形式会依赖「当前生成位置」的 RoPE,无法对历史 token 只存一份不变表示,导致必须为每个前缀 token 重新计算 key,丧失压缩带来的推理加速。
为此,DeepSeek-V2 采用 解耦 RoPE:单独用一组「带 RoPE 的 Q、K」 承担位置信息,与「从潜在向量恢复的 Q、K、V」拼接后再做注意力。这样:
- 带 RoPE 的部分:多头的 $\mathbf{q}_{t,i}^R \in \mathbb{R}^{d_h^R}$ 与共享的 $\mathbf{k}_t^R \in \mathbb{R}^{d_h^R}$(对所有头共享一个 key),均施加 RoPE;推理时只需额外缓存 $\mathbf{k}_t^R$。
- 从潜在向量来的部分:$\mathbf{q}{t,i}^C, \mathbf{k}{t,i}^C, \mathbf{v}_{t,i}^C$ 不施加 RoPE,$W^{UK}/W^{UV}$ 仍可在推理时吸收,只缓存 $\mathbf{c}_t^{KV}$。
公式(论文式 14–19,略写):
- 解耦的 Q、K(带 RoPE):$\mathbf{q}_t^R = \mathrm{RoPE}(W^{QR} \mathbf{c}_t^Q)$,$\mathbf{k}_t^R = \mathrm{RoPE}(W^{KR} \mathbf{h}_t)$;
- 拼接:$\mathbf{q}{t,i} = [\mathbf{q}{t,i}^C; \mathbf{q}{t,i}^R]$,$\mathbf{k}{t,i} = [\mathbf{k}_{t,i}^C; \mathbf{k}_t^R]$(每头共享同一个 $\mathbf{k}_t^R$);
- 注意力仍为 $\mathbf{o}{t,i} = \sum{j=1}^t \mathrm{Softmax}j(\cdots) \mathbf{v}{j,i}^C$,分母中的尺度为 $\sqrt{d_h + d_h^R}$(DeepSeek-V2 取 $d_h^R = 64$)。
推理时需缓存的:每 token、每层为 $\mathbf{c}_t^{KV}$($d_c$ 维)和 $\mathbf{k}_t^R$($d_h^R$ 维),共 $d_c + d_h^R$。论文给出 DeepSeek-V2 配置下约为 $(9/2) d_h \cdot l$,等价于「仅约 2.25 个 group 的 GQA」的 KV 量,但能力优于 MHA。
💡 理解要点:解耦 RoPE = 把「位置信息」单独放在一小块 Q、K 上,其余部分不做位置变换,这样压缩后的 K-V 表示与位置解耦,推理时可以放心做矩阵吸收,只多存一份小的 $\mathbf{k}^R$。
3.4 KV cache 与注意力机制对比
| 注意力机制 | 每 token KV cache(元素个数) | 能力(相对) |
|---|
| MHA | $2 n_h d_h l$ | 强 |
| GQA | $2 n_g d_h l$($n_g$ 为 group 数) | 中等 |
| MQA | $2 d_h l$ | 较弱 |
| MLA | $(d_c + d_h^R) l \approx \frac{9}{2} d_h l$ | 更强 |
DeepSeek-V2 中 $d_c = 4 d_h = 512$,$d_h^R = d_h/2 = 64$,故每 token 每层 576 维,远小于 MHA 的 $2 \times 128 \times 128 = 32768$。
4. DeepSeekMoE 在 DeepSeek-V2 中的使用
DeepSeek-V2 的 FFN 部分采用 DeepSeekMoE 架构设计:细粒度专家切分 + 共享专家隔离。本节只给出在 V2 中的具体配置与 V2 论文新增的设备受限路由、三类负载均衡损失与 Token-Dropping,细节公式见 DeepSeekMoE 架构原文。
4.1 基本形式回顾
设第 t 个 token 的 FFN 输入为 $\mathbf{u}_t$,则:
$$\mathbf{h}_t' = \mathbf{u}t + \sum{i=1}^{N_s} \mathrm{FFN}i^{(s)}(\mathbf{u}t) + \sum{i=1}^{N_r} g{i,t} \mathrm{FFN}_i^{(r)}(\mathbf{u}_t),$$
其中 $N_s$ 为共享专家数,$N_r$ 为路由专家数,$g_{i,t}$ 为门控(仅 Top-$K_r$ 非零),$s_{i,t} = \mathrm{Softmax}_i(\mathbf{u}_t^T \mathbf{e}_i)$。DeepSeek-V2:除第一层外均为 MoE;每层 2 个共享专家 + 160 个路由专家,每 token 激活 6 个路由专家;专家中间维度 1536。
4.2 设备受限路由(Device-Limited Routing)
在专家并行训练时,专家分布在不同设备上,每个 token 若选中的专家分布在很多设备上,会产生大量跨设备通信。DeepSeek-V2 引入 设备受限路由:对每个 token,先限定其最多只送到 M 台设备(在这些设备上选 Top-K 专家),再在这 M 台设备内做 Top-K 选择。论文中 $M=3$ 即可在保持性能的前提下显著控制通信量。
4.3 三类负载均衡损失
- 专家级均衡 $\mathcal{L}_{\mathrm{ExpBal}}$:与 DeepSeekMoE 架构一致,鼓励各路由专家被选频率与门控期望平衡,缓解路由崩塌。
- 设备级均衡 $\mathcal{L}_{\mathrm{DevBal}}$:鼓励各设备上的专家总负载(被选频率、门控和)接近,提高设备利用率。
- 通信均衡 $\mathcal{L}_{\mathrm{CommBal}}$:鼓励各设备接收的 token 量也尽量均衡,避免某设备成为接收瓶颈。
超参:$\alpha_1=0.003$,$\alpha_2=0.05$,$\alpha_3=0.02$。
4.4 Token-Dropping 策略
在训练中采用设备级 token-dropping:为每台设备设定与 batch 对应的计算预算(容量因子约 1.0),在预算内按 token 在该设备上的亲和度从低到高丢弃,直到满足预算;同时保证约 10% 的序列永不丢 token,以保持训练与推理行为一致(推理时可选择是否丢 token)。
5. 模型超参与规模概览
- 层数 60,隐藏维度 5120;MLA:头数 $n_h=128$,$d_h=128$,$d_c=512$,$d_c'=1536$,$d_h^R=64$。
- MoE:2 共享 + 160 路由,每 token 激活 6 个路由专家,专家中间维度 1536。
- 总参数 约 236B,每 token 激活参数 约 21B。
- 上下文:预训练 4K,经 YaRN 扩展至 128K(见下节)。
训练:AdamW,warmup + 阶梯衰减,最大学习率 $2.4 \times 10^{-4}$,梯度裁剪 1.0;batch 从 2304 增至 9216,8.1T token;16 路零气泡流水线并行、8 路专家并行、ZeRO-1 数据并行,无张量并行。
6. 长上下文扩展(YaRN)
预训练完成后,使用 YaRN 将上下文从 4K 扩展到 128K。YaRN 仅作用于解耦的共享 key $\mathbf{k}^R$(负责 RoPE 的部分)。超参:scale $s=40$,$\alpha=1$,$\beta=32$,目标最大长度 160K;并对长度缩放因子做了适配($\sqrt{t} = 0.0707 \ln s + 1$)以调节注意力熵。扩展阶段再训练约 1000 步,序列长度 32K,batch 576;在 128K 的 NIAH 等测试上表现良好。
7. 与主流架构的对比
下表从「注意力机制」「FFN」「KV cache」「参数量与激活量」等维度对比 DeepSeek-V2 与标准 MHA/LLaMA、GQA(如 LLaMA-2 70B)、MQA、Mixtral(GShard 式 MoE)、DeepSeek 67B(稠密)。
| 维度 | LLaMA / DeepSeek 67B | GQA(如 LLaMA-2 70B) | MQA | Mixtral 8×22B | DeepSeek-V2 |
|---|
| 注意力 | MHA,全头 K/V | 多 Q 头共享少量 K/V 头 | 多 Q 头共享单组 K/V | MHA | MLA(低秩 K-V + 解耦 RoPE) |
| KV cache | $2 n_h d_h l$ | $2 n_g d_h l$ | $2 d_h l$ | 同 MHA | $(d_c+d_h^R)l \approx 2.25 d_h l$ |
| FFN | 稠密,每层单一 FFN | 同左 | 同左 | MoE,Top-K 路由 | DeepSeekMoE(共享 + 细粒度路由) |
| 总参数 | 67B / 70B 量级 | 70B | — | 141B | 236B |
| 激活参数 | 同总参数 | 同总参数 | — | ~39B | 21B |
| 设计目标 | 通用能力 | 省 KV、略损能力 | 极省 KV、能力弱 | 参数大、激活省 | 省 KV + 省激活 + 强能力 |
💡 理解要点:DeepSeek-V2 在注意力侧用 MLA 把 KV cache 压到约 GQA 2.25 组的量级且能力优于 MHA;在 FFN 侧用 DeepSeekMoE 实现「236B 参数、21B 激活」,与 Mixtral 的「141B 总、39B 激活」相比,激活更少、总参数更大,有利于在可控算力下获得更强表现。
8. 训练与推理效率(数据摘要)
论文给出了与 DeepSeek 67B(稠密)的对比(来源:DeepSeek-V2 论文):
- 训练:每万亿 token 所需 GPU 时,67B 约 300.6K 小时,V2 约 172.8K 小时,节省约 42.5%。
- KV cache:在 FP8 参数 + KV 量化(约 6 bit/元素)下,V2 的 KV cache 相对 67B 减少约 93.3%,同显存下可支持更大 batch 或更长序列。
- 推理吞吐:单节点 8× H800 上,按实际服务的 prompt/生成长度分布测,V2 的生成吞吐超 50K token/s,为 67B 最大吞吐的约 5.76 倍;输入吞吐超 100K token/s。
🔍 实际例子:同样 8 张 H800,67B 可能只能跑较小 batch 或较短上下文;V2 因 KV 小、激活少,可以开更大 batch,把算力更充分利用,从而显著提高吞吐。
9. 小结与相关文档
- DeepSeek-V2 在 Decoder-only 骨架下,用 MLA 实现低秩 K-V 联合压缩与解耦 RoPE,大幅减小 KV cache 并保持或略优于 MHA 能力;用 DeepSeekMoE 实现稀疏 FFN,在 236B 总参数、21B 激活下达到顶尖开源表现。
- 相比 DeepSeek 67B:训练成本约省 42.5%,KV cache 约降 93.3%,最大生成吞吐约 5.76×;支持 128K 上下文(YaRN)。
- 与 MHA / GQA / MQA / LLaMA / Mixtral 的差异主要体现在:注意力改为 MLA(压缩 cache)、FFN 改为 DeepSeekMoE(细粒度专家 + 共享专家),并辅以设备受限路由、三类均衡损失与 token-dropping。
论文:DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model. arXiv:2405.04434.