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

打印 上一主题 下一主题

主题 855|帖子 855|积分 2565

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微调,具体练习成本并未公开:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表