作者: DeepSeek AI论文地址: https://github.com/deepseek-ai/DeepSeek-V3/blob/main/DeepSeek_V3.pdfGithub地址:https://github.com/deepseek-ai/DeepSeek-V3摘要:我们推出了DeepSeek-V3,这是一款强大的混合专家(Mixture-of-Experts, MoE)语言模型,总参数量达到6710亿,每个token激活的参数量为370亿。为了实现高效的推理和成本效益的训练,DeepSeek-V3采用了多头潜在注意力机制
我们推出了DeepSeek-V3,这是一款强大的混合专家(Mixture-of-Experts, MoE)语言模型,总参数量达到6710亿,每个token激活的参数量为370亿。为了实现高效的推理和成本效益的训练,DeepSeek-V3采用了多头潜在注意力机制(Multi-head Latent Attention, MLA)和DeepSeekMoE架构,这些技术在DeepSeek-V2中得到了充分验证。此外,DeepSeek-V3首创了一种无需辅助损失的负载均衡策略,并设定了多token预测的训练目标,以进一步提升性能。我们在14.8万亿个多样且高质量的token上对DeepSeek-V3进行了预训练,随后通过监督微调和强化学习阶段充分释放其潜力。
综合评估表明,DeepSeek-V3在性能上超越了其他开源模型,并与领先的闭源模型相媲美。尽管表现出色,DeepSeek-V3的完整训练仅需278.8万H800 GPU小时。此外,其训练过程非常稳定。在整个训练过程中,我们没有遇到任何不可恢复的损失突增或进行任何回滚操作。
访问官方网址并登陆,生成速度肉眼可见的快,不愧是较V2.5生成吞吐速度由20TPS提升到60TPS,使用体验上非常流畅。
在 H800 集群上部署了 DeepSeek-V3,其中每个节点内的 GPU 都使用 NVLink 互连,并且集群中的所有 GPU 都通过 IB 完全互连。为了同时确保在线服务的服务级别目标 (SLO) 和高吞吐量,我们采用以下部署策略来分隔预填充和解码阶段。
预填充阶段的最小部署单元由4个节点组成,每个节点配备32个GPU。注意力部分采用了4路张量并行(TP4)结合序列并行(SP),并与8路数据并行(DP8)相结合。其较小的TP规模(4路)限制了TP通信的开销。对于MoE部分,我们使用了32路专家并行(EP32),这确保了每个专家处理足够大的批量大小,从而提高了计算效率。对于MoE的all-to-all通信,我们采用了与训练阶段相同的方法:首先通过IB(InfiniBand)在节点之间传输token,然后通过NVLink在节点内的GPU之间转发。特别地,我们在浅层密集MLP中使用1路张量并行,以节省TP通信开销。
为了实现MoE部分中不同专家之间的负载均衡,我们需要确保每个GPU处理大致相同数量的token。为此,我们引入了一种冗余专家的部署策略,即对高负载专家进行复制并冗余部署。高负载专家是基于在线部署期间收集的统计数据检测的,并会定期调整(例如每10分钟)。在确定冗余专家集合后,我们根据观察到的负载情况,在节点内的GPU之间精心重新安排专家,力求在不增加跨节点全对全通信开销的情况下,尽可能平衡GPU之间的负载。对于DeepSeek-V3的部署,我们在预填充阶段设置了32个冗余专家。对于每个GPU,除了其原本承载的8个专家外,还将额外承载一个冗余专家。
此外,在预填充阶段,为了提高吞吐量并隐藏全对全通信和TP通信的开销,我们同时处理两个计算工作量相似的微批次,将一个微批次的注意力和MoE与另一个微批次的调度和组合重叠执行。
最后,我们正在探索一种动态专家冗余策略,即每个GPU承载更多的专家(例如16个专家),但在每次推理步骤中仅激活其中的9个。在每层的全对全操作开始之前,我们会动态计算全局最优的路由方案。鉴于预填充阶段涉及大量计算,计算该路由方案的开销几乎可以忽略不计。
在解码阶段,我们将共享专家视为一个被路由的专家。从这个角度来看,每个token在路由过程中会选择9个专家,其中共享专家被视为一个高负载专家,始终会被选中。解码阶段的最小部署单元由40个节点组成,每个节点配备320个GPU。注意力部分采用TP4结合SP,并与DP80相结合,而MoE部分则使用EP320(并行计算策略)。在MoE部分,每个GPU仅承载一个专家,其中64个GPU负责承载冗余专家和共享专家。调度和组合部分的all-to-all通信通过IB的直接点对点传输实现,以达到低延迟。此外,我们利用IBGDA(NVIDIA, 2022)技术进一步最小化延迟并提升通信效率。
与预填充阶段类似,我们基于在线服务中统计的专家负载,以一定周期确定冗余专家集合。然而,由于每个GPU仅承载一个专家,因此无需重新安排专家。我们也在探索解码阶段的动态冗余策略。不过,这需要对计算全局最优路由方案的算法以及与调度内核的融合进行更精细的优化,以减少开销。
此外,为了提高吞吐量并隐藏全对全通信的开销,我们也在探索在解码阶段同时处理两个计算工作量相似的微批次。与预填充阶段不同,解码阶段中注意力部分占据了更多的时间。因此,我们将一个微批次的注意力计算与另一个微批次的dispatch+MoE+combine操作重叠执行。在解码阶段,每个专家的批量大小相对较小(通常在256个token以内),瓶颈在于内存访问而非计算。由于MoE部分只需加载一个专家的参数,内存访问开销较小,因此使用较少的SM(流式多处理器)不会显著影响整体性能。因此,为了避免影响注意力部分的计算速度,我们可以仅为dispatch+MoE+combine操作分配一小部分SM。
硬件设计建议
基于我们在all-to-all通信和 FP8 训练方案中的实现,我们向AI 硬件供应商提出以下芯片设计建议。
1. 通信硬件
在 DeepSeek-V3 中,我们通过实现计算与通信的重叠来隐藏计算过程中的通信延迟。与串行计算和通信相比,这显著降低了对通信带宽的依赖。然而,当前的通信实现依赖于昂贵的 SM(例如,我们在 H800 GPU 的 132 个 SM 中分配了 20 个用于此目的),这会限制计算吞吐量。此外,使用 SM 进行通信会导致显著的效率低下,因为张量核心(tensor cores)完全未被充分利用。
目前,SM 主要在all-to-all通信中执行以下任务:
- 在 IB和 NVLink 域之间转发数据,同时聚合来自单个 GPU 的、目标为同一节点内多个 GPU 的 IB 流量。
- 在 RDMA 缓冲区(注册的 GPU 内存区域)和输入/输出缓冲区之间传输数据。
- 执行all-to-all组合(combine)的归约操作。
- 在跨 IB 和 NVLink 域的块数据传输到多个专家时,管理细粒度的内存布局。
我们希望未来的供应商能够开发一种硬件,将这些通信任务从宝贵的计算单元 SM 中卸载出来,作为 GPU 协处理器或网络协处理器,类似于 NVIDIA SHARP(Graham et al., 2016)。此外,为了降低应用程序编程的复杂性,我们希望这种硬件能够从计算单元的角度统一 IB(横向扩展)和 NVLink(纵向扩展)网络。通过这种统一的接口,计算单元可以基于简单的原语提交通信请求,轻松完成跨整个 IB-NVLink 统一域的读取、写入、多播和归约等操作。
2. 计算硬件
**提高 Tensor Core 中 FP8 GEMM 累加精度**
在 NVIDIA Hopper 架构的当前 Tensor Core 实现中,FP8 GEMM(通用矩阵乘法)采用定点累加,通过在加法前根据最大指数右移来对齐尾数乘积。我们的实验表明,在符号填充右移后,它仅使用每个尾数乘积的最高 14 位,并截断超出此范围的位。然而,例如,为了从 32 次 FP8×FP8 乘法的累加中获得精确的 FP32 结果,至少需要 34 位精度。因此,我们建议未来的芯片设计提高 Tensor Core 的累加精度,以支持全精度累加,或根据训练和推理算法的精度要求选择合适的累加位宽。这种方法在保持计算效率的同时,确保误差保持在可接受的范围内。
**支持分块量化**
当前的 GPU 仅支持逐张量量化,缺乏对我们分块量化等细粒度量化的原生支持。在当前实现中,当达到量化间隔时,部分结果会从 Tensor Core 复制到 CUDA Core,乘以缩放因子,并添加到 CUDA Core 的 FP32 寄存器中。尽管结合我们的精确 FP32 累加策略,反量化开销已显著减少,但 Tensor Core 和 CUDA Core 之间的频繁数据移动仍然限制了计算效率。因此,我们建议未来的芯片通过使 Tensor Core 能够接收缩放因子并实现分组缩放的 MMA(矩阵乘法累加)来支持细粒度量化。这样,整个部分和累加和反量化可以直接在 Tensor Core 内部完成,直到生成最终结果,从而避免频繁的数据移动。
**支持在线量化**
当前的实现难以有效支持在线量化,尽管我们的研究已证明其有效性。在现有流程中,我们需要从 HBM(高带宽内存)中读取 128 个 BF16 激活值(前一次计算的输出)进行量化,然后将量化的 FP8 值写回 HBM,再重新读取以进行 MMA。为了解决这种低效问题,我们建议未来的芯片将 FP8 转换和 TMA(Tensor Memory Accelerator)访问集成到单个融合操作中,从而在将激活从全局内存传输到共享内存的过程中完成量化,避免频繁的内存读写。我们还建议支持 warp 级别的转换指令以加速操作,这进一步促进了层归一化和 FP8 转换的更好融合。或者,可以采用近内存计算方法,将计算逻辑放置在 HBM 附近。在这种情况下,BF16 元素在从 HBM 读取到 GPU 时可以直接转换为 FP8,从而将片外内存访问减少约 50%。
**支持转置 GEMM 操作**
当前架构使得将矩阵转置与 GEMM 操作融合变得非常繁琐。在我们的工作流程中,前向传播期间的激活被量化为 1x128 FP8 分块并存储。在反向传播期间,需要读取矩阵、反量化、转置、重新量化为 128x1 分块并存储在 HBM 中。为了减少内存操作,我们建议未来的芯片在 MMA 操作之前支持直接从共享内存中转置读取矩阵,适用于训练和推理中所需的精度。结合 FP8 格式转换和 TMA 访问的融合,这一改进将显著简化量化工作流程。
我们首先介绍 DeepSeek-V3 的基本架构,其特点是采用多头潜在注意力机制(Multi-head Latent Attention, MLA)(DeepSeek-AI, 2024c)以实现高效推理,以及 DeepSeekMoE(Dai et al., 2024)以实现经济的训练。接着,我们提出了一种多 Token 预测(Multi-Token Prediction, MTP)的训练目标,我们观察到这一目标能够提升模型在评估基准上的整体性能。对于未明确提及的其他细节,DeepSeek-V3 遵循 DeepSeek-V2(DeepSeek-AI, 2024c)的设置。
1. 基本架构
DeepSeek-V3 的基本架构仍然基于Transformer(Vaswani et al., 2017)框架。为了实现高效推理和经济的训练,DeepSeek-V3 同样采用了 MLA 和 DeepSeekMoE,这两项技术已在 DeepSeek-V2 中得到了充分验证。与 DeepSeek-V2 相比,一个例外是我们额外引入了一种无辅助损失的负载均衡策略(Wang et al., 2024a)用于 DeepSeekMoE,以缓解因确保负载均衡而导致的性能下降。图 2 展示了 DeepSeek-V3 的基本架构,我们将在本节简要回顾 MLA 和 DeepSeekMoE 的细节。
**Multi-Head Latent Attention**
在注意力机制方面,DeepSeek-V3 采用了 MLA(多头潜在注意力)架构。令表示嵌入维度,表示注意力头的数量,表示每个头的维度,表示给定注意力层中第 个 token 的注意力输入。MLA 的核心是对注意力键(Key)和值(Value)进行低秩联合压缩,以减少推理过程中的 Key-Value(KV)缓存:
其中,是键(Key)和值(Value)的压缩潜在向量;(≪)表示键值压缩维度;表示下投影矩阵;分别是键和值的上投影矩阵;是用于生成携带旋转位置嵌入(RoPE)(Su et al., 2024)的解耦键的矩阵;RoPE(·) 表示应用 RoPE 矩阵的操作;[·; ·] 表示拼接操作。需要注意的是,对于 MLA,在生成过程中只需要缓存蓝色框内的向量(即和,这显著减少了键值缓存,同时保持了与标准多头注意力(MHA)(Vaswani et al., 2017)相当的性能。
对于注意力查询(Query),我们也进行了低秩压缩,这可以减少训练期间的激活内存:
其中,是查询(Query)的压缩潜在向量;(≪)表示查询压缩维度; 和 分别是查询的下投影和上投影矩阵; 是用于生成携带 RoPE 的解耦查询的矩阵。
最终,注意力查询、键和值被组合以生成最终的注意力输出:
其中, 表示输出投影矩阵。
DeepSeekMoE 的基本架构 在前馈网络(FFN)部分,DeepSeek-V3 采用了 DeepSeekMoE 架构(Dai et al., 2024)。与传统的 MoE 架构(如 GShard,Lepikhin et al., 2021)相比,DeepSeekMoE 使用了更细粒度的专家,并将部分专家隔离为共享专家。令 表示第 个 token 的 FFN 输入,我们通过以下方式计算 FFN 输出 :
其中, 和 分别表示共享专家和路由专家的数量; 和 分别表示第 个共享专家和第 个路由专家;表示激活的路由专家数量; 是第 个专家的门控值;是 token 与专家的亲和度; 是第 个路由专家的中心向量; 表示第 个 token 与所有路由专家计算的亲和度分数中最高的 个分数的集合。与 DeepSeek-V2 略有不同,DeepSeek-V3 使用 sigmoid 函数计算亲和度分数,并在所有选定的亲和度分数之间进行归一化以生成门控值。
无辅助损失负载均衡 对于 MoE 模型,专家负载不均衡会导致路由崩溃(Shazeer et al., 2017),并在专家并行场景中降低计算效率。传统解决方案通常依赖辅助损失(Fedus et al., 2021; Lepikhin et al., 2021)来避免负载不均衡。然而,过大的辅助损失会损害模型性能(Wang et al., 2024a)。为了在负载均衡和模型性能之间实现更好的权衡,我们首创了一种 无辅助损失负载均衡策略(Wang et al., 2024a)来确保负载均衡。具体来说,我们为每个专家引入一个偏置项 ,并将其添加到相应的亲和度分数中以确定 Top-K 路由:
需要注意的是,偏置项仅用于路由。门控值(将与 FFN 输出相乘)仍然从原始亲和度分数中导出。在训练过程中,我们持续监控每个训练步骤中整个批次的专家负载。在每个步骤结束时,如果某个专家过载,我们将其偏置项减少 γ;如果某个专家欠载,我们将其偏置项增加 γ,其中γ是一个称为偏置更新速度的超参数。通过这种动态调整,DeepSeek-V3 在训练过程中保持了专家负载的均衡,并实现了比单纯依赖辅助损失来促进负载均衡的模型更好的性能。
补充的序列级辅助损失 尽管 DeepSeek-V3 主要依赖无辅助损失策略来实现负载均衡,但为了防止任何单个序列内的极端不均衡,我们还采用了补充的序列级均衡损失:
其中,均衡因子α是一个超参数,在 DeepSeek-V3 中会被赋予一个极小的值;是指示函数;表示序列中的 token 数量。序列级均衡损失鼓励每个序列上的专家负载保持均衡。
节点限制路由 与 DeepSeek-V2 使用的设备限制路由类似,DeepSeek-V3 也采用了一种受限路由机制来限制训练期间的通信成本。简而言之,我们确保每个 token 最多被发送到个节点,这些节点是根据分布在该节点上的专家的最高个亲和度分数的总和选择的。在此约束下,我们的 MoE 训练框架几乎可以实现计算与通信的完全重叠。
无 Token 丢弃 由于有效的负载均衡策略,DeepSeek-V3 在整个训练过程中保持了良好的负载均衡。因此,DeepSeek-V3 在训练期间不会丢弃任何 token。此外,我们还实施了特定的部署策略以确保推理负载均衡,因此 DeepSeek-V3 在推理期间也不会丢弃 token。
**Multi-Token Prediction**
受Gloeckle等人(2024)的启发,我们为DeepSeek-V3研究并设定了一个多令牌预测(MTP)目标,该目标将预测范围扩展到每个位置的多个未来令牌。一方面,MTP目标增强了训练信号的密度,可能提高数据效率。另一方面,MTP可能使模型能够预先规划其表示,以更好地预测未来的令牌。图3展示了我们实现MTP的方式。与Gloeckle等人(2024)使用独立的输出头并行预测D个额外令牌不同,我们顺序预测额外令牌,并在每个预测深度保持完整的因果链。
本文,完。觉得本篇文章不错的,记得随手点个赞、收藏和转发三连,感谢感谢~如果想第一时间收到推送,请记得关注我们⭐~
来源:AIGC研究社