摘要 :本文在 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 从 2 n h d h l 2n_h d_h l 2nhdhl 压到约 ( d c + d h R ) l (d_c + d_h^R) l (dc+dhR)l,并配合解耦 RoPE 使推理时无需为前缀 token 重算 key,从而显著提升推理吞吐与长上下文能力。
- FFN :用 DeepSeekMoE 替代稠密 FFN(详见 DeepSeekMoE 架构解析),通过细粒度专家切分与共享专家隔离,在总参数 236B、每 token 仅激活 21B 的前提下达到强性能。

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

设当前层输入为 h t ∈ R d \mathbf{h}_t \in \mathbb{R}^d ht∈Rd( t t t 为 token 位置, d d d 为隐藏维度),头数 n h n_h nh,每头维度 d h d_h dh(满足 d = n h d h d = n_h d_h d=nhdh)。MHA 先得到:
q t = W Q h t , k t = W K h t , v t = W V h t , \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, qt=WQht,kt=WKht,vt=WVht,
其中 W Q , W K , W V ∈ R d h n h × d W^Q, W^K, W^V \in \mathbb{R}^{d_h n_h \times d} WQ,WK,WV∈Rdhnh×d。将 q t , k t , v t \mathbf{q}t, \mathbf{k}t, \mathbf{v}t qt,kt,vt 按头切分为 q t , i , k t , i , v t , i ∈ R d h \mathbf{q}{t,i}, \mathbf{k}{t,i}, \mathbf{v}{t,i} \in \mathbb{R}^{d_h} qt,i,kt,i,vt,i∈Rdh,则第 i i i 头的注意力输出为:
o t , i = ∑ j = 1 t S o f t m a x j ( q t , i T k j , i d h ) v j , 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}, ot,i=j=1∑tSoftmaxj(dh qt,iTkj,i)vj,i,
最终输出 u t = W O [ o t , 1 ; ... ; o t , n h ] \mathbf{u}t = W^O [\mathbf{o}{t,1}; \ldots; \mathbf{o}{t,n_h}] ut=WO[ot,1;...;ot,nh]。推理时 需要缓存所有位置的 k j , i , v j , i \mathbf{k}{j,i}, \mathbf{v}_{j,i} kj,i,vj,i,即每 token 每层 2 n h d h 2 n_h d_h 2nhdh 个元素,共 2 n h d h ⋅ l 2 n_h d_h \cdot l 2nhdh⋅l。
2.2 为什么需要压缩 KV cache?
在自回归生成时,模型需要缓存所有已见 token 的 Key 和 Value,以便在生成下一个 token 时与当前 Query 做注意力。标准 Multi-Head Attention(MHA) 下,每层、每 token 需缓存 n h n_h nh 个头的 K、V,即 2 n h d h l 2 n_h d_h l 2nhdhl 个元素( n h n_h nh 为头数, d h d_h dh 为每头维度, l l l 为层数)。长序列、大模型时,KV cache 成为显存与带宽瓶颈,限制 batch 大小与序列长度,从而限制推理吞吐。
我自己看到这里的时候脑子里就有了两个疑问:为什么需要缓存?为什么只缓存 K/V,不缓存 Q?我花了一些时间去重新读了一遍 Transformer 8. Decoder: 掩码注意力机制以及数学推导。
首先是,为什么只缓存 K/V,不缓存 Q?
第 t t t 步的注意力大致形如: A t t n t = s o f t m a x ( Q t K 1 : t ⊤ / d h ) V 1 : t \mathrm{Attn}t = \mathrm{softmax}(Q_t K{1:t}^\top / \sqrt{d_h}) V_{1:t} Attnt=softmax(QtK1:t⊤/dh )V1:t。我们可以看到,Q t Q_t Qt 只依赖"当前这一个 token"的隐藏状态 h t \mathbf{h}t ht,而你每生成一个新 token 都会重新算一次 h t \mathbf{h}t ht,顺带重新算一遍 Q t Q_t Qt 成本非常小;并且 Q t Q_t Qt 只在这一刻用一次,用完就可以丢弃。**K 1 : t , V 1 : t K{1:t}, V{1:t} K1:t,V1:t 则依赖所有历史 token** :后续第 t + 1 t+1 t+1 步仍然需要和这些历史位置做注意力,如果不缓存,就要在每一步把前缀所有 token 从头 forward 到当前层再算一遍 K/V,会非常浪费算力。
我们再解释地更进一步:在 decoder-only 的自回归生成里,第 t t t 步只能「看见」位置 1 1 1 到 t t t 的 token(掩码),所以参与注意力的 Key、Value 就是这 t t t 个位置的表示------把它们按位置堆叠成矩阵,就记作 K 1 : t K_{1:t} K1:t 和 V 1 : t V_{1:t} V1:t(形状分别为 t × d h t \times d_h t×dh);当前步的 Query 只有当前位置的 Q t Q_t Qt(形状 1 × d h 1 \times d_h 1×dh)。于是注意力分数 Q t K 1 : t ⊤ Q_t K_{1:t}^\top QtK1:t⊤ 表示「当前位置对每个历史位置的相关性」,softmax 后对 V 1 : t V_{1:t} V1:t 做加权求和,得到当前步的注意力输出。直观上就是:用当前 token 提一个问题( Q t Q_t Qt),到历史记忆( K 1 : t , V 1 : t K_{1:t}, V_{1:t} K1:t,V1:t)里检索并汇总。
所以工程上采用的策略是:每个新 token 现算 Q、现算它自己的 K/V,并把这一步的 K/V 追加到缓存里;后面再也不重算历史 token 的 K/V。这也是公式里只统计 K/V 缓存、不统计 Q 的原因。
我们再来回答,为什么必须"缓存",而不是每一步都重算所有 K/V?
因为,如果不缓存,第 t t t 步你要对 1... t t t 所有 token 重算一遍当前层的隐藏状态和 K/V,相当于每一步都在做一次「长度为 t t t 的全序列前向」,生成一整句的整体复杂度会从「注意力本身的 O ( L 2 ) O(L^2) O(L2)」变成更糟糕的级别。有了缓存之后,第 t t t 步只对新增的这个 token 做一遍前向,拿到当前层的 K t , V t K_t, V_t Kt,Vt 加进缓存,然后直接用缓存中的 K 1 : t , V 1 : t K_{1:t}, V_{1:t} K1:t,V1:t 做注意力即可,前缀部分完全不用重算,大幅降低生成时的实际 FLOPs。
换个直观比喻: Q t Q_t Qt 像你当前输入的一条查询语句,用完就丢; K / V K/V 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):
c t K V = W D K V h t ∈ R d c , \mathbf{c}_t^{KV} = W^{DKV} \mathbf{h}_t \in \mathbb{R}^{d_c}, ctKV=WDKVht∈Rdc,
k t C = W U K c t K V , v t C = W U V c t K V , \mathbf{k}_t^C = W^{UK} \mathbf{c}_t^{KV}, \quad \mathbf{v}_t^C = W^{UV} \mathbf{c}_t^{KV}, ktC=WUKctKV,vtC=WUVctKV,
其中:
- c t K V ∈ R d c \mathbf{c}_t^{KV} \in \mathbb{R}^{d_c} ctKV∈Rdc:K-V 的联合潜在向量 , d c ≪ d h n h d_c \ll d_h n_h dc≪dhnh(DeepSeek-V2 中 d c = 512 d_c = 512 dc=512,而 d h n h = 128 × 128 = 16384 d_h n_h = 128 \times 128 = 16384 dhnh=128×128=16384);
- W D K V ∈ R d c × d W^{DKV} \in \mathbb{R}^{d_c \times d} WDKV∈Rdc×d:下投影;
- W U K , W U V ∈ R d h n h × d c W^{UK}, W^{UV} \in \mathbb{R}^{d_h n_h \times d_c} WUK,WUV∈Rdhnh×dc:上投影,分别得到压缩后的 K、V。
推理时 只需缓存 c t K V \mathbf{c}_t^{KV} ctKV,因此每 token、每层的 KV 相关缓存 从 2 n h d h 2 n_h d_h 2nhdh 降为 d c d_c dc 。进一步地,由于矩阵乘法的结合律,在计算注意力时可以把 W U K W^{UK} WUK 吸收进 W Q W^Q WQ 侧、把 W U V W^{UV} WUV 吸收进 W O W^O WO 侧,从而在推理时甚至不必显式算出 k t C , v t C \mathbf{k}_t^C, \mathbf{v}_t^C ktC,vtC,只需用潜在向量参与运算,进一步省计算。
🔍 实际例子 : d c = 512 d_c = 512 dc=512 时,每层每 token 只存 512 个数,而不是 128 个头 × 128 维 × 2(K+V) = 32768 个数,单层就减少约 64 倍元素。
3.2 Query 的低秩压缩(训练时省激活显存)
为降低训练时的激活显存,MLA 对 Query 也做低秩压缩(不改变推理 KV cache 量,但减少前向中的大矩阵):
c t Q = W D Q h t ∈ R d c ′ , q t C = W U Q c t Q , \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, ctQ=WDQht∈Rdc′,qtC=WUQctQ,
其中 d c ′ ≪ d h n h d_c' \ll d_h n_h dc′≪dhnh(DeepSeek-V2 中 d c ′ = 1536 d_c' = 1536 dc′=1536)。这样 Q 也先经「下投影 → 上投影」再参与注意力,训练时中间激活更小。
3.3 解耦 RoPE:为什么必须、怎么做
LLaMA 架构 等模型使用 RoPE (Rotary Position Embedding)在注意力内对 Q、K 按位置做旋转,以注入位置信息。若直接对压缩后的 k t C = W U K c t K V \mathbf{k}_t^C = W^{UK} \mathbf{c}_t^{KV} ktC=WUKctKV 施加 RoPE,则 RoPE 矩阵会「夹在」 W U K W^{UK} WUK 与 c t K V \mathbf{c}_t^{KV} ctKV 之间。推理时 我们希望把 W U K W^{UK} WUK 吸收到 W Q W^Q WQ 侧,从而不显式算 K;但 RoPE 与 W U K W^{UK} WUK 不满足交换律,吸收后等价形式会依赖「当前生成位置」的 RoPE,无法对历史 token 只存一份不变表示,导致必须为每个前缀 token 重新计算 key,丧失压缩带来的推理加速。
为此,DeepSeek-V2 采用 解耦 RoPE :单独用一组「带 RoPE 的 Q、K」 承担位置信息,与「从潜在向量恢复的 Q、K、V」拼接后再做注意力。这样:
- 带 RoPE 的部分 :多头的 q t , i R ∈ R d h R \mathbf{q}_{t,i}^R \in \mathbb{R}^{d_h^R} qt,iR∈RdhR 与共享 的 k t R ∈ R d h R \mathbf{k}_t^R \in \mathbb{R}^{d_h^R} ktR∈RdhR(对所有头共享一个 key),均施加 RoPE;推理时只需额外缓存 k t R \mathbf{k}_t^R ktR。
- 从潜在向量来的部分 : q t , i C , k t , i C , v t , i C \mathbf{q}{t,i}^C, \mathbf{k}{t,i}^C, \mathbf{v}_{t,i}^C qt,iC,kt,iC,vt,iC 不施加 RoPE, W U K / W U V W^{UK}/W^{UV} WUK/WUV 仍可在推理时吸收,只缓存 c t K V \mathbf{c}_t^{KV} ctKV。
公式(论文式 14--19,略写):
- 解耦的 Q、K(带 RoPE): q t R = R o P E ( W Q R c t Q ) \mathbf{q}_t^R = \mathrm{RoPE}(W^{QR} \mathbf{c}_t^Q) qtR=RoPE(WQRctQ), k t R = R o P E ( W K R h t ) \mathbf{k}_t^R = \mathrm{RoPE}(W^{KR} \mathbf{h}_t) ktR=RoPE(WKRht);
- 拼接: q t , i = [ q t , i C ; q t , i R ] \mathbf{q}{t,i} = [\mathbf{q}{t,i}^C; \mathbf{q}{t,i}^R] qt,i=[qt,iC;qt,iR], k t , i = [ k t , i C ; k t R ] \mathbf{k}{t,i} = [\mathbf{k}_{t,i}^C; \mathbf{k}_t^R] kt,i=[kt,iC;ktR](每头共享同一个 k t R \mathbf{k}_t^R ktR);
- 注意力仍为 o t , i = ∑ j = 1 t S o f t m a x j ( ⋯ ) v j , i C \mathbf{o}{t,i} = \sum{j=1}^t \mathrm{Softmax}j(\cdots) \mathbf{v}{j,i}^C ot,i=∑j=1tSoftmaxj(⋯)vj,iC,分母中的尺度为 d h + d h R \sqrt{d_h + d_h^R} dh+dhR (DeepSeek-V2 取 d h R = 64 d_h^R = 64 dhR=64)。
推理时需缓存的 :每 token、每层为 c t K V \mathbf{c}_t^{KV} ctKV( d c d_c dc 维)和 k t R \mathbf{k}_t^R ktR( d h R d_h^R dhR 维),共 d c + d h R d_c + d_h^R dc+dhR 。论文给出 DeepSeek-V2 配置下约为 ( 9 / 2 ) d h ⋅ l (9/2) d_h \cdot l (9/2)dh⋅l,等价于「仅约 2.25 个 group 的 GQA」的 KV 量,但能力优于 MHA。
💡 理解要点 :解耦 RoPE = 把「位置信息」单独放在一小块 Q、K 上,其余部分不做位置变换,这样压缩后的 K-V 表示与位置解耦,推理时可以放心做矩阵吸收,只多存一份小的 k R \mathbf{k}^R kR。
3.4 KV cache 与注意力机制对比
| 注意力机制 | 每 token KV cache(元素个数) | 能力(相对) |
|---|---|---|
| MHA | 2 n h d h l 2 n_h d_h l 2nhdhl | 强 |
| GQA | 2 n g d h l 2 n_g d_h l 2ngdhl( n g n_g ng 为 group 数) | 中等 |
| MQA | 2 d h l 2 d_h l 2dhl | 较弱 |
| MLA | ( d c + d h R ) l ≈ 9 2 d h l (d_c + d_h^R) l \approx \frac{9}{2} d_h l (dc+dhR)l≈29dhl | 更强 |
DeepSeek-V2 中 d c = 4 d h = 512 d_c = 4 d_h = 512 dc=4dh=512, d h R = d h / 2 = 64 d_h^R = d_h/2 = 64 dhR=dh/2=64,故每 token 每层 576 维,远小于 MHA 的 2 × 128 × 128 = 32768 2 \times 128 \times 128 = 32768 2×128×128=32768。
4. DeepSeekMoE 在 DeepSeek-V2 中的使用
DeepSeek-V2 的 FFN 部分采用 DeepSeekMoE 架构 设计:细粒度专家切分 + 共享专家隔离 。本节只给出在 V2 中的具体配置与 V2 论文新增的设备受限路由 、三类负载均衡损失 与 Token-Dropping ,细节公式见 DeepSeekMoE 架构博客原文。
4.1 基本形式回顾
设第 t t t 个 token 的 FFN 输入为 u t \mathbf{u}_t ut,则:
h t ′ = u t + ∑ i = 1 N s F F N i ( s ) ( u t ) + ∑ i = 1 N r g i , t F F N i ( r ) ( 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), ht′=ut+i=1∑NsFFNi(s)(ut)+i=1∑Nrgi,tFFNi(r)(ut),
其中 N s N_s Ns 为共享专家数, N r N_r Nr 为路由专家数, g i , t g_{i,t} gi,t 为门控(仅 Top- K r K_r Kr 非零), s i , t = S o f t m a x i ( u t T e i ) s_{i,t} = \mathrm{Softmax}_i(\mathbf{u}_t^T \mathbf{e}_i) si,t=Softmaxi(utTei)。DeepSeek-V2:除第一层外 均为 MoE;每层 2 个共享专家 + 160 个路由专家 ,每 token 激活 6 个路由专家;专家中间维度 1536。
4.2 设备受限路由(Device-Limited Routing)
在专家并行 训练时,专家分布在不同设备上,每个 token 若选中的专家分布在很多设备上,会产生大量跨设备通信。DeepSeek-V2 引入 设备受限路由 :对每个 token,先 限定其最多只送到 M M M 台设备(在这些设备上选 Top- K K K 专家),再在这 M M M 台设备内做 Top- K K K 选择。论文中 M = 3 M=3 M=3 即可在保持性能的前提下显著控制通信量。
4.3 三类负载均衡损失
- 专家级均衡 L E x p B a l \mathcal{L}_{\mathrm{ExpBal}} LExpBal:与 DeepSeekMoE 架构 一致,鼓励各路由专家被选频率与门控期望平衡,缓解路由崩塌。
- 设备级均衡 L D e v B a l \mathcal{L}_{\mathrm{DevBal}} LDevBal:鼓励各设备上的专家总负载(被选频率、门控和)接近,提高设备利用率。
- 通信均衡 L C o m m B a l \mathcal{L}_{\mathrm{CommBal}} LCommBal:鼓励各设备接收的 token 量也尽量均衡,避免某设备成为接收瓶颈。
超参: α 1 = 0.003 \alpha_1=0.003 α1=0.003, α 2 = 0.05 \alpha_2=0.05 α2=0.05, α 3 = 0.02 \alpha_3=0.02 α3=0.02。
4.4 Token-Dropping 策略
在训练中采用设备级 token-dropping:为每台设备设定与 batch 对应的计算预算(容量因子约 1.0),在预算内按 token 在该设备上的亲和度从低到高丢弃,直到满足预算;同时保证约 10% 的序列永不丢 token,以保持训练与推理行为一致(推理时可选择是否丢 token)。
5. 模型超参与规模概览
- 层数 60,隐藏维度 5120;MLA:头数 n h = 128 n_h=128 nh=128, d h = 128 d_h=128 dh=128, d c = 512 d_c=512 dc=512, d c ′ = 1536 d_c'=1536 dc′=1536, d h R = 64 d_h^R=64 dhR=64。
- MoE:2 共享 + 160 路由,每 token 激活 6 个路由专家,专家中间维度 1536。
- 总参数 约 236B ,每 token 激活参数 约 21B。
- 上下文 :预训练 4K,经 YaRN 扩展至 128K(见下节)。
训练:AdamW,warmup + 阶梯衰减,最大学习率 2.4 × 10 − 4 2.4\times 10^{-4} 2.4×10−4,梯度裁剪 1.0;batch 从 2304 增至 9216,8.1T token;16 路零气泡流水线并行、8 路专家并行、ZeRO-1 数据并行,无张量并行。
6. 长上下文扩展(YaRN)
预训练完成后,使用 YaRN 将上下文从 4K 扩展到 128K。YaRN 仅作用于解耦的共享 key k R \mathbf{k}^R kR (负责 RoPE 的部分)。超参:scale s = 40 s=40 s=40, α = 1 \alpha=1 α=1, β = 32 \beta=32 β=32,目标最大长度 160K;并对长度缩放因子做了适配( t = 0.0707 ln s + 1 \sqrt{t} = 0.0707 \ln s + 1 t =0.0707lns+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 2n_h d_h l 2nhdhl | 2 n g d h l 2n_g d_h l 2ngdhl | 2 d h l 2d_h l 2dhl | 同 MHA | ( d c + d h R ) l ≈ 2.25 d h l (d_c+d_h^R)l \approx 2.25 d_h l (dc+dhR)l≈2.25dhl |
| 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。
相关文档:
- Decoder Only Transformer
- LLaMA 架构介绍以及与 Transformer 架构对比
- DeepSeekMoE 架构解析:与 LLaMA 以及 Transformer 架构对比
论文 :DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model. arXiv:2405.04434.