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

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

文章目录

  • 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.kler.cn/a/534183.html

相关文章:

  • 正则表达式详细介绍
  • Hackmyvm Blackhat
  • (脚本学习)BUU18 [CISCN2019 华北赛区 Day2 Web1]Hack World1
  • UE求职Demo开发日志#21 背包-仓库-装备栏移动物品
  • [吾爱出品]CursorWorkshop V6.33 专业鼠标光标制作工具-简体中文汉化绿色版
  • DeepSeek 阐述 2025年前端发展趋势
  • Mybatis之常用动态Sql语句
  • 云原生周刊:K8s引领潮流
  • Android 中APK 体积优化的几种方法
  • 【科研】 -- 医学图像处理方向,常用期刊链接
  • Python:温度转化
  • pandas习题 070:将数据库中大数据分块读取计算
  • 2.4学习
  • TCP三次握手、四次挥手过程及原理
  • swift 专题三 swift 规范一
  • 5.6 Mybatis代码生成器Mybatis Generator (MBG)实战详解
  • 在 Debian/Ubuntu 系统上,永久固定网口的IP地址
  • 基于 SpringBoot3 的 SpringSecurity6 + OAuth2 自定义框架模板
  • DeepSeek R1技术报告关键解析(8/10):DeepSeek-R1 的“aha 时刻”,AI 自主学习的新突破
  • Linux zcat 命令使用详解
  • labview通过时间计数器来设定采集频率
  • vue2-v-if和v-for的优先级
  • Ubuntu添加硬盘踩坑日志:SMB无权限的问题
  • 【前端构建】Rollup: 下一代 JavaScript 模块打包器
  • 【Elasticsearch】文本分类聚合Categorize Text Aggregation
  • 路由器及工作原理与常用路由配置命令详解