概况
MoE架构,236B参数,每个token激活参数21B,支持128K上下文。采用了包括多头潜在注意力(MLA)和DeepSeekMoE在内的创新架构。MLA通过将KV缓存显著压缩成潜在向量来保证高效的推理,而DeepSeekMoE通过稀疏计算使得以经济成本训练强大的模型成为可能。
与DeepSeek 67B相比,DeepSeek-V2实现了显著更强的性能,同时节省了42.5%的训练成本,减少了93.3%的KV缓存,并将最大生成吞吐量提高到5.76倍。我们在由8.1T token组成的语料库上预训练DeepSeek-V2,并进一步进行SFT和RL以充分释放其潜力。
这个版本最大的贡献,就是MLA和DeepSeekMoE。MLA是一种低秩的、将K和V联合压缩的注意力机制,减少KV缓存的同时降低GQA/MQA带来的性能损耗;DeepSeekMoE和普通MoE相比,专家的划分粒度更细、并将一部分专家隔离为共享专家,这些专家始终被激活。
还有一个小参数量版本的DeepSeek-V2-Lite,参数量15.7B,每个token激活参数2.4B
架构
MLA
在标准MHA中,隐向量分别的三个权重矩阵相乘,得到qkv,然后把每次推理的kv存储到显存中。
MLA的核心是键和值的低秩联合压缩,以减少KV缓存。
此外,为了在训练过程中减少激活内存,我们还对查询进行了低秩压缩,即使它不能减少KV缓存:
旋转位置编码RoPE与低秩KV压缩不兼容,RoPE是一种相对位置编码方式,当前q与之前的k/v相乘时乘上一个旋转矩阵,来标记两个token的相对位置。
关于rope不兼容没法做吸收计算的解释,这篇文章4.2节讲的非常详细:http://zhuanlan.zhihu.com/p/16730036197。大致就是在使用rope之前,由于满足矩阵乘法结合律可以提前把它俩乘积算出来,也就是权重矩阵吸收,而使用rope之后会导致这两个矩阵中间多了个表示相对位置的旋转矩阵,没法提前计算了。
为了解决这种不兼容,就通过concat的方式,在向量的尾部加一个小的位置编码向量。这样相乘的时候,前面的维度通过矩阵吸收处理,所有head缓存一个,后面一段通过正常MQA方式计算。
文中说MLA缓存的Latent KV比较短(相当于2.25个MQA的缓存量),但MLA恢复了kv的能力,使得表征能力强于GQA和MQA,甚至强于MHA(这一点存疑,不好解释为什么比MHA还强)
DeepSeekMoE
DeepSeekMoE有两个关键思想:将专家细分为更细的粒度以实现更高的专家专业化和更准确的知识获取,以及隔离一些共享专家以减轻路由专家之间的知识冗余。
表达公式为:
表示共享专家的数量,表示路由专家的数量,表示第i个专家的门控值,表示token与第i个专家的亲合度,表示第i个专家的质心。
上面这三个公式从上往下看:
- 专家的质心也就是说专家更擅长哪些知识,那么最下面公式计算得到的结果就是当前token与这个专家擅长内容的近似程度。
- 计算当前token和所有专家的近似程度,就可以排序得到当前token最适合哪些专家来处理,利用第二个公式,选出其中近似度最高的个专家。
- 最后用最上面的公式,用选定的专家+共享专家来对输入进行处理,得到之后再和原始输入相加,相当于残差连接,就得到了MLP的输出。
限制设备的路由:
研究人员还设计了一种设备限制的路由机制,以限制与MoE(Mixture of Experts)相关的通信成本:由于专家的细粒度分割,激活的专家数量可能很大,因此应用专家并行,MoE相关的通信将更加昂贵。
对于DeepSeek-V2,除了对路由专家进行简单的top-K选择之外,还确保每个token的目标专家将分布在最多M个设备上。也就是首先选择M个设备,然后在这些M个设备上的专家中进行top-K选择。在实践中,我们发现当M>=3时可以实现和无限制接近的效果
负载平衡:
不平衡的负载会增加路由崩溃的风险,并且会降低计算效率。在DeepSeek-V2的训练过程中,设计了三种辅助损失函数,分别用于控制专家级别的负载均衡(LExpBal)、设备级别的负载均衡(LDevBal)和通信平衡(LCommBal)。
专家级别的负载均衡,通过统计当前专家被选择的频率、整个序列上被分配的权重,来计算损失,被选择的频率越低、权重越小,损失就越小。设备级别的负载均衡损失也是类似。
设备限制的路由机制基于确保每个设备最多向其他设备传输 𝑀𝑇 个隐藏状态的原则运作。同时,使用通信平衡损失来鼓励每个设备从其他设备接收大约 𝑀𝑇 个隐藏状态。通信平衡损失保证了设备间信息的平衡交换,促进了高效的通信。
token丢弃策略:
虽然平衡损失旨在鼓励平衡负载,但它们不能保证严格的负载平衡。为了进一步减轻不平衡负载,在训练期间引入了设备级别的token丢弃策略。
这种方法首先计算每个设备的平均计算预算,这意味着每个设备的容量因子相当于1.0。然后,在每个设备上丢弃最低亲和力分数的token,直到达到计算预算。
此外,确保大约10%训练序列的token永远不会被丢弃。通过这种方式,我们可以根据效率要求灵活决定在推理时是否丢弃令牌,并始终确保训练和推理之间的一致性。
pre-train
Infra:
DeepSeek-V2是基于HAI-LLM框架进行训练的,这是他们自研的训练框架。
它采用了16路无气泡流水线并行、8路专家并行以及ZeRO-1数据并行。鉴于DeepSeek-V2激活的参数相对较少,且部分操作符被重新计算以节省激活内存,因此无需张量并行即可进行训练,从而减少了通信开销。此外,为了进一步提高训练效率,将共享专家的计算与专家并行的全对全通信进行了重叠处理。
16路PP意思就是整个模型的forward/backward被划分成16个stage,分布在16组机器上;8路专家并行是指每组机器整套专家分布在8张卡上。
**上下文长度扩展:**使用YaRN,将上下文窗口从4K扩展到128K
训练成本:
由于DeepSeek-V2对每个标记激活的参数较少,并且所需的浮点运算次数(FLOPs)比DeepSeek 67B少,因此理论上训练DeepSeek-V2将比训练DeepSeek 67B更经济。
尽管训练MoE模型将引入额外的通信开销,但通过算子和通信优化,DeepSeek-V2的训练可以达到相对较高的模型浮点运算利用率(MFU)。在方佳瑞的知乎文章中介绍了他对V3的MFU估算:https://zhuanlan.zhihu.com/p/16445683081
在H800集群上进行的实际训练中,对于每万亿标记的训练,DeepSeek 67B需要300.6K GPU小时,而DeepSeek-V2仅需要172.8K GPU小时,即稀疏的DeepSeek-V2与密集的DeepSeek 67B相比,可以节省42.5%的训练成本。
推理效率:
为了高效部署DeepSeek-V2服务,首先将它的参数转换为FP8的精度。
此外,对DeepSeek-V2的KV缓存进行了量化,将KV缓存中的每个元素平均压缩到6位。得益于MLA和这些优化,实际部署的DeepSeek-V2比DeepSeek 67B需要的KV缓存显著减少,因此可以服务更大的批次大小。
在配备8个H800 GPU的单个节点上,DeepSeek-V2实现了超过每秒50K个令牌的生成吞吐量,这是DeepSeek 67B的最大生成吞吐量的5.76倍。此外,DeepSeek-V2的提示输入吞吐量超过每秒100K个令牌。
Alignment
在SFT方面,数据量和DeepSeek 67B一样,质量更高。
在RL方面,使用了在DeepSeek Math技术报告中的组相对策略优化GRPO。
强化学习的训练策略:
初步实验发现,在推理数据(如代码和数学提示)上的RL训练表现出与在一般数据上训练时不同的独特特征。例如,在代码和数学推理任务上的能力可以在更长的训练步骤期间持续提高。
因此采用了一个两阶段的RL训练策略,首先进行推理对齐,然后进行人类偏好对齐。
在第一个推理对齐阶段,训练了一个奖励模型𝑅𝑀𝑟𝑒𝑎𝑠𝑜𝑛𝑖𝑛𝑔,用于代码和数学推理任务,并使用𝑅𝑀𝑟𝑒𝑎𝑠𝑜𝑛𝑖𝑛𝑔的反馈来优化策略模型。在第二个人类偏好对齐阶段,采用了一个多奖励框架,该框架从一个有帮助的奖励模型、一个安全奖励模型、以及一个基于规则的奖励模型RMrule中获取奖励。
Discussion
SFT数据的数量:
- 先前研究认为,少于10K的SFT数据实例足以产生令人满意的结果。然而,在实验中如果使用少于10K的实例,在IFEval基准测试上的性能显著下降。
- 一个可能的解释是,语言模型需要一定量的数据来发展特定技能。尽管随着模型大小的增加所需的数据量可能会减少,但它不能完全消除。我们的观察强调了为LLM配备所需充足数据的关键性。
- 此外,SFT数据的质量也至关重要,特别是对于涉及写作或开放式问题的任务。
RL的对齐税:
- 对齐税(Alignment Tax) 指的是在通过RLHF过程中,模型在对齐人类偏好以提高安全性和有用性的同时,可能导致其在其他任务上的性能下降。
- 报告中说在数据处理和改进训练策略方面做出来很多努力来减轻对齐税,但是没说怎么做的
- 在报告之外,减轻对齐税的方法比如: RLHF 过程混合一小部分原始预训练数据,继续进行对数似然最大化训练
在线强化学习:
- 在线 RL:通过与环境的实时交互收集数据。
- 离线 RL:使用预先收集的历史数据集进行训练。
- 在偏好对齐实验中,发现在线方法显著优于离线方法。因此在实现在线强化学习框架上投入了巨大的努力。关于在线或离线偏好对齐的结论可能因不同上下文而异,将对它们进行更全面的分析留待未来的工作。
这是V2-Lite的layer0的参数,重点通过红框内的参数信息来熟悉MLA:
- 由于V2-Lite并没有压缩q,因此q_proj矩阵维度是2048*3072,3072是由16个自注意力头组成,每个头的维度是128+64=192
- kv先是被压缩成了576大小的低秩向量,这个向量前512个维度是kv原始信息压缩后的表示,后64个维度表示位置信息;然后通过一个512*4096的矩阵把前512维度给升维成4096,即k和v各2048
- q和k相乘的时候,k的每个头拼接上576向量的后面那64个维度,于是大小也是128*192=3072,能够和q相乘