前言

成就本文有以下三个因素

    24年5.17日,我在我司一课程「大模型与多模态论文100篇」里问道:大家希望我们还讲哪些论文 一学员朋友小栗说:幻方旗下公司深度求索于24年5.7日发布的deepseek-v224年5.24日,我司一课程「大模型项目开发线上营1」里的一学员朋友问我:校长最近开始搞deepseek了吗?刚看了论文,没搞懂MLA那块的cache是怎么算的,我总觉得他的效果应该类似MQA才对,但是反馈是挺好的 我当时回复他道:目前团队项目上的事情太多,然后近期在写那个KAN 确实还没来得及看这个deepseek,我近期看下我们在继英文层面的论文翻译、审稿、对话、idea提炼之后(其中的审稿和翻译已于24年8月底上线七月官网 ) 打算再整一下中文层面的「硕士论文修订助手(不限学科,CS和非CS的都涵盖)」,预计24年9月份上线七月官网 对于模型的选择,在闭源之外,在开源模型上 有两个选择,一个chatglm4,一个DeepSeek(后来实际上线时,一开始用的deepseek v2,后来改成了deepseek v3)

而搞DeepSeek之前——近几天,会先写一下它的论文解读(当然,因为DeepSeek-V2从DeepSeek LLM、DeepSeekMoE迭代而来,且用到了DeepSeekMath中的GRPO算法,故第一部分会先讲DeepSeek LLM、DeepSeekMoE、DeepSeekMath),故本文就来了,且DeepSeek也算证明了在国内也可以做出有效果、有影响力的创新

且一如既往做到——对于几乎每一个主题,都如本博客万千读者或七月学员所说的:“还是看校长的文章好理解”,而其中的关键之一是做好图、文、公式的一一对应,不一笔带过、不自以为然,本文亦如此

同时本文也见证了自己从技术人到产品人定位的过渡

    23上半年 侧重原理,系统大量读paper,深挖原理23下半年 侧重工程,和项目组不断优化各种工程问题24上半年 侧重研究,横跨或综合多个领域(比如llm+机器人),继续各种抠paper24下半年 侧重产品,把世界级前沿落地成产品 给用户使用,以发挥更大的价值和影响力(希望有机会早日达到世界级影响力)

第一部分 从DeepSeek LLM、DeepSeekMoE到DeepSeekMath

友情提醒,如不需要透彻深入理解,或者想直接看DeepSeek-V2的,可以直接跳到本文的第二部分,本文第二部分也是本文的最精华所在

当然,如果你就是想先从本第一部分 开始看则非常好,但里面的数学公式比较多,喜欢抠公式的可以细抠,不喜欢抠公式的则不用抠太细,不影响对DeepSeek-V2的整体理解

原标题1.1 DeepSeek LLM的预训练与对齐1.2 DeepSeekMoE的创新:细粒度专家分割与共享专家隔离1.3 DeepSeek-Coder、DeepSeekMath及其提出的GRPO提出时间 24年1.5日,量化巨头幻方旗下的杭州深度求索公司提出DeepSeek LLM,其对应的论文为《DeepSeek LLM: Scaling Open-Source Language Models with Longtermism》 24年1.11日,深度求索公司很快又提出了DeepSeekMoE,其对应的论文为《DeepSeekMoE: Towards Ultimate Expert Specialization in Mixture-of-Experts Language Models》 24年1.25,深度求索公司又提出DeepSeek-Coder 因为DeepSeek-V2涉及到了DeepSeekMath「其对应论文为 24年2月发表的《DeepSeekMath: Pushing the Limits of Mathematical Reasoning in Open Language Models》」中提出的群体相对策略优化——Group Relative Policy Optimization(简称GRPO) 改动本1.1节后已独立成文,详见下文的「3.1节DeepSeek LLM的预训练与对齐」因为MoE架构的重要性,本1.2节后已独立成文,详见下文的「3.2节DeepSeekMoE的创新:细粒度专家分割与共享专家隔离」对应的论文为《DeepSeek-Coder: When the Large Language Model Meets Programming -- The Rise of Code Intelligence》后本1.3节已独立成文,详见下文对应的新文章一文速览DeepSeekMoE及相关MoE大模型:从Mixtral 8x7B到DeepSeekMoE(含DeepSeek LLM的简介)、Qwen2.5-Max一文速览DeepSeekMoE及相关MoE大模型:从Mixtral 8x7B到DeepSeekMoE(含DeepSeek LLM的简介)、Qwen2.5-Max一文速览DeepSeekMath及GRPO:通俗理解群体相对策略优化GRPO(含DeepSeek-Coder的简介)

第二部分 DeepSeek-V2:提出多头潜在注意力MLA且改进MoE

DeepSeek-V2属于DeepSeek的第二代版本,参数规模虽然达到了庞大的236B,但由于其MoE的结构,使得其中每个token激活仅21B的参数,且支持128K的上下文(It is equipped with a total of 236B parameters, of which 21B are activated for each token, and supports a context length of 128K tokens)

其对应论文为《DeepSeek-V2: A Strong, Economical, and Efficient Mixture-of-Experts Language Model》,发布于24年5.7日

    他们首先在完整的预训练语料库上预训练DeepSeek-V2然后,收集了150万个对话会话,涵盖了数学、代码、写作、推理、安全等各个领域,以对DeepSeek-V2 Chat(SFT)进行监督微调(SFT)最后,他们遵循DeepSeekMath的方法,采用组相对策略优化(GRPO)进一步使模型与人类偏好对齐,并生成DeepSeek-V2 Chat(RL)

DeepSeek-V2主要有两大创新点,其在Transformer架构「一个注意力模块和一个前馈网络(FFN),如对transformer还不够熟练,请看此文:Transformer通俗笔记:从Word2Vec、Seq2Seq逐步理解到GPT、BERT」的基础上

值得一提的是,他们还一块发布了 DeepSeek-V2-Lite,相当于配备 MLA 和 DeepSeekMoE 的较小模型,它总共有15.7B参数,其中每个token激活2.4B参数(we also release DeepSeek-V2-Lite, a smaller model equipped with MLA and DeepSeekMoE, for the open-source community. It has a total of 15.7B parameters, where 2.4B are activated for each token)

    DeepSeek-V2-Lite 有 27 层,隐藏维度为 2048。 它还采用 MLA,并具有 16 个注意力头,每个头的维度为 128 其 KV 压缩维度为 512,但与 DeepSeek-V2 略有不同,它不压缩查询 对于解耦查询和键,每头维度为 64DeepSeek-V2-Lite 还采用 DeepSeekMoE,除了第一层外,所有前馈神经网络 (FFNs) 都被 MoE 层替换 每个 MoE 层由 2 个共享专家和 64 个路由专家组成,每个专家的中间隐藏维度为 1408。 在这些路由专家中,每个token将激活6个专家DeepSeek-V2-Lite 也在与 DeepSeek-V2 相同的预训练语料库上从头开始训练,该语料库未被任何 SFT 数据污染 它使用 AdamW 优化器,超参数设置为 𝛽1 = 0.9, 𝛽2 =0.95,权重衰减 =0.1 学习率使用预热和阶梯衰减策略进行调度 最初,在前2000步期间,学习率从0线性增加到最大值 随后,在训练了大约80%的tokens后,学习率乘以0.316,并在训练了大约90%的tokens后再次乘以0.316 最大学习率设置为4.2 × 10−4,梯度裁剪范数设置为1.0 没有采用批量大小调度策略,而是以恒定的批量大小4608个序列进行训练 在预训练期间,将最大序列长度设置为4K,并在5.7T tokens上训练DeepSeek-V2-Lite

2.1 DeepSeek-V2提出MLA的背景与作用

2.1.1 KV Cache所导致的显存消耗大,需要尽可能降低

众所周知,KV Cache是大模型标配的推理加速功能——也是推理过程中,显存资源巨大开销的元凶之一。如下图所示,在模型推理时,KV Cache在显存占用量可达30%以上

目前大部分针对KV Cache的优化工作

这些方案的问题是什么呢?在于

    第一类方案并没有从根本上改变KV Cache占用空间巨大的问题而第二类方案中的MQA虽然较大降低了KV cache计算量,但性能相比MHA下降太多了 至于第二类方案中的GQA则取了个折中:不好的是缓存下降的不够多、好的是相比MHA性能没有下降太多,毕竟我们追求的是缓存下降、性能不降

那KV Cache到底是什呢

MLA是对传统多头注意力做的改进,其目的有两个:首先是,降低推理过程中的KV Cache资源开销,其次,缓解MQA、MGA对性能的损耗

如上文所说,KV Cache中,提到每一步都需要将K和V缓存下来

具体而言,对于单个Attention Block块中的多头注意力(下图来自上文提到过的Transformer通俗笔记)

比如,举个例子,假设

2.2 详解MLA的两个部分:一部分做压缩、一部分做RoPE编码

2.2.1 MLA对Q K V的压缩:先对KV联合压缩后升维,再对Q压缩后升维

2.2.1.1 先对KV联合压缩(Low-Rank Key-Value Joint Compression)、后升维

为方便大家更好的理解,我于24年8月27日晚上特地花了个把小时(反复琢磨、反复修改),用手头的iPad Pro + apple pencil画了下上述过程,以方便大家一目了然的对比前后维度的变化(至于下图底部中“除了c_{t}^{K V}之外”的怎么回事,不急,下文很快会逐一阐述)

2.2.1.2 再对Q压缩降维、后升维
    之前提到KV Cache中,Q的作用只发生在当下(预测下一个token时,其只能看到待预测token之前的所有token),但是在模型训练的过程中,每个输入的token会通过多头注意力机制生成对应的query、key和value 这些中间数据的维度往往非常高,因此占用的内存量也相应很大所以论文中也提到为了降低训练过程中的激活内存activation memory,DeepSeek-V2还对queries进行低秩压缩——即便这并不能降低KV Cache,而其对Q的压缩方式和K、V一致,依然是先降维再升维

其中

2.2.2 MLA对query和key的RoPE编码

首先,在RoPE的实现中,如果要让Q、K带上位置信息,会分别乘以相应的位置编码矩阵

如果计算QK时,自然就变成了

对于上面这个公式,有两个小细节值得一提

  1. 正确的就是S = Q^{T} R_{m}^{T} R_{n} K
    假设 Q 和 K 是列向量(维度 d×1)
    其维度为(1 \times d) \cdot(d \times d) \cdot(d \times d) \cdot(d \times 1)=1 \times 1

    而非S=R_{m}^{T} Q^{T} R_{n} K
    其维度为(d \times d) \cdot(1 \times d) \cdot(d \times d) \cdot(d \times 1)

    有同学可能问,为何不是Q乘以K的转置了,原因在于上RoPE与标准注意力计算顺序是各自独立的

  2. 根据旋转矩阵的正交性,S = Q^{T} R_{m}^{T} R_{n} K可以转化为S=Q^{T} R_{n-m} K
    经典自注意力RoPE 
    S=Q K^{T}S=Q^{T} R_{n-m} K
    仅依赖 Q 和 K 的相似性额外编码位置差 n−m
    绝对位置需显式嵌入相对位置通过旋转矩阵隐式编码

则整个过程变成

然问题是

以进行最后的计算

  • 其中蓝色框中的向量\mathbf{c}_{t}^{K V}\mathbf{k}_{t}^{R}需要缓存以进行生成。 在推理过程中,the naive formula需要从\mathbf{c}_{t}^{K V}中恢复\mathbf{k}_{t}^{C}\mathbf{v}_{t}^{C}以进行注意力计算
    \begin{array}{l} \mathbf{c}_{t}^{K V}=W^{D K V} \mathbf{h}_{t} \\ \mathbf{k}_{t}^{C}=W^{U K} \mathbf{c}_{t}^{K V} \\ \mathbf{v}_{t}^{C}=W^{U V} \mathbf{c}_{t}^{K V} \end{array}
    \begin{array}{l} c_{t}^{Q}=W^{D Q} h_{t} \\ q_{t}^{C}=W^{U Q} c_{t}^{Q} \end{array}
  • 幸运的是,由于矩阵乘法的结合律,可以将W^{U K}吸收到W^{U Q}中,并将W^{U V}吸收到W^{O}中。 因此,不需要为每个查询计算键和值。 通过这种优化,避免了在推理过程中重新计算\mathbf{k}_{t}^{C}\mathbf{v}_{t}^{C}的计算开销

    注意了,「W^{U K}吸收到W^{U Q}中,并将W^{U V}吸收到W^{O}」这点到底如何理解呢?一般的文章很少会详尽细致的阐述出来
    我在另一篇文章中费了比较大的篇幅进行深入阐述,详见此文《MLA实现及其推理上的十倍提速——逐行解读DeepSeek V2中多头潜在注意力MLA的源码(图、公式、代码逐一对应)》的第二部分 MLA推理层面的改进:通过矩阵吸收十倍提速 MLA 算子,比如针对前者absorb 𝑊𝑈𝐾 into 𝑊𝑈𝑄,有

其中,如上文说过的

因此,它的KV缓存等于只有2.25组的GQA,但其性能强于MHA

至于MLA的代码实现,详见上面提到过的此文《MLA实现及其推理上的十倍提速——逐行解读DeepSeek V2中多头潜在注意力MLA的源码(图、公式、代码逐一对应)》

2.3 DeepSeekMoE:以经济成本训练强大的模型

2.3.1 基本架构与Device-Limited Routing

由于在上文的1.3节,详细的介绍了DeepSeekMoE(包括细粒度专家分割和共享专家隔离),故本节描述从简

DeepSeekMoE有两个关键理念:

    将专家细分为更细的粒度以实现更高的专家专业化和更准确的知识获取隔离一些共享专家以减轻路由专家之间的知识冗余

最终,在激活和总专家参数数量相同的情况下,DeepSeekMoE 可以大幅超越传统的 MoE 架构

其中

对于DeepSeek-V2,除了简单的top-K路由专家选择外,其还确保每个token的目标专家最多分布在 𝑀个设备上。 具体来说,对于每个token,我们首先选择 𝑀个设备,这些设备中有专家具有最高的亲和分数

然后,在这些 𝑀个设备上的专家中进行top-K选择。 在实践中,我们发现当 𝑀 ⩾3 时,设备限制路由可以实现与不受限制的 top-K 路由大致一致的良好性能

2.3.2 负载均衡的辅助损失(Auxiliary Loss for Load Balance)

首先,不平衡的负载会增加路由崩溃的风险,防止某些专家得到充分的训练和利用。 其次,当采用专家并行时,不平衡的负载会降低计算效率

    专家级均衡损失设备级平衡损失通信平衡损失

此外,虽然平衡损失旨在鼓励负载平衡,但需要承认它们不能保证严格的负载平衡

为了进一步减轻由于负载不平衡导致的计算浪费,他们在训练期间引入了设备级的Token-Dropping策略

    这种方法首先计算每个设备的平均计算预算,这意味着每个设备的容量因子相当于1.0然后,受Riquelme等人的启发,在每个设备上丢弃具有最低亲和力分数的token,直到达到计算预算此外,确保大约10%的训练序列中的token永远不会被丢弃。 通过这种方式,可以根据效率要求灵活决定在推理过程中是否丢弃标记,并始终确保训练和推理之间的一致性

第三部分 DeepSeek-V2的预训练与对齐

3.1 预训练(含数据构建与参数设置)、长度扩展、训练和推理效率

为提高其性能,他们构建了一个高质量的多源预训练语料库,包括8.1T的token,与DeepSeek 67B使用的语料库相比,该语料库的数据量有所增加,特别是中文数据,并且数据质量更高

且其采用与DeepSeek 67B相同的分词器,该分词器基于字节级字节对编码(BBPE)算法构建,词汇量为100K,其分词预训练语料库包含8.1T个token,其中中文token比英文标记多约12%

3.1.1 模型超参数

在MLA中

在DeepSeekMoE中,按照Dai等人的做法

    将除第一层外的所有前馈神经网络替换为专家混合层 每个专家混合层由2个共享专家和160个路由专家组成,每个专家的中间隐藏维度为1536在这些路由专家中,每个token将激活6个专家 此外,低秩压缩和细粒度专家分割将影响层的输出规模因此,在实践中,在压缩的潜在向量之后使用额外的RMS Norm层,并在宽度瓶颈处(即压缩的潜在向量和路由专家的中间隐藏状态)乘以额外的缩放因子,以确保训练的稳定性

在这种配置下,DeepSeek-V2总参数量为236B,其中每个token激活21B

3.1.2 训练超参数

以下是论文中所述的训练超参数设置

    使用AdamW优化器(Loshchilov和Hutter,2017),超参数设置为 𝛽1 = 0.9, 𝛽2 =0.95,权重衰减 =0.1学习率使用预热和阶梯衰减策略进行调度(DeepSeek-AI,2024) 最初,学习率在前2K步期间从0线性增加到最大值。 随后,在训练约60%的token后,学习率乘以0.316,并在训练约90%的token后再次乘以0.316 其中,最大学习率设置为2.4 × 10−4,梯度裁剪范数设置为1.0还使用批量大小调度策略,在前225B token的训练中,批量大小从2304逐渐增加到9216,然后在剩余的训练中保持9216将最大序列长度设置为4K,并在8.1T个tokens上训练DeepSeek-V2利用流水线并行技术在不同设备上部署模型的不同层,对于每一层,路由的专家将均匀部署在8个设备上 (𝐷 =8) 至于设备限制路由,每个token最多会被发送到3个设备上 (𝑀 =3)。 关于平衡损失,我们将 𝛼1设置为0.003, 𝛼2设置为0.05, 𝛼3设置为0.02在训练期间采用Token-Dropping策略以加速,但在评估时不丢弃任何token

此外,DeepSeek-V2基于HAI-LLM框架(High-flyer, 2023)进行训练,这是高效且轻量的训练框架

    它采用了16路零气泡流水线并行(Qi等,2023),8路专家并行(Lepikhin等,2021),以及ZeRO-1数据并行(Rajbhandari等,2020)鉴于DeepSeek-V2激活的参数相对较少,并且部分操作符会重新计算以节省激活内存,因此可以在不需要张量并行的情况下进行训练,从而减少通信开销此外,为了进一步提高训练效率,我们将共享专家的计算与专家并行的全对全通信重叠且还为通信、路由算法和融合定制了更快的CUDA内核 以及还基于改进版的 FlashAttention-2 (Dao, 2023) 进行了优化

最终,他们在配备 NVIDIA H800 GPU 的集群上进行所有实验。H800 集群中的每个节点包含 8 个GPU,这些 GPU 在节点内使用 NVLink 和 NVSwitch 连接。 在节点之间,使用 InfiniBand 互连来促进通信

3.1.3 长上下文扩展

在 DeepSeek-V2 的初始预训练之后,他们采用 YaRN「关于YaRN,详见此文《大模型长度扩展综述:从直接外推ALiBi、插值PI、NTK-aware插值(对此介绍最详)、YaRN到S2-Attention》的第四部分」将默认上下文窗口长度从 4K 扩展到 128K

且另外训练了模型 1000 步,序列长度为 32K,批量大小为 576 个序列。 尽管训练仅在32K的序列长度下进行,但在128K的上下文长度下评估时,该模型仍表现出强大的性能

如下图所示,“大海捞针”(NIAH)测试的结果表明,DeepSeek-V2在所有上下文窗口长度(最长至128K)上表现良好

3.1.4 训练和推理效率

如论文中所说

在训练成本上

    由于 DeepSeek-V2 对每个 token 激活的参数较少且所需的 FLOPs 少于 DeepSeek 67B,理论上训练 DeepSeek-V2 将比训练 DeepSeek 67B 更经济尽管训练一个 MoE 模型会引入额外的通信开销,但通过相应的操作和通信优化,DeepSeek-V2 的训练可以达到相对较高的模型 FLOPs 利用率 (MFU)在对 H800 集群的实际训练中,每训练一万亿个 token,DeepSeek 67B 需要 300.6K GPU 小时,而 DeepSeek-V2 仅需 172.8K GPU 小时,即稀疏的 DeepSeek-V2 比密集的 DeepSeek 67B 节省了 42.5% 的训练成本

在推理效率上

    为了高效地部署DeepSeek-V2服务,首先将其参数转换为FP8精度。此外,我们还对DeepSeek-V2进行KV缓存量化(Hooper等,2024;赵等,2023),以进一步将其KV缓存中的每个元素平均压缩到6位 得益于MLA和这些优化,实际部署的DeepSeek-V2所需的KV缓存显著少于DeepSeek 67B,因此可以服务更大的批处理大小基于实际部署的DeepSeek 67B服务的提示和生成长度分布评估了DeepSeek-V2的生成吞吐量 在单个节点上配备8个H800 GPU,DeepSeek-V2实现了超过每秒50K个token的生成吞吐量,是DeepSeek 67B最大生成吞吐量的5.76倍 此外,DeepSeek-V2 的提示输入吞吐量超过每秒 100K 个token

3.2 对齐:监督微调与强化学习

3.2.1 DeepSeek-V2的一些微调、评估细节

基于之前DeepSeek-AI,他们整理了包含 150 万实例的指令微调数据集,其中包括 120 万个有用性实例和 30 万个安全性实例

与初始版本相比,改进了数据质量,以减少幻觉反应并提高写作能力且对 DeepSeek-V2 进行了 2 个周期的微调,学习率设置为 5 × 10−6

为了评估 DeepSeek-V2 Chat(SFT)

    主要包括基于生成的基准测试,除了几个具有代表性的多项选择任务(MMLU 和 ARC)且还对 DeepSeek-V2 Chat(SFT)进行了指令跟随评估(IFEval),使用提示级松散准确率作为指标此外,我们使用2023年9月1日至2024年4月1日期间的LiveCodeBench (Jain et al., 2024)问题来评估聊天模型除了标准基准测试外,还在开放式对话基准测试中评估了模型,包括MT-Bench (Zheng et al., 2023)、AlpacaEval 2.0 (Dubois et al., 2024)和AlignBench (Liu et al., 2023)

3.2.2 DeepSeek-V2通过GRPO训练策略模型

为了进一步释放DeepSeek-V2的潜力并使其与人类偏好对齐,进行强化学习(RL)以调整其偏好,且为了节省强化学习的训练成本,采用了上文第一部分介绍过的GRPO——详见《一文速览DeepSeekMath及GRPO:通俗理解群体相对策略优化GRPO(含DeepSeek-Coder的简介)》

在具体的训练策略上,采用了两阶段的强化学习训练策略,首先进行推理对齐,然后进行人类偏好对齐

更多,可以参见原论文