【完整版】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微调,具体训练成本并未公开:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何使用 Python 和 SQLAlchemy 结合外键映射来获取其他表中的数据

在使用 Python 和 SQLAlchemy 时,结合外键映射可以让你在查询时轻松地获取其他表中的数据。SQLAlchemy 提供了丰富的 ORM(对象关系映射)功能,可以让你通过定义外键关系来查询并获取关联的数据。下面我会演示如何设置外键关系&…

Python爬虫:1药城店铺爬虫(完整代码)

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…

游戏引擎学习第91天

黑板:澄清线性独立性 首先,提到线性独立时,之前讲解过的“最小”的概念实际上是在表达线性独立。对于二维坐标系来说,两个基向量是最小的,这两个向量是线性独立的。如果超过两个基向量,就会变得冗余&#…

学习率调整策略 | PyTorch 深度学习实战

前一篇文章,深度学习里面的而优化函数 Adam,SGD,动量法,AdaGrad 等 | PyTorch 深度学习实战 本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started 本篇文章内容来自于 强化学习必修课:引…

在 Flownex 中创建自定义工作液

在这篇博文中,我们将了解如何在 Flownex 中为流网添加和定义一种新的流体温度相关工作材料。 Flownex 物料管理界面 在 Flownex 中使用与温度相关的流体材料时,了解其特性与温度的关系非常重要。这种了解可确保准确预测各种热条件下的流体行为&#xff0…

记一次golang环境的变化

前两天编译打包了了个文件,把env的 goos 搞坏了 导致运行项目一直报错 先是这样 go: unsupported GOOS/GOARCH pair windows/amd64再是这样 /amd64supported GOOS/GOARCH pair linux咱就说,咱也是知道环境配置的有问题 ( go env GOOS &…

算法【Java】—— 动态规划之子序列问题

最长递增子序列 https://leetcode.cn/problems/longest-increasing-subsequence 状态表示:和之前的经验一样,dp[i] 表示 以 i 为结尾元素的所有递增子序列中最大长度是多少 状态转移方程推导:从 i 前面的元素开始寻找,当 nums[j…

ASP.NET Core标识框架Identity

目录 Authentication与Authorization 标识框架(Identity) Identity框架的使用 初始化 自定义属性 案例一:添加用户、角色 案例二:检查登录用户信息 案例三:实现密码的重置 步骤 Authentication与Authorizatio…

124,【8】buuctf web [极客大挑战 2019] Http

进入靶场 查看源码 点击 与url有关,抓包 over

windows下安装Open Web UI

windows下安装openwebui有三种方式,docker,pythonnode.js,整合包. 这里我选择的是第二种,非docker. 非Docker方式安装 1. 安装Python: 下载并安装Python 3.11,建议安装路径中不要包含中文字符,并勾选“Add python 3.11 to Path”选项。 安…

Mac 基于Ollama 本地部署DeepSeek离线模型

最近节日期间最火的除了《哪吒》就是deepseek了,毕竟又让西方各个层面都瑟瑟发抖的产品。DeepSeek凭借其强大的AI能力真的是在全球多个领域展现出强大的影响力。由于受到外部势力的恶意攻击倒是deepseek官方服务不稳定,国内其他厂家的适配版本也不是很稳…

解决aspose将Excel转成PDF中文变成方框的乱码问题

原文网址:解决aspose将Excel转成PDF中文变成方框的乱码问题_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何解决aspose将Excel转成PDF中文变成方框的乱码问题。 问题描述 用aspose将word、excel等转成PDF后,英文展示正常,但中文全部变成了…

Jupyter Notebook自动保存失败等问题的解决

一、未生成配置文件 需要在命令行中,执行下面的命令自动生成配置文件 jupyter notebook --generate-config 执行后会在 C:\Users\用户名\.jupyter目录中生成文件 jupyter_notebook_config.py 二、在网页端打开Jupyter Notebook后文件保存失败;运行代码…

【漫话机器学习系列】083.安斯库姆四重奏(Anscombe‘s Quartet)

安斯库姆四重奏(Anscombes Quartet) 1. 什么是安斯库姆四重奏? 安斯库姆四重奏(Anscombes Quartet)是一组由统计学家弗朗西斯安斯库姆(Francis Anscombe) 在 1973 年 提出的 四组数据集。它们…

Axure设计教程:动态排名图(中继器实现)

一、开篇 在Axure原型设计中,动态图表是展示数据和交互效果的重要元素。今天,我们将学习如何使用中继器来创建一个动态的排名图,该图表不仅支持自动轮播,还可以手动切换,极大地增强了用户交互体验。此教程旨在提供一个…

MySQL视图索引操作

创建学生表; mysql> create table Student(-> Sno int primary key auto_increment,-> Sname varchar(30) not null unique,-> Ssex char(2) check (Ssex男 or Ssex女) not null,-> Sage int not null,-> Sdept varchar(10) default 计算机 not …

【正点原子K210连载】第六十七章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第六十七章 音频FFT实验 本章将介绍CanMV下FFT的应用,通过将时域采集到的音频数据通过FFT为频域。通过本章的学习,读者将学习到CanMV下控制FFT加速器进行FFT的使用。 本章分为如下几个小节: 32.1 maix.FFT模块介绍 32.2 硬件设计 32.3 程序设…

基于 Ollama+Docker+OpenWebUI 的本地化部署deepseek流程

搭建deepseek 安装Ollama Ollama官方下载地址 下载完成后双击打开Ollama进行安装,点击install 安装完成后系统会弹出下图提示代表安装成功并且已启动 验证安装 ollama -v安装完成后,cmd 打开命令行窗口,输入 “ollama -v” 测试,显示 olla…

Mac 部署Ollama + OpenWebUI完全指南

文章目录 💻 环境说明🛠️ Ollama安装配置1. 安装[Ollama](https://github.com/ollama/ollama)2. 启动Ollama3. 模型存储位置4. 配置 Ollama 🌐 OpenWebUI部署1. 安装Docker2. 部署[OpenWebUI](https://www.openwebui.com/)(可视化…

C#常用集合优缺点对比

先上结论&#xff1a; 在C#中&#xff0c;链表、一维数组、字典、List<T>和ArrayList是常见的数据集合类型&#xff0c;它们各有优缺点&#xff0c;适用于不同的场景。以下是它们的比较&#xff1a; 1. 一维数组 (T[]) 优点&#xff1a; 性能高&#xff1a;数组在内存中…