
【LLM技术总结】DeepSeek训练篇
系列综述:💞目的:本系列是个人整理为了学习的,整理期间苛求每个知识点,平衡理解简易度与深入程度。🥰来源:材料主要源于进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。🤭结语:如果有帮到你的地方,就和!!🌈!!!
·
系列综述:
💞目的:本系列是个人整理为了学习DeepSeek相关知识
的,整理期间苛求每个知识点,平衡理解简易度与深入程度。
🥰来源:材料主要源于DeepSeek官方技术报告
进行的,每个知识点的修正和深入主要参考各平台大佬的文章,其中也可能含有少量的个人实验自证。
🤭结语:如果有帮到你的地方,就点个赞和关注一下呗,谢谢🎈🎄🌷!!!
🌈未完待续,请先收藏!!!
文章目录
- MTP,MLA与MOE的技术实现细节
- MOE模型的训练算力与显存需求的定量计算方法
- FP8混合精度训练每个阶段的的显存与算力消耗计算
- 存储IO操作,通信与GPU计算发生的阶段与交互细节
- 预训练的数据处理和数据,数据集的处理,从数据集开始的推理训练流程
- 增强的强化学习的导入方式和加载流程
- 预训练和后训练的微调的相关方法和实现
基础设施
计算集群架构
- DeepSeek-V3 的训练环境
- 整体配置:配备
2048
个NVIDIA H800 GPU
的大规模计算集群 - 节点配置:
每个计算节点
包含8 个 GPU
节点内通信
:通过NVLink 和 NVSwitch
实现高速互连
节点间通信
:采用InfiniBand (IB) 技术
进行高效通信
- 整体配置:配备
- 节点内通信机制
- NVLink
- 定义:由 NVIDIA 开发的用于
GPU和其他计算设备
进行高速互连
的技术,提供了比传统 PCIe 更高的带宽和更低的延迟 - 优势
- 更高带宽:NVLink 提供约
7倍
的PCIe带宽。例如,PCIe 4.0 的 16 车道连接的最大吞吐量约为 32 GB/s,而 NVLink 可以实现超过 200 GB/s 的带宽,具体取决于其代际。 - 更低延迟:NVLink 通过提供直接连接来减少延迟,
消除了 PCIe 中涉及的多个中间步骤
,从而实现更快的通信 - 统一内存池:能够跨 GPU 创建统一内存池,允许多个 GPU 无缝共享内存,有效扩展了大型模型或数据集的可用内存空间。
- 增强的可扩展性:可高效扩展多个 GPU,支持网格和环形拓扑,能够在不显著降低性能的情况下连接更多设备。
- 更高带宽:NVLink 提供约
- 定义:由 NVIDIA 开发的用于
- NVSwitch
- 定义:用于
在多节点环境中扩展 NVLink 连接
的高性能交换机
,集成了多个 NVLink 连接,实现了 GPU 之间的无缝全互联。 - 优点
- 高带宽交换:NVSwitch 集成了多个 NVLink 连接,支持高达 57.6 TB/s 的总带宽,能够连接多达 256 个 GPU。
- 低延迟路由:NVSwitch 的路由延迟与 GPU 的 NVLink 控制器的路由延迟相同,确保了低延迟的数据传输。
- 支持大规模 GPU 集群:NVSwitch 通过支持大规模 GPU 集群,提高了 NVLink 的可扩展性,使其能够处理更复杂的数据密集型工作负载
- 定义:用于
- NVLink
- 节点间通信 InfiniBand
- 定义:是一种高速网络互连技术,目前是GPU节点间通信的主流高性能解决方案
- 优点
- 高带宽:InfiniBand 提供高达 400 Gb/s 的带宽,满足数据密集型应用的需求。
- 低延迟:InfiniBand 的延迟极低,通常小于 2 微秒,非常适合实时应用和高性能计算 (HPC)。
- 可靠性:InfiniBand 采用冗余设计,确保即使出现组件故障,网络也能继续运行。它具有纠错机制,可最大程度地减少数据丢失和损坏。
- 可扩展性:InfiniBand 网络可以轻松扩展,支持多达数千个节点,为大规模部署提供了灵活性。
训练框架设计
框架介绍
- DeepSeek-V3采用
三层并行框架
- 16路流水线并行(PP):将模型层划分为16个阶段,分布在不同的计算设备上,通过流水线化减少空闲时间
- 跨8个节点的64路专家并行(EP) :将混合专家(MoE)模型中的不同专家分布在64个设备上(跨8个物理节点),每个节点通过InfiniBand互联实现跨节点通信
- ZeRO-1数据并行(DP) :数据分片后分配给多个设备并行处理,优化参数存储与通信效率,同时避免全量参数冗余
- 训练框架的工程优化(细粒度化,并行化,时间换空间,最优适配)
- DualPipe算法
- 乱序执行:将
模块细粒度化
为注意力、全连接调度、MLP等组件,并重新排列计算与通信阶段,实现无依赖关系的计算与通信任务的并行处理
,显著减少流水线停滞(气泡) - 通信隐藏:进行
GPU流式多处理器(SMs)
的任务分配,并行进行当前的计算和通信任务
,从而避免GPU的空闲等待,使跨节点通信完全隐藏在执行过程中,保持较高的计算-通信比 - 分层通信优化:在
All-to-All通信
时,先让每个节点内的GPU进行内部通信
(减少跨节点带宽压力),然后进行跨节点通信
。
- 乱序执行:将
- 跨节点通信优化
- 硬件带宽利用:根据IB和NVLink技术特性,节点间用IB,节点内用NVLink,优化跨节点全对全通信内核,提升节点间数据传输效率
- 限制跨节点通信:通过MoE(混合专家)路由算法,
限制每个词元(token)最多分发到4个节点
,从而使节点内和节点间的流量处理速度完全匹配
,从而降低通信延迟 - SM动态分配:将GPU中20个流式多处理器(SM)固定分配给通信任务,通过
动态调整
打包数据、协调IB和NVLink传输等任务各自的SM,实现任务量的负载均衡
- 内存管理优化:避免张量并行(TP) :通过精细的内存管理,降低了通信复杂度和开销
- 激活重计算:
现用现算,用完就扔
。前向计算
每一层的输出(激活值),但只选择性保存部分关键数据
。反向计算梯度
时,遇到没保存的中间结果,就临时重新计算对应的部分
,从而节省大量存储空间(时间换空间) - 参数分片优化:将模型
按层进行垂直分割
,并按张量维度进行水平切片
,需要时通过AllGather操作快速拼接- 延迟加载:只有当计算流程到达某分片时才加载对应参数(用时才加载)
- 动态分片重组:根据显存余量自动调整分片粒度(如从每层分片改为每两个层合并分片)
- 分片生命周期管理:对即将被复用的参数分片实施缓存保留,对暂时不用的实施内存回收
- 激活重计算:
- DualPipe算法
DualPipe 技术与计算通信协同优化
- 概述
- 背景:在 DeepSeek-V3 中,
跨节点专家并行机制
引入了显著的通信开销
,导致计算与通信比例接近1:1,极大影响了训练效率 - 优化点:模型采用了创新性的
DualPipe 流水线并行算法
。该算法通过两个关键优化实现性能提升- 模块细粒度化:
- 将
前向传播
计算拆分成四步
:注意力计算 → 跨节点分发 → MLP处理 → 数据整合
。 - 将
反向传播
(根据训练结果和目标反向调整参数)计算拆分成四步
:梯度计算 → 跨节点回收 → 权重更新 → 数据回传
- 将
- 计算和通信重叠:模型处理数据(计算)和设备间传输数据(通信)并行,即
计算当前层数据的同时进行下步计算所需数据的传输
- 模块细粒度化:
- 背景:在 DeepSeek-V3 中,
- DualPipe 流水线并行算法
- 基本原理
- 双向输入:同时从流水线两端输入
微批次(micro-batch)
,使前向传播(Forward)
和后向传播(Backward)
的数据流在管道中并行处理,从而减少单向流水线中,前向与反向传播严格交替执行,导致的设备空闲(“流水线气泡”(Pipeline Bubble)) - 计算和通信重叠:将每个微批次的计算和通信拆分为更细粒度的组件操作(如注意力模块、全连接通信等),并通过手动调整GPU计算单元(SM)的分配比例,确保计算和通信的合适比例,从而使得通信可隐藏在计算过程中
- 双参数副本:DualPipe维护两份模型参数副本,实时更新
当前计算副本
和异步延迟更新下批次预加载副本
,并结合专家并行(EP)实现分布式存储,动态选择需要激活的专家,DualPipe显存占用 = (总参数量 / EP并行度) × 副本数2
- 双向输入:同时从流水线两端输入
- 优点
- 可拓展:扩大模型规模时,只要维持适当的计算通信比例,就能在节点间实现细粒度的专家分配,同时将全节点通信开销降至接近于零
- 限制低:只要流水线阶段数和微批次数能被2整除即可运行,而无需像Chimera方法要求微批次数必须被流水线阶段数整除
- 流水线阻塞:与ZB1P、1F1B等方法相比,DualPipe的气泡比例可降低至传统方法的几分之一
- 通信优化:DualPipe结合了InfiniBand(IB)和NVLink的带宽优势。跨节点通信通过IB进行,而节点内通信利用NVLink的高带宽(160GB/s)。每个令牌(token)最多被路由到4个节点以减少IB流量,且IB与NVLink的通信完全重叠,避免了阻塞。
- 基本原理
跨节点all-to-all通信的高效实现
- 传统通信问题
- 资源闲置:传统MoE模型在跨节点通信时依赖InfiniBand(IB),但其带宽(50GB/s)远低于节点内NVLink(160GB/s),两者数据传输速度不匹配导致
较慢的跨节点通信成为性能瓶颈
。 - 挤占计算:通信任务占用过多GPU流处理器(SMs)资源,挤占计算任务所需算力。
- 资源闲置:传统MoE模型在跨节点通信时依赖InfiniBand(IB),但其带宽(50GB/s)远低于节点内NVLink(160GB/s),两者数据传输速度不匹配导致
- 解决方式
- 节点内立即转发:入口GPU通过NVLink立即将token转发至目标专家所在的GPU,避免因后续token到达导致阻塞
- 带宽匹配设计:NVLink带宽约为IB带宽的3.2倍,所以
限制每个token跨4个节点
(IB流量为4),同时在每个节点内平均选择3.2个专家
(NVLink流量为4×3.2=12.8),使IB与NVLink的通信流量完全重叠,避免高带宽NVLink经常性闲置 - 动态资源分配:将20个SMs划分为10个通信信道,根据实时负载动态分配线程处理相关的任务,并将任务细粒度化为两个阶段的四个步骤
- 分发阶段:IB发送→IB到NVlink的转发→NVLink分发
- 组合阶段:NVLink发送→NVLink到IB的转发→IB组合
- 干扰抑制:通过定制PTX指令和通信块的自适应调整,降低L2缓存占用,减少对其他SM计算任务的影响
极致的内存节省与最小开销
- 算法
- 重计算:训练时
不会缓存所有中间激活值
供反向传播使用,在需要使用会立即计算
RMSNorm(均方根归一化)和MLA(多层感知机上投影) - CPU执行指数移动平均:由于CPU内存通常比GPU显存大得多,所以DeepSeek将EMA参数存储在CPU内存中,并通过异步更新(即训练步骤完成后,后台更新EMA)避免阻塞GPU计算
- MTP的共享向量和输出头:传统设计中输入和输出层可能分属不同GPU,导致重复存储;而共享后只需存储一份,反向传播时梯度也统一更新
- 重计算:训练时
FP8训练
细粒度混合精度框架
- 概述
- 基本原理:大部分计算密集型操作采用 FP8 执行,而关键操作则保持原有数据格式,从而实现训练效率和数值稳定性的最优平衡
- FP8 数据格式
- 优势
- 数据体积压缩:在
损失部分精度
的情况下,同样的数据
在量化(采用低精度存储)
后可以极大减少数据存储总量
。(原本用float32存一个数,改用int8后,存储空间能直接缩减到原来的1/4) - 硬件算力指数倍增:芯片内部电路对低精度运算有专用加速单元(如T4显卡:float16与float32相比直接算力提升了约8倍)
- 传输效率提升:减少数据传输时间和带宽占用,让计算单元更专注运算而非等待数据
- 数据体积压缩:在
- 劣势:直接用FP8训练大模型容易因数值范围太小导致溢出或误差
- DeepSeek-V2验证:训练数据约为1Ttoken情况下,与 BF16 基准相比,FP8 训练模型的相对损失误差始终保持在 0.25% 以下,这完全在训练随机性的可接受范围内,但通过动态量化与高精度保留,DeepSeek在超大规模模型上实现了理论计算速度翻倍(2倍)。
- 优势
- 框架优化原理
- 智能精度混合(哪里用低精度,哪里用高精度)
精度敏感
部分:使用更高精度的BF16或FP32格式
,避免关键环节出错,如嵌入层和输出层等精度不敏感
部分:使用较低精度的FP8格式
能大幅提升计算速度并减少内存占用,如大部分计算密集的矩阵乘法等
- 细粒度量化
- 块状量化:将张量按划分为
𝑁𝑐×𝑁𝑐元素的块状分组
,例如权重矩阵可能按128×128的块分组 - 条状分组:将张量按划分为
1×𝑁𝑐或𝑁𝑐×1元素的条状分组
,例如前向传播的激活值按1×128的条状分组,反向传播的激活梯度按128×1的纵向分组 - 总结:每个条状或块状组内独立计算缩放因子,显著减少异常值对量化精度的影响,同时保持计算效率
- 块状量化:将张量按划分为
- 高精度累计优化
- 误差问题:高精度转化成低精度可能因个别异常值而增加
量化误差
,反向过程中可能有较大的舍入误差
- 解决方式:FP8进行大部分的低精度计算,但计算中间结果用FP32累加,最后再转回FP8,减少误差累积
- 误差问题:高精度转化成低精度可能因个别异常值而增加
- 内存通信减负
- 用FP8格式缓存和传输激活值(神经网络中间结果),同时用BF16存储优化器状态(训练时的参数调整记录),比全程用高精度格式节省了约40%的内存和通信资源,平衡效率与稳定性
- 智能精度混合(哪里用低精度,哪里用高精度)
- 基本框架
- 大部分核心计算操作(尤其是 GEMM 运算),均采用 FP8 精度实现。这些 GEMM 运算接收 FP8 格式的张量输入,输出 BF16 或 FP32 格式的结果。
- 线性运算相关的三个 GEMM 操作,包括 Fprop(前向传播)、Dgrad(激活值反向传播)和 Wgrad(权重反向传播),均采用 FP8 执行,理论上将计算速度提升至原有 BF16 方法的两倍
- FP8 格式的 Wgrad GEMM 使得激活值能够以 FP8 格式存储用于反向传播,显著降低了内存使用量。
- 严格需要高精度计算支持的小部分(BF16 或 FP32),可以采用更高精度处理而不会显著影响整体训练效率。
- 高精度存储:主要权重参数、权重梯度和优化器状态均采用更高精度存储
- 高精度计算:向量层、输出层、MoE 门控模块、标准化运算和注意力运算模块
- 针对性的高精度保留策略确保了 DeepSeek-V3 训练过程的动态稳定性。为进一步保障数值计算的稳定性
- 提升低精度训练的准确性
- 细粒度量化技术
- 乘法计算
细粒度量化技术
- 概述
- 背景:FP8通常采用E4M3格式(4位指数3位尾数),其可表示的数值范围远小于高精度格式,经常出现数值溢出和下溢的问题。
- 传统解决方法:将输入张量的最大绝对值映射到 FP8 格式的最大可表示值,但其中的极端值会导致低精度训练的其他大部分正常值精度显著下降
- 细粒度量化技术:在 GEMM 操作的内部维度引入组级缩放因子,从而减少异常值对于量化精度的影响( NVIDIA 新一代Blackwell 系列GPU的 Tensor Cores 已宣布将支持更细粒度的微缩放格式)
- 示例:有一个能装0-1000毫升的水杯,但平时99%的时间你只需要装0-10毫升的水。这时候如果因为偶尔要装一次1000毫升,就把整个杯子的刻度都按1000毫升来划分,那么0-10毫升区域的刻度就会变得非常粗糙。
- 分组量化(图A)
- 块状量化
𝑁𝑐×𝑁𝑐
:权重矩阵可能按128×128的块分组(每 128 个输入通道对应 128 个输出通道) - 条状分组
1×𝑁𝑐或𝑁𝑐×1
:前向传播的激活值按1×128的条状分组,反向传播的激活梯度按128×1的纵向分组(每个token对应128 个通道) - 总结:每个条状或块状组内独立计算缩放因子(一个异常值只能影响其所在的那一小块),从而显著减少异常值对量化精度的影响,同时保持计算效率
- 块状量化
高精度累加策略
- 概述
- 问题:在GPU上进行低精度(FP8)矩阵乘法(GEMM)时,由于数值精度不足,累加多个小数值时容易产生下溢误差(结果过小,被近似为0)
- 解决方式:
- 核心思路:Tensor Core执行FP8矩阵乘加(MMA)时,每累加128个元素(即4次WGMMA操作)后,将部分结果转移到CUDA Core,用FP32精度累加,再量化到FP8,从而显著减少下溢误差的同时,同时额外计算开销极小
- 并发优化:一个线程组执行CUDA Core的高精度累加时,另一个线程组可继续执行Tensor Core的MMA操作,保持硬件利用率
- 组级缩放因子:沿矩阵内部维度K将元素分组,每组单独计算缩放因子,缓解FP8动态范围不足的问题。
- 统一E4M3格式:所有张量计算统一使用E4M3(4位指数+3位尾数),而非混合格式(如Fprop用E4M3,梯度用E5M2),提升一致性精度。
- 效果与优化
- 精度提升:通过FP32累加,误差从2%大幅降低到0.25%,接近FP32训练效果。
- 效率平衡:间隔设为128元素(4次WGMMA)是精度与效率的最佳平衡点,更频繁的精度转换和寄存器操作会增加指令开销
- 硬件建议:未来GPU需提升Tensor Core的累加精度(如支持全FP32累积),或动态调整位宽以平衡误差与速度。
FP8混合精度训练阶段消耗计算
- FP8混合精度训练
- 目标:通过在不同阶段使用不同精度(如FP8/FP16/FP32),在保持模型收敛性的同时减少显存占用和计算开销
- 核心逻辑
- 尽量使用低精度:FP8节省显存和通信开销,并显著提高计算效率
- 关键时使用高精度:高精度累加减少下溢误差,核心值采用FP16/FP32保持数值稳定
- 动态缩放因子:自动调整数值范围防止溢出
- FP8混合精度的训练流程
- 前向传播(Forward Pass)
- 输入量化:将输入数据(如激活值)
从FP32/BF16量化为FP8
(通常采用E4M3格式) - 低精度矩阵乘法:在Tensor Core中
使用FP8格式的输入数据和权重执行GEMM运算
,计算效率比FP16/BF16提升约2倍。 - 高精度累加:矩阵乘法结果在CUDA Core中
以FP32格式进行累加求和
,避免中间结果溢出 - 输出反量化:
将累加结果反量化回BF16/FP32格式
,用于后续激活函数计算(如LayerNorm、Softmax需保持高精度)。
- 输入量化:将输入数据(如激活值)
- 反向传播(Backward Pass)
- 梯度量化:激活梯度
在反向传播前被量化为FP8
(通常采用E5M2格式),分组方式从正向的1x128变为128x1以适应梯度特征分布。 - 低精度反向计算:
使用FP8格式的激活值和权重梯度执行矩阵乘法
,例如计算dW时通过FP8激活梯度与FP8输入张量相乘。 - 梯度高精度融合:梯度计算
中间结果在FP32中累加
,避免低精度下溢 - 梯度通信优化:在分布式训练中,使用FP8进行梯度AllReduce通信,数据量减少75%(相比FP32)。
- 梯度量化:激活梯度
- 权重更新(Optimizer Step)
- 主权重维护:
始终维护FP32高精度主权重副本
,确保参数更新的数值稳定性。 - 低精度优化器状态:将
优化器状态存储为BF16/FP8格式
,内存占用降低50%。 - 量化感知更新:将FP32梯度按缩放因子反量化后更新主权重,再将更新后的权重量化为FP8用于下一轮前向计算。
- 主权重维护:
- 混合精度误差补偿
- 动态损失缩放:自动检测梯度溢出情况,动态调整损失缩放因子(Scale Factor),典型范围在128-8192之间。
- 精度解耦策略:对敏感层(如Attention输出投影层)使用混合精度(如FP8+BF16),在反向传播时临时切换至高精度计算。
- 异常值隔离:通过Tile-wise分组量化(如128x1分组),将异常值隔离到独立量化单元,避免影响整体数值范围。
- 前向传播(Forward Pass)
- 前向传播(Forward Pass)资源消耗
- 显存消耗
- 组成
- 激活值存储:保存前向传播过程中各层的中间计算结果(如ReLU后的输出、注意力分数等),是临时生成的动态数据
- 权重存储:保存模型通过学习数据得到的可训练参数集合,权重的训练是一种动态量化,不需要存储FP8权重
- 显存总消耗
- L L L:模型层数
- N params N_{\text{params}} Nparams:模型参数量(例如175B参数)
- B B B:批次大小(Batch Size)
- S S S:序列长度(Sequence Length)
- H H H:隐藏层维度(Hidden Dimension)
- ByteCount:字节(FP8=1 byte/元素,FP32=4 bytes/元素)
Memory forward = N params × B y t e C o u n t ⏟ 权重 + L × B × S × H × B y t e C o u n t ⏟ 激活值 \text{Memory}_{\text{forward}} = \underbrace{N_{\text{params}} \times ByteCount}_{\text{权重}} + \underbrace{L \times B \times S \times H \times ByteCount}_{\text{激活值}} Memoryforward=权重 Nparams×ByteCount+激活值 L×B×S×H×ByteCount
- 组成
- 算力消耗
- 2 × B S H 2 2 \times BSH^2 2×BSH2:FP8矩阵乘法的计算量(乘加算两次操作)
-
α
\alpha
α:量化/反量化操作的开销比例(通常
α
<
0.1
\alpha < 0.1
α<0.1)
FLOP forward = 2 × B × S × H 2 ⏟ FP8矩阵乘法 + α × N params ⏟ 量化/反量化 \text{FLOP}_{\text{forward}} = \underbrace{2 \times B \times S \times H^2}_{\text{FP8矩阵乘法}} + \underbrace{\alpha \times N_{\text{params}}}_{\text{量化/反量化}} FLOPforward=FP8矩阵乘法 2×B×S×H2+量化/反量化 α×Nparams
- 显存消耗
- 反向传播(Backward Pass)资源消耗
- 显存消耗
- FP8梯度+权重副本:乘以2是因为需要存储梯度和权重副本
- 中间梯度缓存:在反向传播过程中,需要存储的中间层梯度
Memory backward = 2 × N params × B y t e C o u n t ⏟ FP8梯度+权重副本 + B × S × H × B y t e C o u n t ⏟ 中间梯度缓存 \text{Memory}_{\text{backward}} = \underbrace{2 \times N_{\text{params}} \times ByteCount}_{\text{FP8梯度+权重副本}} + \underbrace{B \times S \times H \times ByteCount}_{\text{中间梯度缓存}} Memorybackward=FP8梯度+权重副本 2×Nparams×ByteCount+中间梯度缓存 B×S×H×ByteCount
- 算力消耗
- 梯度计算:乘以4是因为反向传播计算量约为前向的2倍(链式法则)
- 梯度类型转换:这部分表示将梯度从FP8格式转换为FP16格式所需的浮点运算次数(类型转换开销
β
\beta
β通常小于0.05)
FLOPs backward = 4 × B × S × H 2 ⏟ 梯度计算(FP8 GEMM) + β × N params ⏟ 梯度类型转换(FP8→FP16) \text{FLOPs}_{\text{backward}} = \underbrace{4 \times B \times S \times H^2}_{\text{梯度计算(FP8 GEMM)}} + \underbrace{\beta \times N_{\text{params}}}_{\text{梯度类型转换(FP8→FP16)}} FLOPsbackward=梯度计算(FP8 GEMM) 4×B×S×H2+梯度类型转换(FP8→FP16) β×Nparams
- 显存消耗
- 权重更新(Optimizer Step)资源消耗
- 显存消耗
- FP8混合精度: N params × 12 bytes N_{\text{params}} \times 12 \text{ bytes} Nparams×12 bytes(FP32主权重每个参数需要4字节 + FP8量化权重仅需1字节 + Adam状态的动量和方差各4个字节,共8字节,但总的通常优化后接近12字节)
- FP32全精度:
N
params
×
16
bytes
N_{\text{params}} \times 16 \text{ bytes}
Nparams×16 bytes(权重 + Adam状态)。
Memory optimizer = N params × 4 ⏟ FP32主权重 + 2 × N params × 4 ⏟ Adam动量/方差(m, v) \text{Memory}_{\text{optimizer}} = \underbrace{N_{\text{params}} \times 4}_{\text{FP32主权重}} + \underbrace{2 \times N_{\text{params}} \times 4}_{\text{Adam动量/方差(m, v)}} Memoryoptimizer=FP32主权重 Nparams×4+Adam动量/方差(m, v) 2×Nparams×4
- 算力消耗
- 每个参数需要3次浮点操作(计算动量、方差、更新)。
-
γ
\gamma
γ:反量化开销(通常
γ
≈
0.02
\gamma \approx 0.02
γ≈0.02)。
FLOPs optimizer = 3 × N params ⏟ Adam更新(m, v, 权重) + γ × N params ⏟ 反量化(FP8→FP32) \text{FLOPs}_{\text{optimizer}} = \underbrace{3 \times N_{\text{params}}}_{\text{Adam更新(m, v, 权重)}} + \underbrace{\gamma \times N_{\text{params}}}_{\text{反量化(FP8→FP32)}} FLOPsoptimizer=Adam更新(m, v, 权重) 3×Nparams+反量化(FP8→FP32) γ×Nparams
- 显存消耗
- 损失缩放(Loss Scaling)资源消耗
- 单FP32缩放因子: Memory loss_scale = 4 bytes \text{Memory}_{\text{loss\_scale}} = 4 \text{ bytes} Memoryloss_scale=4 bytes
- 损失值缩放与反缩放: FLOPs loss_scale = 2 × B × S × H × 1 \text{FLOPs}_{\text{loss\_scale}} = 2 \times B \times S \times H \times 1 FLOPsloss_scale=2×B×S×H×1
- 总算力消耗
- 总显存占用
Total Memory = Memory forward + Memory backward + Memory optimizer + Memory loss_scale \text{Total Memory} = \text{Memory}_{\text{forward}} + \text{Memory}_{\text{backward}} + \text{Memory}_{\text{optimizer}} + \text{Memory}_{\text{loss\_scale}} Total Memory=Memoryforward+Memorybackward+Memoryoptimizer+Memoryloss_scale
代入具体值示例(以GPT-3 175B为例):
Total Memory ≈ 175 B × 1 + 175 B × 12 + 2 × 175 B × 1 + 4 = 2275 GB \text{Total Memory} \approx 175\text{B} \times 1 + 175\text{B} \times 12 + 2 \times 175\text{B} \times 1 + 4 = 2275 \text{ GB} Total Memory≈175B×1+175B×12+2×175B×1+4=2275 GB (显存优化),对比FP32全精度:约 ( 175\text{B} \times 16 = 2800 \text{ GB} ),显存减少约20%。 - 总算力消耗
Total FLOPs = FLOPs forward + FLOPs backward + FLOPs optimizer + FLOPs loss_scale \text{Total FLOPs} = \text{FLOPs}_{\text{forward}} + \text{FLOPs}_{\text{backward}} + \text{FLOPs}_{\text{optimizer}} + \text{FLOPs}_{\text{loss\_scale}} Total FLOPs=FLOPsforward+FLOPsbackward+FLOPsoptimizer+FLOPsloss_scale
算力节省比例:
Speedup = FP32 FLOPs FP8 FLOPs × FP32带宽需求 FP8带宽需求 ≈ 2.5 × \text{Speedup} = \frac{\text{FP32 FLOPs}}{\text{FP8 FLOPs}} \times \frac{\text{FP32带宽需求}}{\text{FP8带宽需求}} \approx 2.5 \times Speedup=FP8 FLOPsFP32 FLOPs×FP8带宽需求FP32带宽需求≈2.5×
- 总显存占用
- 比较训练GPT3-175B参数模型
预训练(Pre-training)
概述
- 定义: 让模型通过大规模
未标记数据
中学习统计规律和语义结构,从而减少对标记数据的依赖,加速和优化在有限数据集上的模型训练。(例:教婴儿学习,一开始只需要让他多听多看即可) - 基本原理
- 规律参数化:模型把从海量数据中学到的各种抽象规律,压缩转化成参数存储在神经网络中
- 自监督学习(Self-supervised Learning):通过
顺序预测
和随机掩码
让模型学习上下文关联性和语言生成逻辑(模型自己出题自己做,从而总结规律)- 自回归预测(GPT系列方法):让模型根据前文预测下一个词,逐个生成句子。(类似成语接龙)
- 上下文掩码词预测(BERT的方法):随机遮盖句子中的某些词,让模型根据上下文猜被遮住的词(类似完型填空)
- 注意力机制:通过Transformer的注意力机制给数据不同部分分配权重,从而让模型快速理解长距离依赖关系
- 作用
- 加速模型收敛:预训练后的模型参数已接近最优,在特定任务的微调中只需少量迭代即可收敛,大幅减少训练时间和计算资源。
- 提升泛化能力:通过学习通用语言特征,模型能适应不同领域和任务,即使目标任务数据有限,也能通过迁移学习实现高效应用
- 解决数据稀缺问题:预训练利用公开大规模数据(如The Pile、互联网文本)弥补领域数据的不足,尤其适用于低资源语言或专业场景
- 支持多模态扩展:预训练框架可扩展至多模态数据(如图像、声音),通过对比学习或跨模态编码器融合,增强模型的综合理解能力
数据构建
- 训练数据的优化
- 语料库优化:相比 DeepSeek-V2,本次预训练语料库在
提升数学和编程样本占比
的同时,扩大
了英语和中文之外的多语言覆盖范围
。 - 文档打包:保持每个文档的
内容完整性
,不使用跨样本注意力掩码,避免被其他文档内容干扰 - 降低数据冗余:
去除数据中的重复和无用内容
,最终训练语料库包含 14.8T 经 tokenizer 处理的高质量多样化 token
- 语料库优化:相比 DeepSeek-V2,本次预训练语料库在
- 填充中间策略(FIM,Fill in the middle)
- 原理
- 双向上下文建模:同时利用前缀和后缀,增强中间生成的一致性
- 动态掩码:训练模型预测中间随机被遮盖的内容,提升模型的鲁棒性
- 应用比率:该结构在预打包阶段应用于文档级别,FIM 策略的应用比率为 0.1,与 PSM 框架保持一致,从而避免
整体性特征学习的缺失
- 原理
- DeepSeek-V3 的词表和 tokenizer
- 词表大小:DeepSeek-V3 采用词表大小为 128K 的
字节对编码分词器
BPE tokenizer,能将单词进行更细粒度的词元切分,从而压缩文本并提高处理效率 - 新的预分词器设计
- 原理:V3的预分词器引入标点符号与换行符组合成特殊token的设计,提高文本结构的编码效率(例如,将句尾标点(如句号、问号)与换行符合并)
- 问题:在处理无终端换行符的多行提示词时可能产生 token 边界偏差,尤其是在少样本评估场景。
- 解决方式:训练时对一定比例的组合 token 进行随机分割,使模型接触更多特殊情况来减轻这种偏差。(如将“标点+换行符”拆分为独立token)
- 词表大小:DeepSeek-V3 采用词表大小为 128K 的
超参数设置
- 超参数概述
- 定义:由用户或优化算法
提前设置的参数
,用于调节模型的训练过程和行为,以优化模型的性能 - 常见超参数
- 学习率(learning rate):控制
模型参数的更新幅度
,过小会导致模型训练速度极慢,过大则可能导致模型无法收敛,错过最优收敛点 - 正则化参数(regularization parameter):在损失函数中引入额外的约束,限制了模型的复杂度,
防止过拟合
,从而提高模型的泛化能力 - 神经网络层数(layer):神经网络中隐藏层的数量,控制
模型的拟合程度
,较少可能无法捕捉数据中的复杂模式,导致欠拟合,过多的网络则计算成本较高且容易过拟合 - 批大小(batch size):影响梯度估计的准确性和训练的并行化程度。过小,梯度更新的随机性较大,可能会导致训练过程不稳定;批大小过大会占用较多 GPU 内存,但会加快收敛速度
- 学习率(learning rate):控制
- 定义:由用户或优化算法
- DeepSeek-V3模型架构主要参数
- Transformer结构
- 层数:采用了
61 层
的 Transformer 结构,每层 Transformer 包含自注意力机制(Self-Attention)和前馈神经网络(Feed-Forward Neural Network, FFN)两个主要子层。 - 隐藏维度:每一层 Transformer 中向量维度为
7168
,即每层的输入和输出都是 7168 维的向量。 - 参数:参数的初始值在均值为 0、
标准差为 0.006
的正态分布中随机采样,使模型在训练初期能够有效地学习到不同的特征
- 层数:采用了
- MLA 结构:
- 注意力头数量
n
h
n_h
nh:每一层的自注意力机制中,输入被分割成
128
个不同的注意力头,每个头独立地计算注意力分数 - 注意力维度
d
h
d_h
dh:每个注意力头处理的查询(Query)、键(Key)和值(Value)向量的维度均为
128
- KV 压缩:在计算注意力分数时,键(Key)和值(Value)向量被压缩维度到512,从而减少计算和内存消耗,而查询(Query)向量被压缩到 1536 维,保留更多信息
- 查询和键部分解耦:查询(Query)和键(Key)部分在计算注意力分数时是独立处理的,向量均设为64
- 注意力头数量
n
h
n_h
nh:每一层的自注意力机制中,输入被分割成
- MoE 层
- FFN 层替换为 MoE 层:在传统的 Transformer 结构中,每一层的前馈神经网络(FFN)层通常是一个全连接层。然而,在该模型中,除了前三层外,所有 FFN 层都被替换为 MoE(Mixture of Experts)层。MoE 层是一种将多个专家网络组合在一起的结构,每个专家网络负责处理特定类型的输入数据,从而提高模型的表达能力和效率。
- 前三层保留 FFN 层:前三层保留传统的 FFN 层,可能是为了在模型的早期阶段提供稳定的特征表示,避免 MoE 层引入的复杂性和不确定性。
- 专家配置:每个 MoE 层配置 1 个共享专家和 256 个路由专家,专家的中间隐藏维度为 2048,每个 token 激活 8 个路由专家,且最多分配到 4 个节点(有效地平衡计算资源的分配)
- 多 token 预测深度:多 token 预测深度D设为 1,即每个 token 除了预测下一个精确 token 外,还需预测一个额外 token。从而提高模型的预测和泛化能力,使模型能够更好地捕捉到输入数据中的复杂模式和长距离依赖关系
- 归一化层RMSNorm:通过计算输入向量的平方根均值来对输入进行归一化。与 LayerNorm 相比,RMSNorm 不需要计算均值和方差,因此计算效率更高,同时也能有效地稳定模型的训练过程。
- 模型总参数量达到 671B,其中每个 token 激活 37B 参数
- DeepSeek-V3 在压缩潜在向量后添加了 RMSNorm 层,并在宽度瓶颈处引入额外缩放因子,避免维度较小的层限制特征的学习和传递
- Transformer结构
- DeepSeek-V3训练参数设置
- 优化器设置:
- 模型采用
AdamW 优化器
,参数设置为: β 1 = 0.9 \beta_1 = 0.9 β1=0.9, β 2 = 0.95 \beta_2 = 0.95 β2=0.95, 权重衰减为 0.1 - 预训练阶段
最大序列长度为 4K
,训练token量为14.8T
- 模型采用
- 学习率调度
- 首先在前 2K 步内从 0 线性增加至 2.2 × 1 0 − 4 2.2 \times 10^{-4} 2.2×10−4。
- 保持该学习率直至处理完 10T 训练 token。
- 随后在 4.3T token 区间内按余弦衰减曲线降至 2.2 × 1 0 − 5 2.2 \times 10^{-5} 2.2×10−5。
- 在最后 500B token 的训练中,先用 2.2 × 1 0 − 5 2.2 \times 10^{-5} 2.2×10−5 的固定学习率训练 333B token,再以 7.3 × 1 0 − 6 7.3 \times 10^{-6} 7.3×10−6 的学习率完成剩余 167B token。
- 梯度裁剪和批量大小:
- 梯度裁剪范数设为 1.0。
- 批量大小采用动态调整策略,在前 469B token 训练过程中从 3072 逐步增加至 15360,此后保持不变。
- 模型并行和路由专家分布:
- 模型采用流水线并行将不同层分配到不同 GPU,每层的路由专家均匀分布在 8 个节点的 64 个 GPU 上。
- 节点限制路由中,每个 token 最多分配至 4 个节点( M = 4 M = 4 M=4)
- 无辅助损失负载均衡:
- 在无辅助损失负载均衡方面,前 14.3T token 的偏置更新速度 γ \gamma γ 设为 0.001,剩余 500B token 设为 0。
- 平衡损失参数 α \alpha α 设为 0.0001,仅用于防止单个序列内出现极端不平衡。
- MTP 损失权重 λ \lambda λ 在前 10T token 中为 0.3,剩余 4.8T token 中降至 0.1。
- 优化器设置:
长上下文拓展
- 定义:基于YaRN(Yet another RoPE extensioN)的
位置编码改进
和两阶段扩展训练
(4K→32K→128K),突破传统Transformer模型对长序列建模的局限性,使模型能有效处理长达128K tokens的输入。 - 位置编码改进
- 基本原理:通过
位置区间
划分调整旋转角度的变化速率,让模型在近距离关注细节,远距离忽略噪声
- 核心公式:
- 分母中的40(s=40):控制远近分界线(例如40个token内算“近”)
- 指数32(β=32):强力压制远距离噪声(类似给远方的景色加模糊滤镜,只看到大体轮廓)
ω i ′ = ω i ⋅ ( 1 + 1 ⋅ ln ( 1 + i 40 ) ) − 32 \omega'_i = \omega_i \cdot (1 + 1 \cdot \ln(1 + \frac{i}{40}))^{-32} ωi′=ωi⋅(1+1⋅ln(1+40i))−32
- 效果:
- 前40个位置:采用高频旋转角度变化(即旋转角度随位置变化较快),目的是捕捉局部语法结构和短句关联性
- 超过40的位置:采用低频旋转角度变化(即旋转角度随位置变化较慢),目的是避免远距离词之间的过度干扰,并保远程语义轮廓
- 基本原理:通过
- 分段式缩放策略
- 基本原理:通过
维度
划分调整旋转角度的绝对大小,分别处理不同范围的上下文
尺度 s = 40 , α = , β = 32 ,缩放因子 t = 0.1 ln s + 1 尺度 s = 40,\alpha = ,\beta = 32,缩放因子 \sqrt{t} = 0.1 \ln s + 1 尺度s=40,α=,β=32,缩放因子t=0.1lns+1 - 效果:
- 前50%维度:保持原始RoPE的旋转编码,专注处理局部细节
- 后50%维度:用1.37倍放大旋转角度,能感知远处轮廓
- 基本原理:通过
- 在完成监督微调后,模型在"大海捞针"(NIAH)测试中表现出色
- 大海捞针:在长文本(例如数万字的文档)中插入特定目标信息(如虚构的句子、特殊标记等),要求模型根据提问定位并理解该信息
- 大海捞针:在长文本(例如数万字的文档)中插入特定目标信息(如虚构的句子、特殊标记等),要求模型根据提问定位并理解该信息
评估
- 评估基准:DeepSeek-V3 基座模型在以英语和中文为主的多语言语料库上完成预训练,因此评估工作主要针对英语、中文及多语言基准
- 评估系统 :集成于 HAI-LLM 框架的内部评估系统
- 多学科选择题评估:MMLU、MMLU Redux、MMLU-Pro、MMMLU、C-Eval 和 CMMLU
- 语言理解与推理能力:HellaSwag、PIQA、ARC 和 BigBench Hard (BBH)
- 知识问答评估:TriviaQA 和 NaturalQuestions
- 阅读理解测试:RACE、DROP、C3 和 CMRC
- 指代消歧任务:CLUEWSC 和 WinoGrande
- 语言建模评估:Pile 中文理解与文化认知:CCPM
- 数学能力测试:GSM8K、MATH、MGSM 和 CMath
- 编程能力评估:HumanEval、LiveCodeBench-Base(0801-1101)、MBPP 和 CRUXEval
- 综合能力测试:AGIEval(包含英语和中文两个子集)
该表表示:DeepSeek-V3-Base 与其他具有代表性的开源基础模型的性能对比。所有模型均在内部评估框架下进行了测试,并采用了统一的评估设置。得分差距在 0.3 以内的模型被视为表现相当。评估结果表明,DeepSeek-V3-Base 在大多数基准测试中表现出色,尤其是在数学和代码任务上表现尤为突出。
- 具体性能对比如下:
- 相比 DeepSeek-V2-Base:通过模型架构优化、规模扩展和数据质量提升,DeepSeek-V3-Base 实现了显著性能提升。
- 相比 Qwen2.5-72B-Base:尽管仅使用一半的激活参数,DeepSeek-V3-Base 在英语、多语言、代码和数学领域均展现出明显优势。在中文评测中,除 CMMLU 外的其他测试也优于 Qwen-2.5-72B。
- 相比 LLaMA-3.1-405B-Base:即便对方拥有 11 倍的激活参数量,DeepSeek-V3-Base 在多语言、代码和数学领域仍表现更优。在英语和中文语言能力评测中表现相当或更佳,特别是在 BBH、MMLU 系列、DROP、C-Eval、CMMLU 和 CCPM 等测试中表现突出。
- 得益于高效的架构设计和全面的工程优化,DeepSeek-V3 实现了极高的训练效率。在现有训练框架和基础设施下,每处理1T token 仅需 180K H800 GPU 小时,远低于 72B 或 405B 密集模型的训练成本。
- MTP策略的效果分析
- 小规模实验:采用了总参数量为 15.7B 的基线 MoE 模型,使用 1.33T token 进行训练
- 大规模实验:采用总参数量为 228.7B 的基线 MoE 模型,使用 540B token 训练。
- 对比方式:在保持训练数据和其他架构不变的情况下,为基准模型增加深度为 1 的 MTP 模块进行对比实验
- 结果:MTP 策略在绝大多数评估指标上都带来了持续的性能提升
MTP 策略的消融实验结果表明,该策略在大多数评估基准测试中均能显著提升模型性能。
- 无辅助损失平衡策略的效果分析
- 小规模模型:总参数量为 15.7B,使用 1.33T token 训练
- 大规模模型:总参数量为 228.7B,使用 578B token 训练。
- 其他:两个基准模型都采用纯辅助损失来实现负载平衡,使用带有 top-K 相关度归一化的 sigmoid 门控函数,其辅助损失强度的超参数分别与 DeepSeek-V2-Lite 和 DeepSeek-V2 保持一致
- 结果:研究在保持其他条件不变的情况下,移除所有辅助损失并引入无辅助损失平衡策略进行对比,无辅助损失策略在大多数评估指标上都实现了更好的性能表现。
- 批次级与序列级负载平衡对比
- 无辅助损失平衡与序列级辅助损失的核心区别在于平衡范围:前者是批次级,后者是序列级
- 在达到相似的批次级负载平衡程度时,批次级辅助损失能够实现与无辅助损失方法相当的性能
- 实际应用中的问题及解决方式
- 通过
大规模专家并行和数据并行的训练框架
解决个别序列或小批量数据可能出现负载不均衡问题 - 通过
带有冗余专家部署的高效推理框架
解决推理阶段可能因领域迁移导致负载失衡
- 通过
- 图片:表示在三个不同的领域:Wikipedia(英文)、Github和DM Mathematics进行测试,颜色的深浅表示负载的大小,颜色越深表示负载越大,可看出Aux-Loss-Based模型负载更加均衡。
后训练
概述
- 基本知识
- 定义:后训练是预训练(Pre-Training)完成后的一系列优化流程,通过
监督微调(SFT)
和强化学习(RL)
对基础模型进行针对性调整,以提升模型在推理、对齐人类偏好等领域的性能 - 核心目标
- 提升推理能力:通过多阶段训练增强数学、编程等复杂任务的准确性。
- 对齐人类偏好:优化回答格式、可读性及安全性。
- 平衡多任务能力:防止模型因专项优化而遗忘其他通用技能。
- 定义:后训练是预训练(Pre-Training)完成后的一系列优化流程,通过
- 作用
- 推理能力飞跃
- DeepSeek-R1-Zero在AIME 2024的pass@1分数从15.6%提升至71.0%,多数投票后达86.7%(与OpenAI-o1-0912相当)。
- DeepSeek-R1通过多阶段训练,解决可读性问题后达到与OpenAI-o1-1217同级性能。
- 小模型蒸馏:利用R1生成的80万条高质量数据,对Qwen、Llama等模型进行SFT,得到1.5B-70B参数规模的推理模型,性能接近o1-mini。
- 可读性优化:通过冷启动SFT强制规范输出结构(如分步推导、答案高亮),解决RL训练中语言混杂问题。
- 多任务平衡:混合推理与非推理数据(如写作、事实问答),避免模型过度偏向单一领域。
- 自动化数据生成:通过RL模型自我迭代生成高质量数据(如拒绝采样),减少人工标注成本,极大提高了训练效率
- 推理能力飞跃
- 原理
- 监督微调(SFT)
- 数据驱动:使用高质量标注数据(如人类编写的问答对、LLM生成后人工修正的数据)微调模型,直接模仿理想输出。
- 格式强化:通过强制结构(如“解→答”分步、代码注释)规范模型响应,解决基础模型输出混乱问题。
- 冷启动作用:少量数据(数千条)即可奠定后续强化学习的基础(如OpenAI的ChatGPT初期流程)。
- 强化学习(RLHF/PPO)
- 奖励模型(RM)引导:基于人类偏好数据(如多答案排序)训练RM,指导模型生成更符合人类价值观的输出。
- 策略优化:使用PPO(Proximal Policy Optimization)等算法,以RM为反馈优化策略,平衡探索与利用。
- 迭代修正:通过多轮RL训练解决过度拒绝、拼写错误等问题(如OpenAI因SFT数据Bug导致模型偏好错误拼写)
- 合成数据与自迭代
- 数据生成:利用模型自身生成高质量合成数据(如拒绝采样、对抗攻击场景),突破人工标注瓶颈;
- 混合训练:将真实用户交互数据与合成数据结合,提升泛化性(如GLM-4优先使用真实用户Prompt而非模板数据)。
- 监督微调(SFT)
监督微调(SFT)
- 概述
- 定义:监督微调是一种基于预训练模型的迁移学习技术,通过在特定任务的标注数据集上进一步训练,使模型适应特定领域或任务的需求
- 目标:利用预训练模型已学习到的通用语言或特征表示,结合少量标注数据实现任务适配(专业化)
- 特点
- 预训练参数继承 :基于大规模无监督数据集进行预训练,得到通用的底层模型参数
- 微调参数专业化:在目标任务的标注数据集上调整模型参数,引导模型学习任务特定的输入-输出映射关系,以适配任务特性
- 作用
- 专业化:通过微调,模型能够更精准地处理领域专有术语或复杂结构(如法律文本、医疗影像),显著提高准确率、召回率等指标
- 减少标注数据需求:预训练模型已具备通用知识,微调仅需少量标注数据即可达到高性能,尤其适用于数据稀缺场景
- 对齐需求:在生成任务中(如客服对话),微调可使模型输出更符合人类表达习惯或特定标签的判别逻辑
- 跨领域迁移能力:支持模型从通用领域(如新闻文本)迁移到垂直领域(如法律合同分析),降低重复训练成本
- 监督微调的原理
- 知识迁移机制
- 预训练阶段:模型通过无监督学习(如自回归预测、掩码语言建模)捕获语言或图像的统计规律,形成通用特征表示。
- 微调阶段:引入高质量标注数据,通过监督信号(如交叉熵损失函数)调整模型参数,使其输出与任务标签对齐
- 参数调整策略
- 全模型微调:更新所有参数,适用于数据充足且任务差异较大的场景,但计算成本高。
- 分层微调:仅调整顶层参数(如分类层),保留底层通用特征提取能力,降低过拟合风险。
- 指令微调:通过添加指令模板(如“请生成摘要:{文本}”),引导模型按特定格式输出
- 损失函数与优化目标
- 使用任务特定的损失函数(如交叉熵、均方误差),最小化预测结果与真实标签的差异
- 部分方法结合预训练损失(如语言模型损失)与微调损失,平衡通用性与任务适配性
- 数据增强与多样性控制
- 通过同义词替换、语序调整等增强数据多样性,覆盖更多任务场景。
- 引入对抗训练策略(如对抗样本生成),提升模型对噪声的鲁棒性
- 知识迁移机制
- deepseek数据处理
- 问题:在数学、代码竞赛和逻辑谜题等推理类任务中,系统采用内部DeepSeek-R1模型生成数据。R1生成的数据具有较高的准确性,但也存在推理冗长、格式不规范和输出过长等问题。
- 核心目标:在保持R1模型高准确性的同时,实现输出的清晰简洁
- 推理类任务的数据生成与优化
- 数据生成器:使用SFT(监督微调)和RL(强化学习)为特定领域训练专家模型,并将该模型作为最终模型的数据生成器,解决通用模型在特定任务(如代码生成)中的格式不规范问题。
- 两类SFT样本生成:
- 原始答案配对:直接将问题与R1生成的原始答案配对,保留原始模型的逻辑能力。
- 系统提示词增强:将优化设计的系统提示词与问题、R1答案结合,引导模型生成具有自我反思和验证机制的响应。
- 强化学习(RL)整合:
- 高温采样:在RL阶段采用高温参数(增加随机性)生成多样化响应,融合R1生成数据与原始数据特征,避免模型陷入局部最优。
- 拒绝采样筛选:利用专家模型对生成的响应进行质量评估,仅保留高质量样本用于最终SFT训练,平衡准确性与简洁性。
- 两类SFT样本生成:
- 数据生成器:使用SFT(监督微调)和RL(强化学习)为特定领域训练专家模型,并将该模型作为最终模型的数据生成器,解决通用模型在特定任务(如代码生成)中的格式不规范问题。
- 非推理数据处理
- 模型选择与人工标注:使用DeepSeek-V2.5生成创意写作、角色扮演等任务的响应,依赖人工标注确保数据的流畅性和相关性。这避免了推理任务中复杂的逻辑验证需求,更注重语义连贯性和创造性。
- 质量保障:人工标注不仅修正语法错误,还可能调整语气、风格,确保数据符合特定领域(如文学创作)的要求。
- SFT训练配置细节
- 两阶段训练:对DeepSeek-V3-Base进行两轮SFT训练,逐步适应不同领域的数据分布。
- 学习率调度:采用余弦衰减策略,初始学习率为 5 × 1 0 − 6 5 \times 10^{-6} 5×10−6,逐步降至 1 × 1 0 − 6 1 \times 10^{-6} 1×10−6,平衡训练初期的快速收敛与后期的稳定性。
- 序列处理技术:
- 多样序列打包:将不同任务的样本混合打包,提升模型的多任务泛化能力。
- 样本掩码机制:确保训练时各样本间独立性,防止信息泄露(如跨样本的注意力干扰)。
强化学习(RL)
核心优化方法
智能资源分配:哪个合适用哪个,尽量使用低开销的技术(VHLink和IB、智能精度混合)
粒度细化:横向分层,再纵向划分
并行处理:避免核心资源空闲
流水线处理:
参考博客
更多推荐
所有评论(0)