来源: DeepSeek LLM: Scaling Open-Source Language Models with Longtermism (arXiv: 2401.02954). 仓库: https://github.com/deepseek-ai/DeepSeek-LLM
这是 DeepSeek 家族第一份通用底座报告. 模型本身是 Dense Transformer, 没有 MoE 和 MLA, 结构接近 LLaMA. 报告的主要增量有三项: 在自家语料上重新拟合 Scaling Laws, 建立覆盖 91 个 Common Crawl dump 的去重流水线, 并记录对齐阶段几项主动舍弃的方案. 后续 Coder, Math 与 V2 在分词器, 训练框架, 学习率调度和评测协议上都继承了这里的设定.
1. 底座与数据
1.1. 起点: 一个照着 LLaMA 搭的 Dense 底座
微观结构基本是 LLaMA 的配方: Pre-Norm 加 RMSNorm, FFN 用 SwiGLU, 中间宽度 , 位置编码用 RoPE. 唯一的注意力改动是 67B 换成 GQA, , 目的写得很直接: 省推理成本. 7B 仍用满头 MHA. 这说明当时 DeepSeek 并没有把「推理时 KV cache 太大」当成主要矛盾, 只在大尺寸上顺手压了一下, 真正动注意力结构要等到 V2 的 MLA. GQA 在性能与缓存之间怎么取舍, 见 03-GQA-在性能与缓存之间折中.
宏观上有两处和 LLaMA 不同. 第一, 层数选成 30 和 95, 报告说这样方便 pipeline 切分. 第二, 67B 用 GQA 省下的参数预算没有照惯例加到 FFN 宽度上, 而是加到深度上, 所以 95 层配 . 报告只说「为了更好性能」, 没有给深宽对比的消融, 这一点报告没有证据. 按 Table 2 的规格粗算: 每层注意力约 (Q, O 满头, K, V 只有 1/8), FFN 约 , 95 层合计约 65B, 加上词表约 1.7B, 正好落在 67B 附近. 训练框架是自研的 HAI-LLM: 数据, 张量, 序列并行加 1F1B 流水, FlashAttention, ZeRO-1 切优化器状态, bf16 前向, fp32 累梯度, cross-entropy 在 kernel 内就地把 bf16 logits 转成 fp32 再覆写成梯度. 权重和优化器状态每 5 分钟异步落盘, 最坏只丢 5 分钟训练. 这些细节后来在 V2 和 V3 里一路沿用.
训练常数写在 §2.3 和 Table 2. 权重按标准差 0.006 初始化, 优化器 AdamW, , , weight decay 0.1, 梯度裁剪 1.0. 两档模型的上下文都是 4096. Table 2 的 batch 以序列计, 7B 为 2304 条, 67B 为 4608 条, 换成 token 分别约 940 万和 1890 万每步; 训完 2T token, 7B 约走 21 万步, 67B 约 10.6 万步. 这份报告的训练窗口止于 4K, 没有长上下文扩展. 到 V2 时, 团队才在 4K 预训练之后用 YaRN 把窗口拉到 128K.
框架里已经能看到 DeepSeek 后来反复做的那件事: 把通信藏到计算后面. 末尾一个 micro-batch 的反向和 ZeRO-1 的 reduce-scatter 重叠, 序列并行里的 GEMM 和 all-gather/reduce-scatter 重叠; LayerNorm, GEMM, Adam 更新尽量融合成单个算子. 训练还支持换一套 3D 并行配置从 checkpoint 续跑, 用来应对集群负载变化. 评测端生成任务走 vLLM, 非生成任务用 continuous batching, 省掉手调 batch 和 padding. 这些在报告里只占一段, 但 V3 的 DualPipe 和算通重叠, 思路上就是从这里一路加码过去的.
1.2. 数据: 91 个 dump 一起去重, 以及分词器的几个选择
语料目标是 2T token, 以中英为主. 流水分三步: 去重, 过滤, remix. 去重的力度是这篇最具体的数据贡献. Table 1 给出跨 dump 去重的效果: 只在 1 个 dump 内去重, 去重率 22.2%; 把 91 个 dump 放在一起去重, 去重率到 89.8%, 剔除量大约是单 dump 的四倍. Common Crawl 每一期大量内容是重复抓取的, 单期内部去重看不到跨期重复, 这张表把这件事量化了. 过滤阶段同时看语言学信号和语义信号, remix 阶段把欠采样的领域加回来. 报告没有公开过滤模型、阈值和最终领域配比, 因此只能复原流程顺序.
Table 1 给出一整条曲线: 1 个 dump 22.2%, 2 个 46.7%, 6 个 55.7%, 12 个 69.9%, 16 个 75.7%, 22 个 76.3%, 41 个 81.6%, 91 个 89.8%. 从 1 个到 2 个, 去重率翻了一倍多, 说明相邻两期的重复抓取极多; 16 到 22 个几乎不动, 41 到 91 个又涨了 8 个点, 表明更早年份与新近 dump 之间仍有大量重复内容. 最终只留下约十分之一的文档, 2T token 是在跨期去重之后得到的. 报告没有说明使用 MinHash 还是精确哈希, 也没有说明去重粒度是文档还是段落. 过滤只概括为「语言学和语义」两类评估, remix 则提高欠代表领域的占比; 三步里只有去重给出了数字.
数据流水和后面的 Scaling 实验不是两件独立的事. 报告 §3.3 说开发过程中数据集迭代了多次, 调整来源比例, 同时提升整体质量; 正是这几轮迭代留下了「早期数据」和「当前数据」两个版本, 让他们能比较同一方法在不同质量数据上拟合出的分配指数. 去重和过滤做得越狠, 数据越干净, 按他们的结论, 同样的算力越该往模型上加. 所以第 1.2 节的流水既是语料工程, 也是第 2.2 节那张 Table 4 的实验变量来源.
分词器用 Hugging Face tokenizers 实现的 BBPE. 预分词阻止换行, 标点和 CJK 符号跨类合并, 数字拆成单个 digit, 这点和 LLaMA 一样. 常规词表 100000, 加 15 个 special token 到 100015, 训练时模型词表开到 102400, 一是给以后的 special token 留位, 二是让矩阵维度对齐算力. 分词器在约 24 GB 多语语料上训练. 这个 100K 词表被 V2 原样继承(「same tokenizer as used in DeepSeek 67B」), 直到 V3 才换成 128K. 数字逐位切分可能影响后续数学能力, 报告没有提供不同切分方式的消融.
2. Scaling Laws
2.1. 超参跟着算力走: batch size 与学习率的幂律
报告第 3 节先解决一个前置问题: 不同算力预算下的模型, 超参是否都调到了最优. 如果没有, 后面拟合出来的 model/data 分配就混进了「没调好」的噪声. 他们认为多数训练常数跨算力不变, 真正敏感的是 batch size 和学习率 . 在 FLOPs 下做网格搜索, 发现最优点周围有一片很宽的近最优平台. 于是把「泛化误差不超过最小值 0.25%」的配置都当作近最优, 在 到 的范围里拟合出:
算力变大, batch 缓慢增大, 学习率缓慢下降, 方向和工程直觉一致. 他们在 量级验证, 拟合值落在最优带中间, 7B 与 67B 的实际超参也按这条曲线取(7B: batch 2304, lr ; 67B: batch 4608, lr ). 报告也承认没考虑算力以外的因素, 并观察到同算力下 model/data 分配不同时, 最优超参区域会轻微移动, 和 Kaplan 那种「最优 batch 只和 loss 有关」的说法不完全一致.
近最优平台很宽, 这件事本身有实际价值. 它意味着大模型训练前不必把 batch 和学习率抠到小数点后几位, 只要落在拟合曲线附近的带子里, 损失就差不到 0.25% 以外. 对只能训一次的 67B 来说, 这比找到一个「精确最优点」更重要: 大模型没有机会反复试错, 需要的是一个事先就能算出来, 而且容错范围够宽的配置. 报告没有公开 7B 和 67B 的训练 GPU 小时, 无法据此核算实际节省的算力. Figure 3 里 7B 和 67B 的蓝星都落在灰色近最优点构成的带子里(读图).
大量 Scaling 实验能够复用训练前段, 依靠的是 multi-step 学习率调度. 预训练先用 2000 step warmup 到峰值, 训练到 80% token 时降到峰值的 31.6%, 到 90% 时再降到 10%. 31.6% 约等于 , 两次各乘 0.316 后约为 10%. Figure 1 显示最终 loss 与 cosine 基本齐平. cosine 的衰减形状依赖总步数, 训练长度改变后通常需要重新运行; multi-step 的第一段保持常数学习率, 可以由不同训练长度的实验共享. 报告说明 到 的超参实验复用了第一阶段. 这个调度器因此同时降低了 Scaling 实验的计算成本. 三段比例经过调整后效果略有改善, 但为了提高复用率, 最终仍选择 80%/10%/10%.
2.2. 用 M 代替 6N, 以及数据质量怎样改写分配
第二个问题是模型规模怎么计量. 常用的 里, 用非 embedding 参数()会漏掉注意力本身的算力, 用全参数()又把词表算进来, 而词表对容量的贡献小. 报告改用 non-embedding FLOPs/token , 写成 :
两项都能从每 token 的前向加反向乘加数推出来. 第一项: 每层参数约 (注意力 Q, K, V, O 四个 矩阵共 , SwiGLU 三个 矩阵共 ), 每个参数前向 2 FLOPs, 反向再算两倍, 合计 , 所以 就是 . 第二项是 漏掉的部分: 一个 token 的 query 要和 个 key 做点积(), 再对 个 value 加权求和(), 前向各 FLOPs, 共 , 乘 3 算上反向得 12. 这一项没有参数, 却随序列长度线性增长, 模型越窄占比越高. 以 Table 3 第一行(8 层, 宽 512, )算: 第一项 , 第二项 , 合计正是表里的 352M, 注意力那一项反而占了 57%. 拟合目标于是写成在 约束下求 , 而不是在 上求.
Table 3 显示小模型上差异最大: 8 层, 宽 512 的配置, 只有 0.43, 是 1.32, 误差可到 50% 左右; 到 80 层, 宽 8192 时两者分别是 0.92 和 0.94. 拟合 Scaling 曲线主要靠小模型, 小模型上的系统误差会被外推放大, 所以这一改动的意义主要在拟合端. 公式本身也有前提. 第一项的系数 72 对应满头 MHA 加 宽的 GLU FFN, 第二项按不带因果掩码的完整注意力计. 社区复读这篇时指出过: 67B 用了 GQA, K, V 投影变小, 按 Table 2 规格算, 真实的 比公式值小一截, 约 而不是 . 因果注意力实际只算一半左右, 第二项也偏大. 这些偏差在大模型上占比不高, 但说明 更像一个「更贴近 MHA Dense 模型」的计量, 换架构要重算.
有了 , 用 Chinchilla 的 IsoFLOP 剖面: 8 个预算从 到 , 每个预算约 10 种 model/data 分配, 指标是 100M token 独立验证集上的 bits-per-byte. IsoFLOP 的思路是固定总算力, 让模型大小和数据量此消彼长, 每个预算下画一条 loss 曲线, 曲线谷底就是该预算的最优分配; 再把各预算的谷底连起来拟合幂律. 每个预算的超参都由上一节的公式给出, 这就是为什么超参 Scaling 要先做. 拟合得到 , , 比 Chinchilla 的 0.49/0.51 更偏向加模型. Figure 5 用小实验的 loss 曲线预测 7B 和 67B, 蓝星落在线上, 跨度约 1000× 算力.
附录 A.2 把同一批 IsoFLOP 实验分别用 , 和 重新计算算力再拟合. 三种口径在高算力段给出的最优分配差别不大, 低算力段差别明显. 外推到大模型时, 高估表现, 低估表现, 只有 的预测落在蓝星上. 因此计量口径对高算力下的参数与数据分配方向影响较小, 却会显著改变目标规模的 loss 预测, 进而影响训练预算评估.
最有信息量的是 Table 4. 同一套方法换三份数据: 早期内部数据 , 当前内部数据 , OpenWebText2 . 报告对三份数据的质量排序是 OpenWebText2 > 当前 > 早期, 指数随之单调变化: 数据越好, 多出来的算力越该给模型. 这给 Kaplan(0.73)和 Chinchilla(0.49)结论打架提供了一个解释: 它们的语料不同. 报告将其解释为高质量数据更容易被充分拟合, 因而新增算力更适合分配给模型规模. 这项解释没有单独实验, 内部质量指标的定义也未公开. 报告进一步提出, 分配指数可以作为间接的数据质量探针.
把拟合公式套回 7B 和 67B, 能看到一个报告没有明说的事实: 这两档尺寸是为了对齐开源社区的习惯选的, 并不在拟合出来的最优点上. 按 粗算, 67B 训 2T 约 FLOPs, 公式给出的最优是 约 , 数据约 1.4T; 实际模型更小, 数据多喂了约 1.4 倍. 7B 更明显, 最优数据量只有约 0.5T, 实际 2T, 多了约 4 倍. 训练算力最优和推理成本最优本来就不是同一个点, 小一点, 多训一点, 部署更便宜. 报告用 Scaling Laws 定了超参和 loss 预期, 尺寸则由部署习惯决定. 附录 A.3 的基准曲线也支持「还没训饱」这个判断: 从训练开始到结束, 各项基准持续上升, 末端没有走平, 报告自己说继续训还会涨(读图). 后来 V2 把语料扩到 8.1T, 方向与此一致.
3. 对齐
3.1. 对齐: 150 万条 SFT, 重复率, 再接 DPO
指令数据约 150 万条, 中英双语. 其中有用性数据 120 万: 通用语言任务 31.2%, 数学 46.6%, 代码 22.2%; 安全数据 30 万. 数学占到将近一半, 这和评测里 Chat 版数学大涨直接对应. 7B 训 4 epoch, 67B 只训 2 epoch, 因为 67B 过拟合明显; 学习率分别是 和 . 他们在看基准分之外还盯一个指标: 用 3868 条中英 prompt 统计「停不下来, 反复生成同一段」的比例, 解码温度设为 0. 温度 0 就是贪心解码, 一旦进入循环, 同一前缀永远选同一个下一 token, 没有采样噪声把它带出来, 所以这个比例测的是模型分布本身有没有自我强化的环, 而不是采样运气. 数学 SFT 数据越多, 重复率越高. 报告的解释是数学数据里推理句式相似, 弱模型学不会推理模式, 只学会了句式循环.
训练过程里 7B 和 67B 的表现也不一样. 7B 的 GSM8K 和 HumanEval 随 epoch 稳步上升, 67B 则很快碰到上限, 这也是 67B 只训 2 epoch 的另一面原因. 报告对 SFT 在推理任务上的作用下了一个很克制的判断: SFT 数据大量是 CoT 格式, Chat 模型在 BBH, NaturalQuestions 上小幅提升, 但 SFT 学到的是推理路径的正确格式, 而不是推理能力本身. 这个判断和后面「数学代码涨 20 分是因为 Base 欠拟合」的解释放在一起看, 意思是: SFT 能补知识, 能教格式, 教不出 Base 没有的推理. 一年后 R1 用大规模 RL 回答的正是这个问题.
处理办法是分阶段. 7B 第一阶段用全部数据, 第二阶段去掉数学和代码只留对话数据. Table 12: 重复率从 0.020 降到 0.014, HumanEval 保持 48.2, GSM8K 63.9 到 63.0, IFEval 从 38.0 升到 41.2. 67B 第一阶段后重复率已低于 1%, 第二阶段反而伤分, 所以只做一阶段. 接着是 DPO: 按有用性和无害性构造偏好对, 候选回答由自家 Chat 模型生成, 1 epoch, lr , batch 512, 学习率先 warmup 再 cosine 衰减(和预训练的 multi-step 不同, DPO 只跑一轮, 不需要复用中间段). DPO 优化的是 Rafailov 等人的目标:
, 是同一 prompt 下被偏好和不被偏好的回答. 两个对数比各自度量当前策略 相对参考模型 (这里就是 SFT 后的 Chat 模型)把该回答的概率抬高了多少; 损失只要求「好回答被抬得比坏回答多」, 不要求绝对概率上升. 控制离参考模型多远: 越大, 同样的对数比差被放得越大, sigmoid 越快饱和, 策略越不需要偏离 就能把损失压下去. 报告没写 取多少. 候选回答都由自家 Chat 模型生成, 所以 , 本来就在 的高概率区, 对数比从 0 附近起步, 这可能也是 1 epoch, 这样小步长就够用的原因. DPO 明显提升开放式生成, 报告的说法是标准基准几乎不动. 细看附录 Table 17, 「几乎不动」里其实有方向: GSM8K 从 84.1 到 85.2, TriviaQA 从 81.5 到 82.9, 但 MATH 从 32.6 降到 30.2, HumanEval 从 73.8 降到 71.3. 偏好数据以写作, 问答, 指令跟随为主, 偏向开放对话的优化对难数学题和代码有轻微拖累, 这和后来 DeepSeekMath 改用基于可验证答案的 RL 的方向一致. 报告没有公开偏好标注流程以及正负样本的选择规则. DPO 的推导见 01-DPO. 结论末尾一句值得留意: 初步实验显示 RL 能提升复杂推理, 这句话后来在 DeepSeekMath 的 GRPO 里兑现.
报告称预训练, SFT, DPO 三个阶段都考虑了安全问题, 但只公开了 SFT 中 30 万条安全数据和 DPO 中的无害性偏好对, 没有说明预训练阶段的具体处理. 评测端给出了更多细节: 20 人跨学科专家组搭了一套安全分类体系, 每个子类手写几十道题, 除了覆盖内容类别, 还专门做了提问形式的多样性, 用诱导, 角色扮演, 多轮对话, 预设立场等方式绕过表面检查, 针对的就是当时流传的「奶奶漏洞」一类攻击. 最终得到 2400 题, 标注分安全, 不安全, 拒答三类, 拒答也算安全. 按 Table 10, 67B Chat 在歧视偏见类 500 题里安全 486 题, 其他安全问题类 800 题里安全 767 题. 把拒答算作安全, 意味着这张表衡量的是「不出事」, 而不是「有用且不出事」, 过度拒答的代价在这里看不出来.
3.2. 刻意不做的几件事: 选择题, 预训练里的指令数据, system prompt
讨论节记录了几组「做了有效但不采用」的实验. 最有代表性的是选择题数据: 对齐阶段加 2000 万道中文选择题, 7B Chat 的 MMLU 从 49.4 到 60.9, C-Eval 从 47.0 到 71.3, CMMLU 从 49.7 到 73.8, 但生成式的 TriviaQA 不动(57.9), 内部 ChineseQA 反而从 75.0 降到 74.4. 他们为此把 C-Eval 验证集和 CMMLU 测试集做了去重, 排除了直接泄漏. 结论是模型学会的是「做选择题」这种格式, 用户在对话里感受不到变聪明, 于是 预训练和微调都不用选择题数据. 这等于公开承认当…2007 tokens truncated…的 DeepSeek-Coder 和 DeepSeekMoE, 以及「下一版会显著加强推理, 中文知识, 数学和代码」的数据计划, 这条在 V2 的 8.1T 语料里落地. Scaling 部分的方法论背景可对照 3.3.2-Scaling-Law.
从后代往回看, 这份报告留下的东西可以按训练链条排开. 数据端: 跨 dump 全局去重和 100K BBPE 分词器, V2 直接沿用分词器并扩大语料. 结构端: LLaMA 式 Dense 底座, 只在 67B 上用 GQA; V2 把注意力换成 MLA, FFN 换成 DeepSeekMoE, 这是家族第一次在结构上离开 LLaMA. 预训练端: multi-step 学习率(V2 叫 warmup-and-step-decay), HAI-LLM 框架, 超参随算力的幂律. 后训练端: SFT 加 DPO 的两段式, 以及对重复率的关注; 半年后 DeepSeekMath 用 GRPO 替掉了 DPO 的位置. 评测端: 困惑度与生成两套协议, BPB 比较 Pile-test, 保留集查过拟合, 刻意排除选择题数据. 这份 Dense 7B/67B 本身的榜单成绩很快被超过, 但它定下的做事方式在后面每一代报告里都还能看到.
6. 训练预算、稳定性与系统口径
从 2T token 还原优化步数: 两档模型都使用 4096 长度. 7B 的 batch 为 2304 条序列, 每步 token 数
训练 2T token 对应
67B 的 batch 为 4608 条, 每步 token, 约 步. 2000-step warmup 因而分别占 7B 全程约 0.94%、67B 约 1.89%. multi-step 的 80% 与 90% 降点若按 token 计算, 约落在 169.5K/190.7K 和 84.8K/95.4K 步. 实际 packing 若含短序列、padding 或被 mask 的 token, 有效 token/步会略低; Table 2 给的是设定 batch, 这里是满序列估算.
大 batch 的含义还取决于数据并行与梯度累积. 全局 4608 条序列可以由许多 data-parallel rank、多个 micro-batch 合成. pipeline parallel 为减少 bubble 需要足够 micro-batch, ZeRO-1 又在 data-parallel 组切分 optimizer state. 官方未给 7B、67B 的 GPU 数、并行维度和 micro-batch 配置, 因此无法从全局 batch 推回单卡显存或实际吞吐. 任何 GPU 小时估计都要另加硬件数量、利用率和失败重跑, 论文没有提供这些量.
6.1. AdamW、裁剪与精度路径
AdamW 对第 步梯度 维护一阶、二阶矩:
偏差校正后, 参数更新近似为
第一代取 . 较短的二阶记忆能更快适应梯度尺度变化, weight decay 通过解耦项约束权重. 全局梯度范数超过 1 时, 裁剪为
裁剪限制偶发尖峰的单步破坏, 也可能压低真正高信息 batch 的更新. 论文没有给梯度范数曲线或裁剪触发率, 只能确认稳定性配置, 不能量化它避免了多少次训练崩溃.
前向使用 bf16, 梯度累加使用 fp32. bf16 与 fp32 有相同指数位数, 动态范围较大, 尾数更短; 矩阵计算节省显存与带宽, 累加转 fp32 降低大量小梯度相加时的舍入误差. cross-entropy 处将 bf16 logits 转 fp32, 计算 softmax 与梯度后覆盖原 logits 缓冲区, 同时解决数值范围和峰值显存. 这种 in-place 复用要求后续反向不再需要原 logits, 是计算图生命周期驱动的内存优化.
权重是否保留 fp32 master copy、loss scaling 细节以及激活 checkpoint 策略没有完整公开. ZeRO-1 只切 optimizer state, 参数和梯度仍在数据并行 rank 上复制. 67B 单靠数据并行放不进单卡, 还需 tensor 与 pipeline parallel. 报告说采用 data、tensor、sequence parallel 和 1F1B pipeline, 没给每种并行度. 读者可以理解系统构成, 无法复刻同一资源规划.
公式的逐项推导与修正: 满头注意力的四个投影每层参数约 . SwiGLU 三个矩阵、宽度 , 参数为
每层非 embedding 参数主项为 . 训练一个线性层时, 前向矩阵乘约 FLOPs/参数/token, 反向对输入和权重各有一次同阶矩阵乘, 合计约 FLOPs/参数/token. 因而得到 . attention score 与 value 聚合的前向各约 FLOPs/token, 合计 ; 带上两项反向约乘 3, 得 . 这就是
因果掩码只计算下三角时, 对一整段长度 的 score 矩阵元素数为 , 平均每 token 看到约 个历史位置. 若 kernel 真正跳过上三角, attention 项更接近 ; 若实现仍做部分填充计算, 系数位于两者之间. FlashAttention 的 IO 优化不改变理论乘加数, 却大幅改变显存访问和可训练长度. 所以 FLOPs 口径和墙钟性能不能混用.
GQA 需要修正投影参数. 令 query 头数 , KV 头数 , 比例 . Q、O 各约 , K、V 各约 , attention 投影总计 . 加 SwiGLU 后每层约 . 训练参数乘加主项为
67B 的 , 系数为 , 低于 MHA 的 . score 计算仍有 个 query 头, 与 的乘加主项并不按 同比例下降; K、V 投影和缓存才明显减少. 论文统一使用 MHA 公式便于拟合, 对 67B 真实 FLOPs 会偏高.
embedding/output 投影也未计入 . 若输入输出权重共享, 参数只存一份, forward 仍要计算全词表 logits; 若不共享, 参数与存储更多. 序列 packing、padding、归一化、激活函数与 optimizer 更新同样消耗算力. 的价值在于比 多计 attention 二次项并排除词表容量干扰, 不是完整的 profiler 模型. 用它比较架构差异时必须重新推导系数.
F1B pipeline 与恢复成本: pipeline parallel 把连续层分到 个 stage, micro-batch 沿 stage 前传再反传. 1F1B 稳态中每个 stage 交替执行一次 forward 和一次 backward, 比先做完全部 forward 再 backward 降低激活驻留. 若 micro-batch 数为 , 简化 bubble 比例约随 下降; 越大, pipeline 越满, 调度和累积开销也越高. 95 层便于切分, 不代表任何 都能完全均匀, embedding、输出层和通信仍可能造成 stage 不平衡.
tensor parallel 在单层内切矩阵, 需要 all-reduce 或 reduce-scatter; sequence parallel 把部分激活沿序列维拆分, 降低重复显存, 同时引入 all-gather. 把 GEMM 与通信重叠要求依赖关系允许, 网络也要与计算并发推进. 末个 micro-batch 的 backward 与 ZeRO reduce-scatter 重叠, 能缩短 iteration 尾部. 这些优化提高 hardware utilization, 不改变模型的统计目标. 若网络拥塞或矩阵太小, 重叠窗口不足, 理论隐藏量无法兑现.
每 5 分钟异步 checkpoint 将故障损失上界压到约 5 分钟已完成计算, 但写盘本身占用存储带宽和 CPU. 设平均故障间隔为 , checkpoint 周期为 , 单次保存阻塞等价成本为 , 理想均匀故障下每周期预期浪费约 的训练时间, 保存开销约 . 更短周期减少回滚, 增加保存压力. 异步写入把阻塞 降低, 还需保证快照一致且后台写完前不会覆盖缓冲. 论文报告周期和最坏回滚, 没给故障率与保存带宽, 无法计算净收益.
支持更换 3D 并行配置续训意味着 checkpoint 使用可重分片的逻辑布局, 参数、optimizer state 与随机状态能映射到新拓扑. 这对共享集群很实用: 节点数量变化后无需从头训练. 但 batch、浮点归约顺序和数据 worker 变化会让后续轨迹产生数值差异. 「能续训」指优化过程稳定衔接, 不等于 bitwise reproducible.
从 Base 到 Chat: 能力变化怎样归因: ### 6.2. SFT 是条件分布重加权
SFT 仍使用 token-level cross-entropy, 数据从自然文本换成指令与回答对. 对 prompt 和回答 , 常见目标只在回答 token 上计损失:
它把模型概率质量移向示范回答的格式、语气与解题轨迹. 150 万条样本相对 2T 预训练 token 很小, 监督信号却高度集中, 多轮 epoch 让同一模式反复出现. 7B 训练 4 epoch, 67B 训练 2 epoch, 表明容量更大的模型更快拟合这批数据. 若只看最终 benchmark, 很容易把格式适配、知识补充与新推理能力混在一起.
数学占有用性数据 46.6%, 代码占 22.2%, 因而 GSM8K、MATH、HumanEval 大幅上升具有直接数据解释. 仍不能断言所有测试题知识都来自 SFT. Base 已经在预训练中见过数学和代码, SFT 可能只是教它按 benchmark 所需格式展开 CoT 或输出函数. 区分两者可以设计 closed-book probing: 固定问题内容, 分别要求选择、短答案、完整推导、程序验证; 若只有熟悉格式提升, 表示知识原本存在而读取方式改变. 官方实验没有给这组分解.
7B 的第二阶段移除数学代码数据, 重复率下降且相关 benchmark 基本保持, 说明第一阶段形成的能力在短期对话微调中没有立即消失. 这不等同于数学代码数据不会造成重复. 报告观察到增加数学 SFT 与重复相关, 原因可能是模板句式、长 CoT 中局部循环、数据重复或小模型容量不足. 要确认因果, 应固定样本数和 token 数, 用去模板化数学数据、普通对话数据分别训练, 再比较贪心与采样解码的循环率.
重复率测试在温度 0 下进行. 若模型某一步进入 最大的循环状态, 贪心解码会稳定重复; 温度采样可能偶然跳出, 也可能制造别的退化. 因此该指标适合检测确定性循环, 不覆盖啰嗦、语义重复和高温失控. 3868 条中英 prompt 给出实用监控集, 官方没有公开长度上限、重复判定算法与置信区间, 细小差值要谨慎解释.
DPO 梯度到底推动什么: 令
单样本 DPO 损失为 . 对 求导:
当偏好排序仍错、 时, 梯度幅度较大; 当正确回答已经明显领先, 梯度趋近零. 展开到参数:
参考模型项不对 求导, 它通过 margin 设定每个回答的起点. 长回答的 log probability 是 token 对数概率之和, 长度分布若在正负样本间不平衡, 偏好学习会混入长度偏置. 报告没有公开是否做长度归一化、 和 pair 构造细节, 无法完整复现 DPO.
候选都由自家 Chat 模型生成, 数据位于参考策略能覆盖的区域. 这降低离策略程度, 也限制探索: 基础模型几乎不会生成的优质解法很难出现在 pair 中. DPO 擅长在已有候选间重排, 无法凭空提供外部知识或可靠验证. Table 17 中语言与开放问答改善、MATH 和 HumanEval略降, 符合偏好数据覆盖决定梯度方向的解释. 这组结果不足以证明 DPO 普遍损伤推理; 换成可验证数学与代码偏好, 方向可能改变.
benchmark 提升的三层分解: 一个任务得分可以粗略拆成能力、提示接口和解析器三层. Base 用 few-shot completion, Chat 用 zero-shot 对话; 模型需要理解任务、生成正确内容, 还要把答案放进评测器能识别的格式. 选择题困惑度评测绕开自由生成格式, Chat 的 0-shot 生成可能承担额外接口成本. HumanEval 则要求代码能通过测试, 输出围栏、函数签名和多余文字都可能影响解析.
所以 Base 到 Chat 的差值不能统一叫作「能力增长」. GSM8K 从 63.4 到 84.1, 数据覆盖和 CoT 格式大概率都参与; HellaSwag 下降更可能反映对话策略与 completion 目标不匹配; CLUEWSC 的生成解析可能放大格式漂移. 最可靠的归因实验应让同一个 checkpoint 同时接受 completion 与 chat template, 或用受约束解码提取答案, 将提示与能力分开. 官方表格提醒了 shot 差异, 没有完成全套交叉实验.
20M 中文选择题实验是一个难得的反例. 三个选择 benchmark 大涨, TriviaQA 和内部中文问答没有同步改善, 说明训练分布与评测形式高度匹配时, 分数可以脱离一般知识能力. 已对 C-Eval、CMMLU 测试集去重排除了直接题目重复, 仍可能学到选项模式、考试语言和领域先验. 这并不证明选择题数据毫无价值; 若真实应用就是考试, 格式能力本身有用. 团队的取舍是通用聊天模型不以这类榜单增益为优先.
安全分数和有用性的张力: 安全评测把安全回答与拒答都计为通过. 对风险 prompt 集合 , 可写成
模型若一律拒答, 此指标可能很高, 有用性却很低. 完整评价至少还要在良性但表面敏感的 prompt 上测过度拒答, 并区分正确安全引导、笼统拒绝和泄露有害细节. 第一代报告的 2400 题覆盖多种诱导形式, 人工三分类并交叉核验, 设计比只用关键词攻击更扎实; 没有单独公布 refusal 数量与 benign false-positive rate.
Do-Not-Answer 得分 97.8 高于报告中的若干闭源模型, 评测模板、模型版本和解码设置仍可能影响结果. 这类表格证明 checkpoint 在特定风险集上很少给出被判不安全的回答, 无法建立全域安全保证. 预训练、SFT、DPO 都声称考虑安全, 公开数量只有 30 万 SFT 安全样本和无害性偏好. 数据类别、攻击适应性与对抗测试细节不足, 应把安全成绩限定在已测协议.
6.3. 第一代 Dense 底座如何成为路线参照
对 DeepSeekMoE: 固定目标, 改变每 token 激活结构: 首代 7B、67B 的 FFN 是 Dense SwiGLU, 每个 token 使用同一组参数. DeepSeekMoE 引入细粒度专家与共享专家后, 总参数、激活参数和通信成为三套量. 对比两条路线时应固定训练 token、有效 FLOPs 与数据配方, 再看 loss 和下游能力; 只比较总参数会让 MoE 显得虚大, 只比较激活参数又会漏掉路由与 all-to-all 成本.
Dense 底座提供的参照包括: 相同自回归目标、相近 LLaMA 式残差主干、RMSNorm、RoPE 与 SwiGLU 语义. MoE 真正改变的是 FFN 参数如何按 token 选择. 如果 MoE 在等训练 FLOPs 下 loss 更低, 才支持稀疏扩容提高参数效率; 如果墙钟更慢, 可能是路由偏斜和通信抵消理论 FLOPs. 第一代报告没有 MoE 实验, 结尾只预告后续工作, 因而不能用后来结果改写首代架构动机.
首代 67B 的 GQA 已经体现「模型表示要为推理成本让步」, 但它仍是 Dense 模型. GQA 共享 K/V 头, MoE 稀疏选择 FFN, 两者作用位置、误差来源和系统路径不同. 把 GQA称为稀疏模型前身会混淆概念; 更准确的谱系是团队已经把部署约束纳入结构选型, 后续在更多模块上继续做条件计算与状态压缩.
对 Coder: 数据域变化能否解释专业能力: 第一代 Base 已有代码能力, 67B HumanEval 42.7、MBPP 57.4, 说明通用混合语料包含有效代码信号. 与 CodeLlama 的对照又显示不同 benchmark 方向不一. 这给 Coder 路线设定了基线: 专门增加代码数据、项目级上下文和代码相关训练后, 若 HumanEval 以外的多语言、仓库级任务也提升, 才能说明专业化超过单榜适配.
公平比较需要处理模型规模和训练时期. DeepSeek-Coder 有不同参数档与独立数据配方, 不能拿某个小 Coder 的分数直接说明架构优于 67B 通用模型. 可以在相近激活参数下比较单位 token 代码 loss, 或用同一组 held-out contest 与多语言测试. 第一代的 2023 年 7月至11月 LeetCode 周赛保留集尤其重要, 它减少经典 HumanEval 被训练数据覆盖的风险, 但题目只有 126 道, 分数方差仍大.
SFT 后 HumanEval 到 73.8 说明专业能力还受后训练接口影响. Coder 的提升若同时来自代码预训练和代码指令数据, 应分别用 Base 与 Instruct 对照. Base 比较回答「表示和知识学到了多少」, Chat/Instruct 比较「能否按用户接口调用」. 第一代恰好同时开放 Base、Chat 与中间 checkpoint, 给这种分层分析留下了材料.
对 Math: 语言模型推理与程序执行的分界: 第一代 67B Chat 用 CoT 在 MATH 得 32.6, 程序辅助后到 51.1. 同一个模型换推理方式大幅提升, 说明至少一部分失败来自算术、符号执行和中间状态可靠性. 模型能生成求解程序, 外部执行器提供确定计算, 最终答案因此改善. 这为 DeepSeekMath 后来的数学语料与可验证奖励路线提供参照: 若纯模型推理也提升, 才说明内部能力超过「会调用程序」.
程序辅助并非免费上限. 题目要能形式化, 生成代码要正确, 执行环境要安全, 最终结果还要映射回答案. 几何证明、开放论证和依赖图像的问题未必适用. Table 16 的工具结果不能推广成所有数学能力. 更严格的比较应按题型拆分, 同时报告程序生成成功率、运行错误率、正确程序但错误答案解析比例.
数字逐位 tokenizer、数学预训练比例、46.6% 数学 SFT 和程序工具共同影响最终成绩. 第一代没有消融, 所以它提供的是一个组合基线. DeepSeekMath 若改变多项变量, 也不能把全部增益归给 GRPO. 谱系阅读的价值正在这里: 先列出首代已经拥有的成分, 再看后续新增变量, 让因果主张不越过证据.
对 V2 及以后: 哪些继承, 哪些断裂: V2 延续 100K tokenizer、HAI-LLM、step decay 与大规模双语训练思路, 同时把 Dense FFN 换成 DeepSeekMoE, 把 GQA/MHA 路线换成 MLA, 数据扩大到 8.1T 并扩展长上下文. 继承项让两代具有可辨认的工程血缘, 改动项又太多, 无法把分数差当成单项消融. 首代最重要的作用是定义「没有 MoE、没有 MLA、只有 2T 与 4K」时能达到的基准.
后来的 FP8、DualPipe、MTP、GRPO 或稀疏注意力均不属于 DeepSeek LLM 7B/67B. 它们可以用于解释团队研究方向, 不能写进首代训练配方. 时间边界也适用于仓库: 官方 DeepSeek-LLM 仓库当前 README 提供模型、评测脚本与中间 checkpoint, 后续更新的依赖或转换代码未必等于 2023 年内部 HAI-LLM 实现. 论文和当时 release 是首代事实的主证据.
中间 checkpoint 让 Scaling 预测具备额外审计可能. 可以沿 token 进度测 BPB、GSM8K、BBH、中文任务, 检查附录所说的持续上升; 也可以对 7B、67B 做表示或遗忘研究. 官方仓库提醒转换后的 Hugging Face 模型与内部框架结果可能略有差异, 复现时要记录精度、模板、解码和评测代码版本. 若差异超过合理浮点波动, 应先排查权重转换和协议, 不宜直接归为模型失效.