【完整版】DeepSeek-R1大模型学习笔记(架构、训练、Infra)

news2025/4/21 19:54:15

文章目录

  • 0 DeepSeek系列总览
  • 1 模型架构设计
    • 基本参数
    • 专家混合模型(MoE)[DeepSeek-V2提出, DeepSeek-V3改良]
    • 多头潜在注意力(MLA)[DeepSeek-V2提出]
    • 多token预测(MTP)[DeepSeek-V3提出]
  • 2 DeepSeek-R1-Zero及DeepSeek-R1的训练策略
    • DeepSeek-R1-Zero with RL only
    • DeepSeek-R1 with Both RL and SFT
    • FP8混合精度量化 [DeepSeek-V3提出]
    • 知识蒸馏 [DeepSeek-R1提出]
    • DeepSeek-R1的一些失败尝试
      • 过程奖励模型(PRM)
      • 蒙特卡洛搜索树(MCTS)
  • 3 Infrastructures [DeepSeek-V3提出]
    • 计算集群
    • 训练框架
      • DualPipe和计算-通信overlap
      • 跨节点all-to-all通信
      • 节省显存
    • 推理和部署
      • Prefill阶段(compute bound)
      • Decoding阶段(memory bound)
  • 训练成本

0 DeepSeek系列总览

DeepSeek-R1基于DeepSeek-V3-Base模型,提出了一系列训练策略,包括基于纯强化学习的训练(DeepSeek-R1-Zero)、基于多阶段的训练和冷启动(DeepSeek-R1)、知识蒸馏等。下面是我总结的DeepSeek系列的整体框架:

在这里插入图片描述

1 模型架构设计

基本参数

  • DeepSeek-R1和DeepSeek-V3采用同样的模型参数,并且设计和DeepSeek-V2类似
  • Attention采用多头潜在注意力机制(MLA)
  • FFN采用无辅助损失的DeepSeekMoE
  • 61层Transformer Layer
  • MoE中1个共享专家,256个路由专家,对每个token选择top-8专家

在这里插入图片描述

专家混合模型(MoE)[DeepSeek-V2提出, DeepSeek-V3改良]

MoE在每次推理时选择性地激活部分模型参数,在不成比例增加计算成本的情况下,可以扩展模型参数。在DeepSeek-V2中就已经提出了用于FFN层的DeepSeekMoE。

  • 动态专家分配:根据token的上下文动态分配合适的专家
  • DeepSeek-V2引入辅助损失进行负载均衡,确保token在专家之间的分配更加均衡。DeepSeek-V3和DeepSeek-R1进一步采用用auxiliary-loss-free load balancing实现负载均衡,引入一个expert bias,这个bias只影响专家路由,而不影响任何梯度。动态调整bias,专家overloaded则降低bias,专家unoverloaded则增大bias。简单来说就是用加法高效地对gating score进行re-weight的过程
  • DeepSeek-R1和DeepSeek-V3一致,总参数量671B,通过MoE对单个token的激活参数量仅37B (~5.5%)。MoE中有1个shared expert+256个routed expert,每次只激活的8个exert。

在这里插入图片描述
Auxiliary-Loss-Free Load Balancing [DeepSeek-V3提出]
和DeepSeek-V3一样,DeepSeek-R1采用了细粒度的MoE,一些expert作为共享expert,另一些expert作为routed expert进行动态激活。对于第t个token u t u_t ut,下面是MoE计算的过程:

在这里插入图片描述
以前基于auxiliary loss的方法需要修改loss function,当auxiliary loss很大时会影响模型性能。那么Auxiliary-Loss-Free则是在gating value g g g的基础上,额外加上了bias来实现负载均衡:

在这里插入图片描述
注意bias只影响专家路由,而不影响任何梯度。专家overloaded则降低bias,专家unoverloaded则增大bias。调整的速度由超参数 γ \gamma γ控制,这个和反向传播的梯度更新过程类似。

下图是该方法的出处:Auxiliary-Loss-Free Load Balancing Strategy for Mixture-of-Experts文章所提出的负载均衡策略:
在这里插入图片描述
和DeepSeek-V2一样,DeepSeek-V3和DeepSeek-R1都采用了限制设备数量的MoE,并且不会再训练时做token dropping了。

多头潜在注意力(MLA)[DeepSeek-V2提出]

MLA通过将QKV矩阵投影到低维潜在空间,显著降低计算和内存成本。DeepSeek-V2中就提出了用MLA来替代传统的多头自注意力。

MLA和其他注意力的对比如下,KV cache以一个更低的维度去存储和计算。
在这里插入图片描述
K和V的联合压缩如下:
在这里插入图片描述

真正推理时,cache的就是低维的 c t K V c_t^{KV} ctKV,并且down-proj和up-proj矩阵可以分别被吸收进 W Q W^Q WQ W O W^O WO中,不会造成额外的计算开销。这个方法和Palu: Compressing KV-Cache with Low-Rank Projection那篇文章一致。具体的融合过程如下(以 W Q W^Q WQ的融合为例):

在这里插入图片描述

为了在训练时降低激活的memory,也对query做低秩压缩:
在这里插入图片描述
【对query低秩分解怎么省memory,算的时候不需要重构回去?】【回答:只需要保存低秩的query,然后在反向传播时重计算一步,节省了需要存储的memory】

RoPE位置编码兼容性考虑
但是KV cache的低秩压缩和RoPE位置编码并不兼容!如果对 k t C k_t^C ktC做RoPE, W U K W^{UK} WUK会和位置敏感的RoPE矩阵耦合在一起,从而不能在推理时被吸收进 W Q W^Q WQ中(这里应该强调一下吸收是totally offline完成的),带来额外的计算。
进一步理解 W U K W^{UK} WUK和RoPE矩阵的耦合:与生成当前token相关的RoPE矩阵位于 W Q W^{Q} WQ W U K W^{UK} WUK之间,而矩阵乘法不满足交换律。
于是DeepSeek-V2提出了解耦RoPE策略,用额外的多头query和一个共享key来计算RoPE,然后和原本的query和key拼接起来。至于这里怎么得到的额外query和key,就是用来两个额外的线性层来算得的。

在这里插入图片描述

下图体现了MLA的整个过程,值得注意的一点是,MLA的低秩分解是基于训练的,而非用SVD之类的方式post-training分解直接推理(比如Pula文章)。

在这里插入图片描述

所以,在MLA中不存储KV cache了,而是存储压缩后的低维度激活 c t K V c_t^{KV} ctKV k t R k_{t}^R ktR两部分存储开销大大降低。

多token预测(MTP)[DeepSeek-V3提出]

MTP使DeepSeek-R1并行预测多个token,从而显著提高推理速度。MTP已经在DeepSeek-V3中已经被用于训练的目标。

  • 并行解码:通过允许在相同的上下文窗口内进行多个token生成预测,扩展了自回归框架
  • 动态预测视距:根据模型置信度调整每步预测的token数量
  • 强化学习引导的token选择:确保多token预测中的一致性,并减少错误传播
  • 训练时MTP包含了多个MTP模块,主要用于提升模型的推理性能,在推理时,可以直接将多个MTP模块丢弃,只保留主模型,然后推理。也可以重新利用这些MTP模块,借助speculative decoding来加速推理过程。

在这里插入图片描述

2 DeepSeek-R1-Zero及DeepSeek-R1的训练策略

DeepSeek-R1-Zero with RL only

在这里插入图片描述

DeepSeek-R1-Zero直接在DeepSeek-V3-Base模型的基础上用纯的Group Relative Policy Optimization (GRPO)强化学习算法,而不引入Supervised Fine-tuning (SFT)训练。

强化学习算法:近端策略优化(PPO)和GRPO
GRPO相比于PPO更好,主要原因如下:1)丢弃了单独的value模型;2)GRPO计算reward时,改成了一个q生成多个r,然后reward打分
在这里插入图片描述

DeepSeek-R1-Zero采用基于规则的奖励机制,包含两部分奖励:**1)accuracy奖励;2)格式奖励。**遵循的训练模板如下图所示,思考过程和回答过程需要放在对应的tag中,引导模型学会标准化的思考过程格式,也提高了输出的结构化程度和可解释性。
在这里插入图片描述

DeepSeek-R1-Zero的缺点
DeepSeek-R1-Zero面临着可读性差和语言混合(比如中英文混杂)等挑战。于是DeepSeek-R1进一步解决了这两个问题。

DeepSeek-R1 with Both RL and SFT

在这里插入图片描述

在DeepSeek-R1-Zero的基础上,DeepSeek-R1加入了冷启动,并且用高质量数据做SFT+RL训练,得到了当今的“最强大模型”。下面是关键技术和训练流程:

步骤1:冷启动SFT
在高质量的长思维链(CoT)数据上做SFT,改善DeepSeek-R1-Zero可读性较差的问题。数据的采集方式如下:以带长CoT的few-shot prompting为例,直接提示模型生成带思考和验证的详细的答案;以可读的格式收集DeepSeek-R1-Zero的输出,并通过人工细化和调整结果。

步骤2:面向推理的RL
冷启动训练后,用和DeepSeek-R1-Zero一样的RL训练策略继续训练,来提高模型的推理能力。训练过程中发现CoT经常表现出语言混合,特别是当RL提示涉及多种语言时,所以提出采用语言一致性奖励改善语言混杂的问题,进一步增强模型的可读性。

步骤3:拒绝采样和SFT
RL训练收敛后,在这一步中融合推理数据和非推理数据进一步微调模型增强模型的通用能力。

  • 对于推理数据,用上述RL训练的模型checkpoint中通过拒绝采样生成600k条推理数据。具体做法是借助生成式奖励模型,将ground-truth和模型预测结果输入DeepSeek-V3进行评估。此外,由于模型输出有时是混乱的,难以阅读,所以过滤了混合语言、长段落和代码块的CoT

    拒绝采样微调(RFT):在一个微调过的模型上进行多个样本的采样,我们有一个拒绝或者接受函数来对模型采样生成的样本进行过滤筛筛选出符合我们目标分布的样本(比如预测正确的样本),再进行进一步的模型微调。

  • 对于非推理数据(比如写作、事实质量保证、自我认知和翻译),采用DeepSeek-V3 pipeline,复用DeepSeek-V3的部分SFT数据集。对于某些非推理任务,调用DeepSeek-V3,在通过prompting在回答问题之前生成一个潜在的CoT。对于很简单的query比如"Hello",则不需要CoT了。这部分数据大约200k

然后融合上述数据,然后进行SFT,以适应非推理场景(通用能力)。总共大约800k条数据,训练DeepSeek-V3-Base 2个epoch。

步骤4:全场景RL
进一步使模型与人类的偏好保持一致,进一步用了二阶段RL阶段提高模型的帮助性和无害性,同时改进其功能推理能力。对于推理任务,继续用基于规则的奖励;对于通用任务,采用偏好奖励模型。

FP8混合精度量化 [DeepSeek-V3提出]

利用FP8量化,减少内存使用和计算成本,同时保持数值稳定性。采用混合精度训练,根据计算需求调整不同层的位宽精度。

  • 对于主要的计算GEMM,采用FP8,累加精度BF16或FP32(Fprop、Wgrad、Dgrad),相比于BF16加速了2x
  • 对于一些算子需要更高的精度(BF16或FP32),比如embedding层、输出head、MoE gating层、normalization层、attention算子,以保证稳定的训练动态性
  • 为了进一步保证数值稳定性,将主权重、权重梯度和优化器状态也保存为高精度

在这里插入图片描述
为了进一步提高模型的性能,做了如下优化:

  • 细粒度量化以更好地容纳outliers:对于activation,采用1x128 tile(128个channel分为1个tile);对于weight,采用128x128 block(128个input channel和128个output channel分为1个block)。对不同的tile/block维护不同的scale值
  • 数据格式:在所有tensor上都采用更大的尾数E4M3,而不是E5M2,以获得更高的精度
  • 在线量化:在线计算tile/block的最大绝对值

知识蒸馏 [DeepSeek-R1提出]

用DeepSeek-R1直接蒸馏Qwen2.5-Math-1.5B, Qwen2.5-Math-7B, Qwen2.5-14B, Qwen2.5-32B, Llama-3.1-8B和Llama-3.3-70B-Instruct,都有显著的性能提升。蒸馏时只在800k个样本上用了SFT,而并没有用RL。直接说一下文章的结论:

  • 将更强大的模型蒸馏成更小的模型会产生良好的结果,而依赖于大规模RL的小模型则需要巨大的算力,甚至可能无法达到蒸馏的性能
  • 虽然蒸馏既经济又有效,但超越智能的边界可能仍然需要更强大的基座模型和更大规模的RL

下面是在Qwen上蒸馏和RL的对比:

在这里插入图片描述

DeepSeek-R1的一些失败尝试

过程奖励模型(PRM)

PRM没有取得很好的效果,主要是下面三点原因:

  • 很难在一般推理中明确地定义一组细粒度的步骤
  • 确定“当前的中间步骤是否正确”是一项具有挑战性的任务。使用模型进行自动标注可能不会产生令人满意的结果,而手动标注则不利于模型的scale up
  • 一旦基于模型的PRM被引入,它就不可避免地会导致reward hacking,并且奖励模型的再训练需要额外的训练资源,使整个训练过程变得更复杂

蒙特卡洛搜索树(MCTS)

MCTS用于增强test-time计算扩展性,但是在训练scale up是遇到问题:

  • 与国际象棋不同,它的搜索空间定义相对明确,而token生成表现出指数级更大的搜索空间。于是DeepSeek-R1为每个节点设置了一个最大扩展限制,但这可能会导致模型陷入局部最优状态
  • 价值模型直接影响生成的质量,因为它指导了搜索过程的每一步。训练一个细粒度的价值模型本质上是困难的,这使得在模型得到迭代改进上更有挑战性

总的来说,当与预训练好的价值模型匹配时,MCTS可以提高推理时的性能,但是通过自搜索迭代提高模型性能仍然是一个重大挑战。

3 Infrastructures [DeepSeek-V3提出]

计算集群

  • 2048 NVIDIA H800 GPUs
  • H800集群中的每个节点都包含8个由节点内NVLink和NVSwitch连接的GPU
  • 跨不同的节点,用InfiniBand (IB)互连来促进通信

训练框架

  • 采用HAI-LLM
  • 16-way Pipeline Parallelism (PP)
  • 跨8个节点的64-way Expert Parallelism (EP)
  • ZeRO-1 Data Parallelism (DP)

DualPipe和计算-通信overlap

背景问题:跨节点专家并行性带来的通信开销会造成低效的计算通信比(约为1:1),于是提出了DualPipe,通过有效地overlap前反向传播的计算和通信阶段来加速模型训练,同时减少了bubble。
核心思想:在一对单独的前向块和反向块中overlap计算和通信
方法:将每个块分成四个部分—— attention, all-to-all dispatch, MLP, and all-to-all combine
MoE专家并行示意图如下:

在这里插入图片描述)

前向传播如下:
在这里插入图片描述
反向传播如下:
在这里插入图片描述
这个图的意义:可以观察到 前向和反向传播是交替进行的,计算和通信也是交替进行的。 因此,当数据1在做计算的时候,数据2可以并行做通信,这样通信部分的时间就被完全隐藏起来了。

DualPipe流水线设计如下,核心就是尽可能用到上述的前反向传播的计算通信并行,减少了流水线中的bubble。

在这里插入图片描述

跨节点all-to-all通信

写了高效的跨节点all-to-all通信核,包括dispatching和combining两部分。这一部分偏比较工程的实现。

节省显存

  • 不保存所有的中间激活值,而是在反向传播时重计算RMSNorm和MLA up-projection层(也就是只存储低维度的值 )
  • 将指数平均(EMA)参数存储在CPU内存中,并在每个训练步骤后进行异步更新
  • 用于MTP的共享embedding和输出head,将它们放到同一个pp的GPU上,减少通信和显存占用

推理和部署

Prefill阶段(compute bound)

  • 总共32个GPU 4节点
  • Attention:TP4、SP、DP8
  • MoE:EP32(总共256个专家/专家并行数32=8个专家/GPU,所以每张GPU上8+1个专家,这个额外的专家是高负载冗余专家,每隔十分钟重新设置)
  • MoE是特殊的MLP,在prefill时可以并行计算

Decoding阶段(memory bound)

  • 总共320个GPU 40个节点
  • Attention:TP4、DP80、SP
  • MoE:EP320(每个GPU分到1个专家)
  • 采用上面提到的DualPipe,两个micro-batch同时进行,一个进行计算,另一个进行通信,从而实现对all-to-all通信时间的覆盖

训练成本

DeepSeek-V3公开的预训练成本:
在这里插入图片描述

DeepSeek-R1在DeepSeek-V3-Base基础上进行RL+SFT微调,具体训练成本并未公开:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2294583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构(1)——算法时间复杂度与空间复杂度

目录 前言 一、算法 1.1算法是什么? 1.2算法的特性 1.有穷性 2.确定性 3.可行性 4.输入 5.输出 二、算法效率 2.1衡量算法效率 1、事后统计方法 2、事前分析估计方法 2.2算法的复杂度 2.3时间复杂度 2.3.1定义 2.3.2大O渐进表示法 2.3.3常见时间复…

uniapp小程序自定义中间凸起样式底部tabbar

我自己写的自定义的tabbar效果图 废话少说咱们直接上代码,一步一步来 第一步: 找到根目录下的 pages.json 文件,在 tabBar 中把 custom 设置为 true,默认值是 false。list 中设置自定义的相关信息, pagePath&#x…

C++编程语言:抽象机制:模板(Bjarne Stroustrup)

目录 23.1 引言和概观(Introduction and Overview) 23.2 一个简单的字符串模板(A Simple String Template) 23.2.1 模板的定义(Defining a Template) 23.2.2 模板实例化(Template Instantiation) 23.3 类型检查(Type Checking) 23.3.1 类型等价(Type Equivalence) …

DeepSeek-VL2论文解读:用于高级多模态理解的专家混合视觉语言模型

github:https://github.com/deepseek-ai/DeepSeek-VL2 paper: https://github.com/deepseek-ai/DeepSeek-VL2/blob/main/DeepSeek_VL2_paper.pdf 大型视觉语言模型(VLMs)已经成为人工智能领域的变革性力量,将大型语言模型(LLMs&…

第二个Qt开发实例:在Qt中利用GPIO子系统和sysfs伪文件系统实现按钮(Push Button)点击控制GPIO口(效果为LED2灯的灭和亮)

引言 本文承接博文 https://blog.csdn.net/wenhao_ir/article/details/145420998 里的代码,在那里面代码的基础上添加上利用sysfs伪文件系统实现按钮(Push Button)点击控制GPIO口的代码,进而实现LED2灯的灭和亮。 最终的效果是点击下面的LED按钮实现LED…

Day37-【13003】短文,串的基本概念,匹配算法,算法时间复杂度,真题训练

文章目录 第二节 串串的基本概念串的模式匹配朴素的模式匹配算法(BF算法)算法最坏时间复杂度O(n x m) 改进的模式匹配算法(KMP算法)特征向量next,来确定k值特征向量next的算法实现 算法最坏时间复杂度O(n)进一步改进next值的计算,简化步骤 第四章真题真题…

陷入闭包:理解 React 状态管理中的怪癖

TLDR 闭包就像函数随身携带的背包,包含它们创建时的数据React 组件使用闭包来记住它们的状态和属性过时的闭包可能导致状态更新不如预期时的错误函数式更新提供了一个可靠的方式来处理最新状态 简介 你是否曾经疑惑过,为什么有时你的 React 状态更新不…

【SRC排名】安全应急响应中心SRC上榜记录

2023年 新氧第三 https://security.soyoung.com/top 合合第四 https://security.intsig.com/index.php?m&chall&aindex 2024年 好未来第一 https://src.100tal.com/index.php?m&chall&aindex(官网是总榜,年榜只有海报)…

Linux——基础命令1

$:普通用户 #:超级用户 cd 切换目录 cd 目录 (进入目录) cd ../ (返回上一级目录) cd ~ (切换到当前用户的家目录) cd - (返回上次目录) pwd 输出当前目录…

OSPF基础(1):工作过程、状态机、更新

OSPF基础 1、技术背景(与RIP密不可分,因为RIP中存在的问题) RIP中存在最大跳数为15的限制,不能适应大规模组网周期性发送全部路由信息,占用大量的带宽资源以路由收敛速度慢以跳数作为度量值存在路由环路可能性每隔30秒…

【目标检测】模型验证:K-Fold 交叉验证

K-Fold 交叉验证 1、引言1.1 K 折交叉验证概述 2、配置2.1 数据集2.2 安装包 3、 实战3.1 生成物体检测数据集的特征向量3.2 K 折数据集拆分3.3 保存记录3.4 使用 K 折数据分割训练YOLO 4、总结 1、引言 我们将利用YOLO 检测格式和关键的Python 库(如 sklearn、pan…

Unity 2D实战小游戏开发跳跳鸟 - 计分逻辑开发

上文对障碍物的碰撞逻辑进行了开发,接下来就是进行跳跳鸟成功穿越过障碍物进行计分的逻辑开发,同时将对应的分数以UI的形式显示告诉玩家。 计分逻辑 在跳跳鸟通过障碍物的一瞬间就进行一次计分,计分后会同步更新分数的UI显示来告知玩家当前获得的分数。 首先我们创建一个用…

京准:NTP卫星时钟服务器对于DeepSeek安全的重要性

京准:NTP卫星时钟服务器对于DeepSeek安全的重要性 京准:NTP卫星时钟服务器对于DeepSeek安全的重要性 在网络安全领域,分布式拒绝服务(DDoS)攻击一直是企业和网络服务商面临的重大威胁之一。随着攻击技术的不断演化…

Android学习20 -- 手搓App2(Gradle)

1 前言 昨天写了一个完全手搓的:Android学习19 -- 手搓App-CSDN博客 后面谷歌说不要用aapt,d8这些来搞。其实不想弄Gradle的,不过想着既然开始了,就多看一些。之前写过一篇Gradle,不过是最简单的编译,不涉…

车型检测7种YOLOV8

车型检测7种YOLOV8,采用YOLOV8NANO训练,得到PT模型,转换成ONNX,然后OPENCV的DNN调用,支持C,python,android开发 车型检测7种YOLOV8

IDEA 中集成 Maven,配置环境、创建以及导入项目

目录 在 IntelliJ IDEA 中集成 Maven 并配置环境 1. 打开 IDEA 设置 2. 定位 Maven 配置选项 3. 配置 Maven 路径 4. 应用配置 创建 Maven 项目 1. 新建项目 2. 选择项目类型 3. 配置项目信息 4. 确认 Maven 设置 5. 完成项目创建 导入 Maven 项目 1. 打开导入窗口…

react关于手搓antd pro面包屑的经验(写的不好请见谅)

我们先上代码,代码里面都有注释,我是单独写了一个组件,方便使用,在其他页面引入就行了 还使用了官方的Breadcrumb组件 import React, { useEffect, useState } from react; import { Breadcrumb, Button } from antd; import { …

[含文档+PPT+源码等]精品大数据项目-Django基于大数据实现的心血管疾病分析系统

大数据项目-Django基于大数据实现的心血管疾病分析系统背景可以从以下几个方面进行阐述: 一、项目背景与意义 1. 心血管疾病现状 心血管疾病是当前全球面临的主要健康挑战之一,其高发病率、高致残率和高死亡率严重威胁着人类的生命健康。根据权威机构…

【Rust自学】19.5. 高级类型

喜欢的话别忘了点赞、收藏加关注哦(加关注即可阅读全文),对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 19.5.1.使用newtype模式实现类型安全和抽象 在 19.2. 高级trait 中(具体来说是…

113,【5】 功防世界 web unseping

进入靶场 代码审计 <?php // 高亮显示当前 PHP 文件的源代码&#xff0c;方便开发者查看代码结构和内容 highlight_file(__FILE__);// 定义一个名为 ease 的类 class ease {// 私有属性 $method&#xff0c;用于存储要调用的方法名private $method;// 私有属性 $args&…