当前位置: 首页 > article >正文

DeepSeek V3报告阅读

引言

总的来说,DeepSeek V3在技术报告的Introduction中提出的技术亮点如下:

  • 在架构方面,开创了一种无需辅助损失的负载均衡策略,这种策略最小化了因鼓励负载均衡而产生的性能下降;研究了多标记预测(MTP)目标,并证明它对模型性能有益。它也可以用于推理加速的推测性解码
  • 在预训练方面,设计了一个FP8混合精度训练框架,并首次验证了在超大规模模型上进行FP8训练的可行性和有效性;通过算法、框架和硬件的共同设计,克服了跨节点MoE训练中的通信瓶颈,实现了接近完全的计算-通信重叠,这显著提高了训练效率并降低了训练成本
  • 在后训练方面,提出用于从CoT模型中提取推理能力,特别是从DeepSeek R1系列模型之一中,将其提炼到DeepSeek-V3中;将R1的验证和反思模式融入DeepSeek-V3,并显著提高了其推理性能;同时,还保持了对DeepSeek-V3输出风格和长度的控制。

该技术报告从架构、基础设施、预训练和后训练四个方面展开,由于有不少技术已经出现在了V2报告中,因此本文只关注V3与V2相比增加了什么内容,或者有哪些改进

不了解V2可以看这篇文章:DeepSeek V2报告阅读-CSDN博客

Architechture

为了高效的推理和经济的训练,DeepSeek-V3还采用了MLA和DeepSeekMoE,这些都通过DeepSeek V2得到了充分验证。与DeepSeek-V2相比,V3额外引入了无辅助损失的负载均衡策略。

由于在V2中就使用了MLA和DeepSeekMoE,所以理解这部分内容也可以参考:Deepseek-V2技术报告解读!全网最细!

上面这篇文章有模型的详细参数量,以及transformers库中的模型代码

MLA

MLA 的核心是对注意力键和值进行低秩联合压缩,以减少推理过程中的KV缓存

但看V3技术报告可能理解起来有些困难,可以参考这篇文章来了解MLA的详细内容:https://zhuanlan.zhihu.com/p/696380978

整体来说,MLA要解决的问题就是KV cache占用的空间太大,之前的一些节省占用的MQA/GQA方法虽然有用但是损耗性能。于是MLA通过将每个token的k和v向量压缩成一个维度远小于隐藏层维度的隐向量latent vector(在V2中这个维度是1536,压缩前的维度是5120),来节约缓存的占用。在推理时用两个矩阵来对隐向量升维,得到之前的kv(近似)

此外,为了降低训练过程中的激活内存activation memory,MLA还对queries进行低秩压缩,即便这并不能降低KV Cache。也就是说,把之前的Q的权重矩阵进行低秩近似,变成两个小矩阵。

另外,由于低秩分解无法和RoPE兼容,因此还针对这个问题进行了改进。

DeepSeek MoE

模型共有60个层,注意力头数为128,总的门控专家个数为160,每个token计算有6个门控专家被激活,同时还有2个共享专家保持激活状态,共计8个被激活的专家。

在经过embedding层后,与Deepseek-MoE保持一致,首先会经过一个共享的大Decoder层进行第一层计算,这层模型的attention计算设定与后续59层基本一致,唯一区别是这一层的mlp层固定为8个专家的宽度,没有门控额外参数激活的设定。这一设置与每层共享专家的设定一样,研究者希望语言生成的公共知识(包含流畅性、逻辑性等)被存储在这里。

在MoE中涉及到一些路由专家选择的知识,比如说token到某个专家的亲合度(衡量这个专家是否适合处理当前token)、路由专家的质心向量(某个专家在特定时间段内接收到的输入 token 特征的“平均表示”)。

整个架构的结构图如下:

无辅助损失的负载均衡策略

对于 MoE 模型来说,专家负载不平衡会导致路由崩溃并降低专家并行场景下的计算效率。传统解决方案通常依靠辅助损失来避免负载不平衡。然而,过大的辅助损失会损害模型性能。

技术报告中提到的无辅助损失的负载均衡策略,本质上是给每个专家设置一个超参数偏置项b。如果在训练过程中发现有些专家负载太小,就把b调大,以增加这个专家与token之间的亲合度;反之则把b调小。

节点限制路由:确保每个 token 最多只会被发送到 M 个节点,这些节点是根据每个节点上分布的专家的最高M/K 个亲和度分数总和来选择的。比如说256个专家分布在16个节点上,每个节点有16个专家,token最多只被发送到4个节点上,那么每次就分别计算每个专家对该token的亲合度并按照所在节点进行累加,总亲和度最高的4个节点被作为目标节点。

在此约束条件下,MoE 训练框架能够实现近乎完整的计算与通信重叠。这应该也是训练时间短的关键之一吧。

MTP

multi-token prediction,多token预测。受到 Gloeckle 等人(2024)研究的启发,为 DeepSeek-V3 探索并设置了多 Token 预测(MTP)目标,将预测范围扩展到每个位置的多个未来 token。

这种方法具有双重优势:一方面,MTP 目标能够使训练信号更加密集,有望提升数据使用效率;另一方面,MTP 使模型能够预先规划其表示,从而更好地预测未来 token。

下图是MTP示意图。这就是Eagle,后文也提到了,这个结构和EAGLE类似,但并没有用于投机解码,而是用于改善训练。

MTP的训练过程损失函数公式如下。T表示的是预测的总长度,比如提前预测下面的5个token,k是预测的深度,也就是预测的第几个token,p表示预测出的概率,t表示实际标签。这个损失作为模型的补充训练目标。

L_k^{\text{MTP}} = \text{CrossEntropy} \left( p_{2+k}^{k+1} (2 + k + 1) \right) = -\frac{1}{T} \sum_{z=k+1}^{T} \log p_{t_i} [t_i],

当前的deepseek V3并没有在推理中应用MTP进行投机解码。

infra

训练框架

训练DeepSeek V3使用了2048块H800 GPU,H800集群中的每个节点包含8个通过NVLink和节点内的NVSwitch连接的GPU。在不同节点之间,使用InfiniBand (IB)互连来促进通信。

DeepSeek-V3的训练得到了HAI-LLM框架的支持,应用了16路的流水线并行(PP,也就是把整个模型从上到下划分成了16个stage)、64路专家并行(EP)跨越8个节点(也就是让所有的专家分布在8节点即64张卡上),以及ZeRO-1数据并行(DP)。

为了促进DeepSeek-V3的高效训练,设计了双管道(DualPipe)算法以实现高效的管道并行。与现有的PP方法相比,DualPipe具有更少的管道气泡。更重要的是,它重叠了forward和backward过程中的计算和通信阶段,从而解决了由跨节点专家并行引入的沉重通信开销的挑战。

下图是DualPipe的示例,将模型划分成8个stage,每次给20个微批次。前10个批次从0号设备开始前向传播-反向传播,后10个微批次从7号设备开始前向传播-反向传播,因此叫做双向流水线。

了解这个双向流水线是如何重叠计算和通信的,可以看这篇文章:https://www.zhihu.com/question/7837132971/answer/65842498313

其次,开发了高效的跨节点全对全通信核心,充分利用了IB和NVLink的带宽,并保留了专门用于通信的流式多处理器(SMs)。节点内GPU的NVLink通信速度大约是节点间GPU的IB通信速度的3.2倍,因此将一个token传递到另一个节点的耗时是传递到节点内另一个GPU的3.2倍。通过重叠这个节点间和节点内通信时间,将每个token限制为最多被分发给4个节点,那么最多可以路由给4*3.2=13个专家,这比实际的8个专家多。总体而言,只需要最多20个SM就能充分利用IB和NVlink带宽。它们也是在这个过程中提到使用PTX

最后,优化了训练过程中的显存占用,从而使得我们能够在不使用昂贵的张量并行(TP)的情况下训练DeepSeek-V3。节约显存占用的方式包括:反向传播期间重新计算RMSNorm和MLA up-projection、MTP模块与主模块之间共享嵌入和输出头、在CPU中保存模型参数的EMA(类似于adam的动量)

简单来说,infra训练框架方面的创新有:双向流水线,它减少了PP过程中的气泡,并且使得通信与计算重叠;高效的跨节点全对全通信,使得IB和NVlink的通信重叠;多种方式优化显存占用

FP8训练

受近期低精度训练的进展启发,提出了一种使用FP8数据格式进行DeepSeek-V3训练的细粒度混合精度框架。尽管低精度训练前景广阔,但它通常受限于激活值、权重和梯度中存在异常值。尽管在推理量化方面取得了显著进展,但在LLM预训练中成功应用低精度技术的研究相对较少。

简单来说就是GEMM是用FP8来训练的,其他对精度敏感的部分还是用混合精度来做的。

这部分介绍的内容也是挺多的,包括混合精度框架、量化和乘法带来的精确度提升、低精度存储和通信,但是目前水平有限,看不懂这些东西

推理

简单来说就是百卡集群上的PD分离

prefill的最小部署单元由4个节点组成,总共有32个GPU。注意力部分采用4路张量并行(TP4)与序列并行(SP)相结合,以及8路数据并行(DP8)。对于MoE部分,使用32路专家并行(EP32),这确保了每个专家处理足够大的批量大小,从而提高了计算效率。对于MoE的全连接通信,使用与训练相同的方法:先通过IB在节点间传token,然后通过NVLink在节点内GPU之间转发。对浅层的密集MLP使用1路张量并行,以节省TP通信。

为了在MoE部分的不同专家之间实现负载均衡,我们需要确保每个GPU处理的token数量大致相同。为此引入了一种冗余专家的部署策略,也就是检测过去一段时间(比如10分钟)内负载最高的专家,然后这个冗余专家就变成了两份,一份是原本的,另一份作为冗余专家,冗余专家来帮忙分担负载。这样,每个卡上就有了8个专家和一个冗余专家。

decode使用的是40机320卡。在解码过程中,将共享专家视为一个路由专家。从这个角度来看,每个token在路由过程中会选择9个专家,其中共享专家被视为一个总是会被选择的重负载专家。注意力部分使用TP4配合SP,并结合DP80,而MoE部分使用EP320。对于MoE部分,每个GPU只托管一个专家,而64个GPU负责托管冗余专家和共享专家。调度和组合部分的全连接通信通过IB直接点对点传输来实现低延迟。

与prefill类似,定期根据在线服务的统计专家负载来确定一定时间间隔内的冗余专家集合。然而,由于每个GPU只托管一个专家,我们不需要重新排列专家。我们还在探索解码的动态冗余策略。然而,这需要对计算全局最优路由方案的算法进行更仔细的优化,并与调度内核融合以减少开销。

此外,注意力机制在解码阶段消耗了更多的时间。因此,将一个微批次的注意力与另一个的调度+MoE+组合操作重叠。在解码阶段,每个专家的批次大小相对较小(通常在256个token以内),瓶颈是内存访问而不是计算。由于MoE部分只需要加载一个专家的参数,内存访问的开销最小,因此使用较少的SMs不会显著影响整体性能。因此,为了避免影响注意力部分的计算速度,我们可以只分配一小部分SMs给调度+MoE+组合。

结论

在这篇论文介绍了DeepSeek-V3,这是一个拥有671B总参数和37B激活参数的大型MoE语言模型,它在14.8T tokens上进行了训练。除了MLA和DeepSeekMoE架构之外,它还开创了一种无辅助损失的负载均衡策略,并为更强的性能设定了多令牌预测训练目标。由于FP8训练的支持和精心的工程优化,DeepSeek-V3的训练成本效益很高。训练后的蒸馏也成功地从DeepSeek-R1系列模型中提取了推理能力。它的完整训练,包括预训练、上下文长度扩展和训练后处理,仅需要278.8万H800 GPU小时。

在承认DeepSeek-V3的强大性能和成本效益的同时,也存在一些局限性,特别是在部署方面。首先,为了确保高效的推理,推荐的DeepSeek-V3部署单元相对较大,这可能会给小型团队带来负担。其次,尽管DeepSeek-V3已经实现了比DeepSeek-V2高出两倍以上的端到端生成速度,但仍有进一步提升的潜力。幸运的是,随着更先进硬件的发展,这些局限性预计将会自然得到解决。

团队未来的方向:

  • 持续研究和改进我们的模型架构,旨在进一步提高训练和推理的效率,努力实现对无限上下文长度的有效支持。此外,我们将尝试突破Transformer的架构限制,从而拓展其建模能力的边界。
  • 不断迭代训练数据数量和质量,探索引入额外的训练信号源,旨在推动数据在更全面的维度范围内进行扩展。
  • 持续探索和迭代模型的深度思考能力,通过扩展它们的推理长度和深度,旨在增强它们解决问题的能力。
  • 探索更全面和多维度的模型评估方法,以防止在研究过程中优化固定的一组基准测试的倾向,这可能会造成对模型能力的误导印象,并影响我们基础的评估。

整体而言,如果是V2的最大贡献是提出新的架构,那么V3的最大贡献就是对infra的极致化利用,通过各种重叠,节约了计算时间,这在训练和推理过程中都有体现,从而大大降低训练成本。

参考

  1. DeepSeek V3技术报告: [2412.19437] DeepSeek-V3 Technical Report
  2. V3技术报告的翻译:https://zhuanlan.zhihu.com/p/15875767628


http://www.kler.cn/a/537706.html

相关文章:

  • Spring Boot篇
  • 绿色工厂的好处
  • ASP.NET Core中Filter与Middleware的区别
  • 互联网分布式ID解决方案
  • JVM执行流程与架构(对应不同版本JDK)
  • 【万字详细教程】Linux to go——装在移动硬盘里的Linux系统(Ubuntu22.04)制作流程;一口气解决系统安装引导文件迁移显卡驱动安装等问题
  • deepseek从网络拓扑图生成说明文字实例
  • 玩转Docker | 使用Docker部署httpd服务
  • ESP32S3基于espidf 深度睡眠模式和唤醒使用
  • XML Schema 限定 / Facets
  • leetcode1313--解压缩编码列表
  • Kong故障转移参数配置
  • [图文]课程讲解片段-Fowler分析模式的剖析和实现01
  • 2025.2.8——一、[护网杯 2018]easy_tornado tornado模板注入
  • CNN-day10-经典神经网络MobileNet V1&V2&V3
  • Spring 中的 事务 隔离级别以及传播行为
  • kafka 3.5.0 raft协议安装
  • PHP在线客服系统
  • 【WebLogic】Oracle发布WebLogic 14c最新版本-14.1.2.0
  • 「JVS更新日志」生产计划排程系统APS已上线!以及智能BI、低代码、规则引擎2.6更新说明
  • anaconda中可以import cv2,但是notebook中cv2 module not found
  • 深入理解 C++17 std::is_swappable
  • 使用 Axios ——个人信息修改与提示框实现
  • 参数映射服务完整解决方案
  • Could not create task ‘:mainActivity:minifyReleaseWithR8‘.
  • 【Flink快速入门-8.Flink Flink 架构介绍】