专栏名称: 计算机视觉深度学习和自动驾驶
讨论计算机视觉、深度学习和自动驾驶的技术发展和挑战
目录
相关文章推荐
丁香医生  ·  想老得慢一点,劝你先把脸皮「变厚」! ·  昨天  
营养师顾中一  ·  你其实从没吃过「香芋」,不信来看! ·  2 天前  
丁香医生  ·  得了关节炎,真的是行走的「晴雨表」吗? ·  3 天前  
51好读  ›  专栏  ›  计算机视觉深度学习和自动驾驶

DeepSeek-V3 技术报告

计算机视觉深度学习和自动驾驶  · 公众号  ·  · 2025-01-15 00:14

正文

24年12月来自深度探索公司的论文“DeepSeek-V3 Technical Report”。

DeepSeek-V3,是一个强大的混合专家 (MoE) 语言模型,总共有 671B 个参数,每个 token 有 37B 个激活参数。为了实现高效的推理和经济高效的训练,DeepSeek-V3 采用多头潜注意 (MLA) 和 DeepSeekMoE 架构,这些架构在 DeepSeek-V2 中得到彻底的验证。此外,DeepSeek-V3 开创一种无辅助损失的负载平衡策略,并设置多 token 预测训练目标以获得更强大的性能。在 14.8 万亿个多样化和高质量的 token 上对 DeepSeek-V3 进行预训练,然后进行监督微调和强化学习阶段,以充分利用其功能。综合评估表明,DeepSeek-V3 优于其他开源模型,并实现与领先闭源模型相当的性能。尽管性能出色,但 DeepSeek-V3 仅需要 2.788M H800 GPU 小时即可完成完整训练。此外,它的训练过程非常稳定。在整个训练过程中,没有遇到任何无法恢复的损失峰值或执行任何回滚(rollback)。


近年来,大语言模型 (LLM) 经历快速迭代和演进(Anthropic,2024;Google,2024;OpenAI,2024a),与通用人工智能 (AGI) 的差距正在逐步缩小。除了闭源模型外,开源模型也在取得重大进展,努力缩小与闭源模型的差距,其中包括 DeepSeek 系列(DeepSeek-AI,2024a、b、c;Guo,2024)、 LLaMA 系列(AI@Meta,2024a、b;Touvron,2023a、b)、 Qwen 系列(Qwen,2023、2024a、b)和 Mistral 系列(Jiang,2023;Mistral,2024)。为了进一步突破开源模型能力的界限,扩大模型规模,并推出 DeepSeek-V3,这是一个大型混合专家 (MoE) 模型,拥有 671B 参数,其中每个 token 激活 37B。

以前瞻性的视角看,始终追求强大的模型性能和经济的成本。因此,在架构方面,DeepSeek-V3 仍然采用多头潜注意 (MLA) (DeepSeek-AI, 2024c) 进行高效推理,采用 DeepSeekMoE (Dai et al., 2024) 进行经济高效的训练。这两种架构已在 DeepSeek-V2 (DeepSeek-AI, 2024c) 中得到验证,证明了它们能够在实现高效训练和推理的同时保持稳健的模型性能。除了基本架构之外,还实施另外两种策略来进一步增强模型能力。首先,DeepSeek-V3 率先采用无辅助损失策略 (Wang et al., 2024a) 来实现负载平衡,旨在最大限度地减少因鼓励负载平衡而对模型性能产生的不利影响。其次,DeepSeek-V3 采用多 token 预测训练目标,这可以提高评估基准上的整体性能。

为了实现高效训练,其支持 FP8 混合精度训练并对训练框架进行全面优化。低精度训练已成为高效训练的一种有前途的解决方案(Dettmers,2022;Kalamkar,2019;Narang,2017;Peng,2023b),其发展与硬件功能的进步密切相关(Luo,2024;Micikevicius,2022;Rouhani,2023a)。这项工作引入一个 FP8 混合精度训练框架,并在极大规模模型上验证其有效性。通过对 FP8 计算和存储的支持,实现加速训练和减少 GPU 内存使用。至于训练框架,设计 DualPipe 算法以实现高效的流水线并行性,它具有更少的流水线气泡,并通过计算通信重叠隐藏训练期间的大部分通信。这种重叠确保了,随模型进一步扩大,只要保持恒定的计算与通信比率,仍然可以跨节点使用细粒度的专家,同时实现接近于零的all-to-all通信开销。此外,还开发高效的跨节点all-to-all通信内核,以充分利用 InfiniBand (IB) 和 NVLink 带宽。此外,优化内存占用,使得无需使用昂贵的张量并行即可训练 DeepSeek-V3。将这些努力结合起来,实现很高的训练效率。

在预训练期间,在 14.8T 高质量、多样化的 token 上训练 DeepSeek-V3。预训练过程非常稳定。在整个训练过程中,没有遇到任何无法恢复的损失峰值或不得不回滚的情况。而且,对 DeepSeek-V3 进行两阶段的上下文长度扩展。第一阶段将最大上下文长度扩展到32K,第二阶段进一步扩展到128K。之后,在DeepSeek-V3的基础模型上进行包括监督微调(SFT)和强化学习(RL)在内的后训练,使其更贴近人类的偏好,进一步释放其潜力。在后训练阶段,从DeepSeek-R1系列模型中提取推理能力,同时小心地保持模型准确率和生成长度之间的平衡。

如图所示DeepSeek-V3基本架构。继 DeepSeek-V2 之后,采用 MLA 和 DeepSeekMoE 进行高效推理和经济训练。与 DeepSeek-V2 相比,一个例外是,为 DeepSeekMoE 额外引入无辅助损耗的负载平衡策略 (Wang et al., 2024a),以减轻因确保负载平衡而导致的性能下降。与 DeepSeek-V2 略有不同,DeepSeek-V3 使用 S 型函数计算亲和力分数,并在所有选定的亲和力分数之间应用归一化来产生门控值。


对于 MoE 模型,专家负载不均衡会导致路由崩溃(Shazeer,2017),并在专家并行场景中降低计算效率。传统解决方案通常依靠辅助损失(Fedus,2021;Lepikhin,2021)来避免负载不均衡。然而,过大的辅助损失会损害模型性能(Wang,2024a)。为了在负载平衡和模型性能之间取得更好的平衡,本文开创一种无辅助损失的负载平衡策略(Wang,2024a)来确保负载平衡。具体来说,为每个专家引入一个偏差项 𝑏/𝑖,并将其添加到相应的亲和力分数 𝑠/𝑖,𝑡 中以确定 top-K 路由。注:偏差项 b/i 仅用于路由。将与 FFN 输出相乘的门控值仍来自原始亲和力得分 𝑠/𝑖,𝑡。在训练期间,持续监控每个训练步骤的整个批次专家负载。在每个步骤结束时,如果其对应的专家超载,将偏差项减少 𝛾,如果其对应的专家负载不足,将偏差项增加 𝛾,其中 𝛾 是一个称为偏差更新速度的超参。通过动态调整,DeepSeek-V3 在训练期间保持专家负载平衡,并且比通过纯辅助损失来鼓励负载平衡的模型获得更好的性能。

尽管 DeepSeek-V3 主要依靠无辅助损失策略来实现负载平衡,但为了防止任何单个序列内的极端不平衡,还采用了互补的序列平衡损失。其中平衡因子 𝛼 是一个超参,对于 DeepSeek-V3,它将被分配一个非常小的值。序列平衡损失鼓励每个序列上的专家负载保持平衡。

与 DeepSeek-V2 使用的设备-限制路由一样,DeepSeek-V3 也使用受限路由机制,来限制训练期间的通信成本。简而言之,确保每个 token 最多被发送到 𝑀 个节点,这些节点是根据每个节点上分布的专家最高 𝐾𝑟/M 亲和力得分总和来选择的。在这个 𝑀 约束下, MoE 训练框架几乎可以实现完全的计算-通信重叠。

由于采用了有效的负载均衡策略,DeepSeek-V3 在整个训练过程中保持良好的负载均衡,因此 DeepSeek-V3 在训练过程中不会丢掉任何 token。此外,还实施特定的部署策略来确保推理负载均衡,因此 DeepSeek-V3 在推理过程中也不会丢掉 token。

受 Gloeckle (2024) 的启发,为 DeepSeek-V3 设置多token预测 (MTP) 目标,将预测范围扩展到每个位置的多个未来token。一方面,MTP 目标使训练信号密集化并可能提高数据效率。另一方面,MTP 可能使模型能够预先规划其表示,以便更好地预测未来的token。如图所示多token预测 (MTP) 实现的说明,其保留每个深度每个token预测的完整因果链。


MTP 实现使用 𝐷 个顺序模块来预测 𝐷 个额外的 token。第 𝑘 个 MTP 模块由共享嵌入层 Emb(·)、共享输出头 OutHead(·)、Transformer 块 TRM𝑘(·) 和投影矩阵 𝑀𝑘 组成。对于第 𝑖 个输入token 𝑡/𝑖,在第 𝑘 个预测深度,首先将第 (𝑘 − 1) 个深度 h^𝑘−1/i 第 𝑖 个token 的表征和第 (𝑖 + 𝑘) 个token 𝐸𝑚𝑏(𝑡/𝑖+𝑘) 的嵌入,与线性投影相结合。注:对于每个 MTP 模块,其嵌入层与主模型共享。组合的 h′^𝑘/i 作为第 𝑘 个深度 Transformer 块的输入,产生当前深度 h^𝑘/𝑖 的输出表示。最后,以 h^𝑘/𝑖 作为输入,共享输出头将计算第 𝑘 个附加预测token 𝑃^𝑘/i+1+k 的概率分布,其中 V 是词汇量。

输出头 OutHead(·) 将表征线性映射到 logits,随后应用 Softmax(·) 函数来计算第 𝑘 个附加tokens的预测概率。此外,对于每个 MTP 模块,其输出头与主模型共享。维护预测因果链的原理与 EAGLE(Li,2024b)类似,但其主要目标是推测解码(Leviathan,2023;Xia,2023),而本文利用 MTP 来改进训练。

MTP训练目标是定义一个交叉熵MTP损失函数,计算所有深度的 MTP 损失平均值,并将其乘以加权因子𝜆以获得整体 MTP 损失,作为 DeepSeek-V3 的额外训练目标。

MTP 推理策略主要是为了提升主模型的性能,因此在推理过程中,可以直接丢弃 MTP 模块,主模型可以独立正常运行。此外,还可以重新利用这些 MTP 模块进行推测解码,以进一步改善生成延迟。


计算群

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

训练框架

DeepSeek-V3 的训练由 HAI-LLM 框架支持,这是一个自身工程师从头开始打造的高效轻量级训练框架。整体而言,DeepSeek-V3 采用 16 路 流水线并行 (PP) (Qi et al., 2023a)、跨 8 个节点的 64 路 专家并行 (EP) (Lepikhin et al., 2021) 和 ZeRO-1 数据并行 (DP) (Rajb-handari et al., 2020)。

为了促进 DeepSeek-V3 的高效训练,进行细致的工程优化。首先,设计 DualPipe 算法以实现高效的流水线并行。与现有的 PP 方法相比,DualPipe 的流水线气泡更少。更重要的是,它将计算和通信阶段重叠在前向和后向过程中,从而解决跨节点专家并行引入的繁重通信开销挑战。其次,开发高效的跨节点all-to-all通信内核,充分利用 IB 和 NVLink 带宽,节省通信专用的 流式多处理器 (SM) 。最后,精心优化训练过程中的内存占用,从而能够在不使用成本高昂的 张量并行 (TP) 的情况下训练 DeepSeek-V3。

DualPipe 的关键思想是在一对单独的前向和后向块内重叠计算和通信。如图所示:一对单独的前向和后向块的重叠策略(Transformer 块的边界不对齐)。橙色表示前向,绿色表示“输入后向”,蓝色表示“权重后向”,紫色表示 PP 通信,红色表示障碍。all-to-all和 PP 通信都可以完全隐藏。


此外,即使在没有沉重通信负担的更一般场景中,DualPipe 仍然表现出效率优势。虽然 DualPipe 需要保留两份模型参数,但由于在训练期间使用了较大的 EP 大小,因此这不会显著增加内存消耗。与 Chimera (Li and Hoefler, 2021) 相比,DualPipe 仅要求流水线阶段和微批次可以被 2 整除,而不要求微批次可以被流水线总阶段整除。此外,对于 DualPipe,随着微批次数量的增加,气泡和激活内存都不会增加。

为了确保 DualPipe 具有足够的计算性能,定制高效的跨节点all-to-all通信内核(包括调度和组合),以节省专用于通信的 SM 数量。内核的实现与 MoE 门控算法和集群的网络拓扑共同设计。具体来说,在集群中,跨节点 GPU 与 IB 完全互连,节点内通信通过 NVLink 处理。NVLink 提供的带宽为 160 GB/s,大约是 IB(50 GB/s)的 3.2 倍。为了有效利用 IB 和 NVLink 的不同带宽,限制每个token最多被调度到 4 个节点,从而减少 IB 流量。对于每个token,在做出路由决策时,它将首先通过 IB 传输到其目标节点上具有相同节点内索引的 GPU。一旦到达目标节点,将努力确保它通过 NVLink 立即转发到承载目标专家的特定 GPU,而不会被随后到达的tokens阻塞。这样,通过 IB 和 NVLink 的通信完全重叠,每个token可以有效地为每个节点平均选择 3.2 个专家,而不会产生来自 NVLink 的额外开销。这意味着,尽管 DeepSeek-V3 在实践中只选择 8 个路由专家,但它可以将这个数字扩展到最多 13 个专家(4 个节点 × 3.2 个专家/节点),同时保持相同的通信成本。总的来说,在这样的通信策略下,只有 20 个 SM 足以充分利用 IB 和 NVLink 的带宽。

具体来说,采用 warp 特殊化技术(Bauer,2014),并将 20 个 SM 划分为 10 个通信通道。在调度过程中,(1) IB 发送、(2) IB 到 NVLink 的转发和 (3) NVLink 接收由各自的 Warp 处理。分配给每个通信任务的 Warp 数量会根据所有 SM 的实际工作量进行动态调整。同样,在组合过程中,(1) NVLink 发送、(2) NVLink 到 IB 的转发和累积, (3) IB 接收和累积,也由动态调整的 Warp 处理。此外,调度和组合内核都与计算流重叠,因此还考虑它们对其他 SM 计算内核的影响。具体来说,采用定制的 PTX(并行线程执行) 指令并自动调整通信块大小,这大大减少了 L2 缓存的使用和对其他 SM 的干扰。

为了减少训练期间的内存占用,我们采用了以下技术。

  1. 重新计算 RMSNorm 和 MLA 上投影。在反向传播期间重计算所有 RMSNorm 操作和 MLA 上投影,从而无需持久存储它们的输出激活。此策略只需很少的开销,即可显著减少存储激活的内存要求。

  2. CPU 中的指数移动平均(EMA)。在训练期间,保留模型参数的EMA,以便在学习率衰减后尽早估计模型性能。EMA 参数存储在 CPU 内存中,并在每个训练步骤后异步更新。这种方法能够维护 EMA 参数,而不会产生额外的内存或时间开销。

  3. 用于多token预测的共享嵌入和输出头。使用 DualPipe 策略,将模型的最浅层(包括嵌入层)和最深层(包括输出头)部署在相同的 PP 等级上。这种安排使得 MTP 模块和主模型之间能够物理共享嵌入和输出头的参数和梯度。这种物理共享机制进一步提高的内存效率。

FP8训练

受低精度训练的最新进展启发(Dettmers,2022;Noune,2022;Peng,2023b),提出一种细粒度混合精度框架,利用 FP8 数据格式来训练 DeepSeek-V3。虽然低精度训练前景广阔,但它通常受到激活、权重和梯度中存在异常值的限制(Fishman,2024;He;Sun,2024)。尽管在推理量化方面取得了重大进展(Frantar,2022;Xiao,2023),但展示低精度技术在大规模语言模型预训练中成功应用的研究相对较少(Fishman,2024)。为了应对这一挑战并有效扩展 FP8 格式的动态范围,引入一种细粒度量化策略:使用 1 × 𝑁𝑐 元素进行逐块分组或使用 𝑁𝑐 × 𝑁𝑐 元素进行块式分组。在提高精度的累积过程中,相关的反量化开销大大减轻,这是实现精确 FP8 通用矩阵乘法 (GEMM) 的关键方面。此外,为了进一步减少 MoE 训练中的内存和通信开销,在 FP8 中缓存和分派激活,同时在 BF16 中存储低精度优化器状态。在两个类似于 DeepSeek-V2-Lite 和 DeepSeek-V2 的模型规模上验证所提出的 FP8 混合精度框架,训练大约 1 万亿个 token。值得注意的是,与 BF16 基线相比,FP8 训练模型的相对损失误差始终保持在 0.25% 以下,这一水平完全在训练随机性的可接受范围内。

基于低精度训练中广泛采用的技术(Kalamkar,2019;Narang,2017),提出一种用于 FP8 训练的混合精度框架。在此框架中,大多数计算密度操作都在 FP8 中进行,而一些关键操作则策略性地保留在其原始数据格式中,以平衡训练效率和数值稳定性。整体框架如图所示。


基于混合精度 FP8 框架,引入几种提高低精度训练准确率的策略,重点关注量化方法和乘法过程。

细粒度量化 。在低精度训练框架中,溢出和下溢是常见的挑战,因为 FP8 格式的动态范围有限,受其减少的指数位限制。作为标准做法,通过将输入张量的最大绝对值缩放为 FP8 的最大可表示值,将输入分布与 FP8 格式的可表示范围对齐(Narang,2017)。这种方法使低精度训练对激活异常值高度敏感,这会严重降低量化精度。为了解决这个问题,提出一种细粒度量化方法,该方法在更精细的级别应用缩放。如图 (a) 所示,(1) 对于激活,以 1x128 图块为基础对元素进行分组和缩放(即每个token每 128 个通道); (2)对于权重,以 128x128 块为基础对元素进行分组和缩放(即每 128 个输入通道每 128 个输出通道)。这种方法确保量化过程能够根据较小的元素组调整比例,从而更好地适应异常值。


提高累积精度 。低精度 GEMM 操作经常受到下溢问题的影响,其准确性在很大程度上取决于高精度累积,通常以 FP32 精度执行(Kalamkar,2019;Narang,2017)。然而,NVIDIA H800 GPU 上 FP8 GEMM 的累积精度仅限于保留大约 14 位,这明显低于 FP32 累积精度。当内维K较大时(Wortsman,2023),这一问题会变得更加明显,这是大规模模型训练中批量和模型宽度增加的典型场景。

为了解决这个问题,采用提升到CUDA Cores以获得更高精度的策略(Thakkar,2023)。该过程如上图(b)所示。具体而言,在Tensor Cores上执行MMA(矩阵乘法-累积)时,使用有限的位宽对中间结果进行累积。一旦达到 𝑁𝐶 间隔,这些部分结果将被复制到 CUDA Cores 上的 FP32 寄存器中,在那里执行全精度 FP32 累积。如前所述,细粒度量化沿内部维度 K 应用每组缩放因子。这些缩放因子可以在 CUDA Cores 上有效地相乘,作为反量化过程,同时将额外的计算成本降至最低。

尾数超过指数 。与先前工作(NVIDIA,2024b;Peng,2023b;Sun,2019b)不同,其采用一种混合 FP8 格式,即在 Fprop 中使用 E4M3(4 位指数和 3 位尾数),在 Dgrad 和 Wgrad 中使用 E5M2(5 位指数和 2 位尾数),本文在所有张量上采用 E4M3 格式以获得更高的精度。这种方法的可行性归因于细粒度量化策略,即分块和逐块缩放。通过对较小的元素组进行操作,该方法有效地在这些分组元素之间共享指数位,从而减轻了有限动态范围的影响。

在线量化 。张量量化框架 (NVIDIA,2024b;Peng,2023b) 采用了延迟量化,它保留前几次迭代中最大绝对值的历史记录,以推断当前值。为了确保准确的缩放比例并简化框架,在线计算每个 1x128 激活块或 128x128 权重块的最大绝对值。在此基础上,得出缩放因子,然后将激活或权重在线量化为 FP8 格式。

结合 FP8 训练框架,通过将缓存的激活和优化器状态压缩为低精度格式,进一步降低了内存消耗和通信开销如下:

低精度优化器状态 。采用 BF16 数据格式而不是 FP32 来跟踪 AdamW(Loshchilov & Hutter,2017)优化器中的一阶矩和二阶矩,而不会导致明显的性能下降。但是,主权重(由优化器存储)和梯度(用于批量大小累积)仍保留在 FP32 中,以确保整个训练过程中的数值稳定性。

低精度激活 。Wgrad 操作在 FP8 中执行。为了减少内存消耗,以 FP8 格式缓存激活以供线性运算符的后向传递是一种自然选择。但是,对于低成本高精度训练,需要特别考虑几个运算符:(1) 注意操作符之后的 Linear 的输入。这些激活也用于注意操作符的反向传递,这使其对精度敏感。(2) MoE 中 SwiGLU 操作符的输入。为了进一步降低内存成本,缓存 SwiGLU 操作符的输入并在反向传递中重新计算其输出。

低精度通信 。通信带宽是 MoE 模型训练的一个关键瓶颈。为了缓解这一挑战,将 MoE 上投影之前的激活量化为 FP8,然后应用调度组件,这与 MoE 上投影中的 FP8 Fprop 兼容。与注意运算符之后的线性输入一样,此激活的缩放因子是 2 的整数幂。在 MoE 下投影之前的激活梯度也应用了类似的策略。对于前向和后向组合组件,将它们保留在 BF16 中,以保持训练流程关键部分的训练精度。

推理和部署

在 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 跨节点传输 token,然后通过 NVLink 在节点内 GPU 之间转发。特别地,对浅层中的密集 MLP 使用单向张量并行以节省 TP 通信。

为了在 MoE 部分实现不同专家之间的负载平衡,需要确保每个 GPU 处理的 token 数量大致相同。为此,引入了冗余专家的部署策略,即复制高负载专家并进行冗余部署。高负载专家是根据在线部署期间收集的统计数据检测出来的,并定期(例如每 10 分钟)进行调整。确定冗余专家集后,根据观察的负载,仔细地重新安排节点内 GPU 之间的专家,力求在不增加跨节点all-to-all通信开销的情况下尽可能地平衡 GPU 之间的负载。对于 DeepSeek-V3 的部署,为预填充阶段设置 32 个冗余专家。对于每个 GPU,除了它所承载的原有 8 个专家外,它还将承载一个额外的冗余专家。

此外,在预填充阶段,为了提高吞吐量并隐藏all-to-all和 TP 通信的开销,同时处理两个具有相似计算工作量的微批次,将一个微批次的注意和 MoE 与另一个微批次的调度和组合重叠。

最后,其正在探索一种动态专家冗余策略,其中每个 GPU 承载更多专家(例如 16 位专家),但在每个推理步骤中只会激活 9 位专家。在每一层的all-to-all操作开始之前,会动态计算全局最优路由方案。考虑到预填充阶段涉及的大量计算,计算此路由方案的开销几乎可以忽略不计。

在解码过程中,将共享专家视为路由专家。从这个角度来看,每个 token 将在路由过程中选择 9 个专家,其中共享专家被视为始终会被选中的重负载专家。解码阶段的最小部署单元由 40 个节点和 320 个 GPU 组成。注意部分采用带 SP 的 TP4,结合 DP80,而 MoE 部分采用 EP320。对于 MoE 部分,每个 GPU 仅托管一个专家,64 个 GPU 负责托管冗余专家和共享专家。调度和组合部分的all-to-all通信通过 IB 上的直接点对点传输进行,以实现低延迟。此外,利用 IBGDA (NVIDIA, 2022) 技术进一步最小化延迟并提高通信效率。

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

此外,为了提高吞吐量并隐藏all-to-all通信的开销,还在探索在解码阶段同时处理具有相似计算工作量的两个微批次。与预填充不同,注意在解码阶段消耗大部分时间。因此,将一个微批次的注意与另一个微批次的调度+MoE+组合重叠。在解码阶段,每个专家的批次大小相对较小(通常在 256 个 token 以内),瓶颈是内存访问而不是计算。由于 MoE 部分只需要加载一个专家的参数,内存访问开销很小,因此使用较少的 SM 不会显著影响整体性能。因此,为了避免影响注意部分的计算速度,可以只将一小部分 SM 分配给调度+MoE+组合。

硬件设计建议

基于对all-to-all通信和 FP8 训练方案的实施,向 AI 硬件供应商提出以下芯片设计建议。

在 DeepSeek-V3 中,实现计算和通信之间的重叠,隐藏计算过程中的通信延迟。与串行计算和通信相比,这大大降低对通信带宽的依赖。然而,当前的通信实现依赖于昂贵的 SM(例如,为此目的分配 H800 GPU 中可用的 132 个 SM 中的 20 个),这将限制计算吞吐量。此外,使用 SM 进行通信会导致严重的效率低下,因为张量核心仍然完全未得到充分利用。

目前,SM 主要执行以下all-to-all通信任务:

  1. • 在 IB(InfiniBand)和 NVLink 域之间转发数据,同时从单个 GPU 聚合发往同一节点内多个 GPU 的 IB 流量。

  2. • 在 RDMA 缓冲区(已注册的 GPU 内存区域)和输入/输出缓冲区之间传输数据。

  3. • 执行 all-to-all 组合的 Reduce 操作。

  4. • 在分块数据传输到 IB 和 NVLink 域中的多个专家时管理细粒度内存布局。

作者希望看到未来的供应商开发硬件,将这些通信任务从有价值的计算单元 SM 中卸载,充当 GPU 协处理器或网络协处理器,如 NVIDIA SHARP Graham(2016)。此外,为了降低应用程序编程的复杂性,目标是让这种硬件从计算单元的角度统一 IB(横向扩展)和 NVLink(纵向扩展)网络。有了这个统一的接口,计算单元可以通过提交基于简单原语的通信请求,轻松地在整个 IB-NVLink 统一域中完成读取、写入、多播和 Reduce 等操作。

Tensor Cores 中更高的 FP8 GEMM 累积精度 。在 NVIDIA Hopper 架构当前 Tensor Core 实现中,FP8 GEMM(通用矩阵乘法)采用定点累加,在加法之前根据最大指数右移对齐尾数积。实验表明,它仅使用符号填充右移后每个尾数积的最高 14 位,并截断超出此范围的位。但是,例如,要从 32 个 FP8×FP8 乘法的累加中获得精确的 FP32 结果,至少需要 34 位精度。因此,未来的芯片设计增加 Tensor Core 中的累加精度以支持全精度累加,或根据训练和推理算法的精度要求选择合适的累加位宽。这种方法可确保误差保持在可接受的范围内,同时保持计算效率。

支持 Tile 和 Block-Wise 量化 。当前的 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(张量内存加速器)访问集成到单个融合操作中,这样就可以在将激活从全局内存传输到共享内存时完成量化,避免频繁的内存读写。还支持 warp-level 转换指令以加快速度,这进一步促进层规范化和 FP8 转换的更好融合。或者,可以采用近内存计算方法,其中计算逻辑位于 HBM 附近。在这种情况下,BF16 元素可以在从 HBM 读入 GPU 时直接转换为 FP8,从而将片外内存访问减少约 50%。

支持转置 GEMM 操作 。当前架构使得将矩阵转置与 GEMM 操作融合起来变得很麻烦。在工作流程中,前向传递期间的激活被量化为 1x128 FP8 图块并存储。在后向传递期间,需要读出矩阵、反量化、转置、重新量化为 128x1 图块并存储在 HBM 中。为了减少内存操作,未来的芯片在 MMA 操作之前从共享内存中直接转置读取矩阵,以满足训练和推理所需的精度。结合 FP8 格式转换和 TMA 访问的融合,这一增强将显著简化量化工作流程。


数据构建

与 DeepSeek-V2 相比,通过提高数学和编程样本的比例来优化预训练语料库,同时将多语言覆盖范围扩展到英语和中文之外。此外,数据处理流程经过改进,以最大限度地减少冗余,同时保持语料库的多样性。受 Ding et al. (2024) 的启发,实现文档打包方法以确保数据完整性,但在训练期间不加入跨样本注意掩码。最后,DeepSeek-V3 的训练语料由token化器中的 14.8T 高质量和多样化的分词组成。

在 DeepSeekCoder-V2 (DeepSeek-AI, 2024a) 的训练过程中,填充到中间 (FIM) 策略不会损害下一个token的预测能力,同时使模型能够根据上下文线索准确预测中间文本。与 DeepSeekCoder-V2 一致,还在 DeepSeek-V3 的预训练中加入 FIM 策略。具体来说,采用前缀-后缀-中间 (PSM) 框架来构造数据,如下所示:

𝑓pre 𝑓suf 𝑓middle 。

此结构在文档级别应用于预打包过程。FIM 策略以 0.1 的速率应用,与 PSM 框架一致。

DeepSeek-V3 的token化器采用字节级 BPE(Shibata,1999),扩展词汇表为 128K 个tokens。对token化器的预token化器和训练数据进行修改,以优化多语言压缩效率。此外,与 DeepSeek-V2 相比,新的预token化器引入结合标点符号和换行符的tokens。但是,当模型处理没有终端换行符的多行提示时,这种技巧可能会引入token边界偏差(Lundberg,2023),尤其是对于少数样本评估提示。为了解决这个问题,在训练期间随机分割一定比例的此类组合tokens,这会让模型接触到更广泛的特殊情况并减轻这种偏差。

超参

模型超参 。将 Transformer 层数设置为 61,隐藏维度设置为 7168。所有可学习参数都以 0.006 的标准差随机初始化。在MLA中,我们将注意头的数量 𝑛/h 设置为128,每个头的维度 𝑑/h 设置为128。KV压缩维度 𝑑/𝑐 设置为512,查询压缩维度 𝑑/𝑐′ 设置为1536。对于解耦的Q和K,将每个头的维度 𝑑^𝑅/h 设置为64。用MoE层替换除前三层之外的所有FFN。每个MoE层由1个共享专家和256个路由专家组成,其中每个专家的中间隐藏维度为2048。在路由专家中,每个token将激活8个专家,并确保每个token最多发送到4个节点。多token预测深度 𝐷 设置为1,即除了精确的下一个token之外,每个token还会预测一个额外的token。与 DeepSeek-V2 一样,DeepSeek-V3 也在压缩的潜向量之后使用额外的 RMNSorm 层,并在宽度瓶颈处乘以额外的缩放因子。在这种配置下,DeepSeek-V3 总共包含 671B 个参数,其中每个 token 激活 37B 个。

训练超参







请到「今天看啥」查看全文