跳转到内容

DeepSeek-Coder-V2 — 开源 MoE 代码模型首次逼近 GPT-4 Turbo

发布日期: 2024-06-19 来源: arXiv 2406.11931 工程范式: 万亿级代码 MoE 持续预训练 + GRPO 对齐 — 开源百亿参数代码模型首次与闭源 SOTA 竞争。

DeepSeek-Coder-V2 的设计围绕一个简单的假设:代码智能的瓶颈不是架构,而是数据规模和领域专注度。V2 没有从头训练新模型,而是从 DeepSeek-V2 的中间检查点出发,继续预训练 6 万亿 tokens(60% 代码、10% 数学、30% 通用语言)。这条路线意味着:通用语言能力可以保留,而代码和数学推理能力可以通过领域数据的持续训练显著提升。

另一个核心信念是 MoE 是代码模型的最佳架构选择。在 DeepSeek-Coder-V2(236B 总参、21B 激活)中,MoE 让模型拥有百亿量级的参数容量(记忆代码模式和语言多样性),同时每个 token 仅激活 21B 参数(推理成本可控)。Lite 版本(16B 总参、2.4B 激活)进一步验证了 MoE 在代码场景的效率优势——2.4B 激活的 Lite 超越了多个 33B Dense 模型。

V2 沿用了 DeepSeek-V2 的架构:MoE 层 + Multi-Head Latent Attention(MLA)。MLA 通过低秩压缩减少 KV 缓存,在长上下文(128K)场景中尤为重要。V2 是首个将 MLA 用于代码模型的实践。

论文明确提到,在从 V2 继续预训练时,出现了训练不稳定问题,原因是指数归一化(exponential normalization)。修复方式很简单:回退到传统归一化。这个细节虽小,但揭示了在 MoE 架构中做架构修改时需要格外小心——小改动可能在万亿级训练中放大为灾难。

数据构成和过滤策略是 V2 的关键贡献:

  • 代码数据(60%): 从 GitHub + CommonCrawl 爬取,覆盖 338 种编程语言(从 V1 的 86 种大幅扩展)。过滤规则:平均行长 ≤100 字符、最大行 ≤1000、字母字符 ≥25%、HTML 可见文本 ≥20%、JSON/YAML 仅保留 50-5000 字符。过滤 + 近去重后:821B 代码 + 185B 代码相关文本
  • 数学数据(10%): 221B tokens(比 DeepSeekMath 的 120B 翻倍),通过 fastText 种子/迭代管线收集。
  • 通用语言(30%): 从 DeepSeek-V2 数据集中采样。

消融实验(1B 模型)证实了数据质量的价值:在 1T tokens 代码数据上训练,HumanEval 从 30.5%→36.0%(+5.5%);2T tokens 后达到 37.2%。

从 V2 的 16K 上下文扩展到 128K,使用 YaRN(scale=40, α=1, β=32)两阶段训练:

  1. 32K 序列、batch 1152、1000 步
  2. 128K 序列、batch 288、1000 步

结果在 Needle In A Haystack 测试中表现良好——在所有上下文窗口长度上都能正确检索。

V2 是 DeepSeek 系列中较早使用 GRPO 的模型之一。与 PPO 相比,GRPO 不需要 critic 模型,计算成本更低。对齐管线:

  1. SFT: 混合指令数据(20K 代码 + 30K 数学 + 通用数据),总计 300M tokens,1B tokens 训练量。
  2. RL(GRPO): ~40K 代码/数学提示 + 测试用例。关键创新是使用奖励模型替代原始编译器反馈作为 RL 信号——奖励模型经过编译器反馈训练(输出 0-1),但提供更平滑的信号。实验表明,奖励模型在 Leetcode 数据集上显著优于原始编译器反馈
  • HumanEval 多语言平均分 75.3%(14 种语言),仅次于 GPT-4o(76.4%);Java 和 PHP 单项第一
  • LiveCodeBench 43.4%,与 GPT-4o 并列
  • Aider 代码修复 73.7%,所有对比模型(含闭源)中最高
  • Defects4J 21.0%SWE-Bench 12.7%,均领先开源模型
  • MATH 75.7%(vs GPT-4o 76.6%)
  • MMLU 79.2%,与 DeepSeek-V2 通用能力持平(无退化)
  • FIM 代码补全: Lite-Base(2.4B 激活)86.4% 平均分,超越多个更大模型
维度DeepSeek-Coder-V2GPT-4 Turbo (闭源)CodeLlama 34B
参数量 (激活)236B (21B)未知 (~1.7T Dense)34B (Dense)
上下文128K128K16K
代码语言338未知20+
HumanEval88.486-9053.1
开源✅ 可商用
每token成本低 (MoE 21B)高 (Dense)中 (34B)

V2 的范式意义在于:MoE 可以在代码领域以 1/10 的激活参数实现与 Dense 万亿模型相当的代码能力。这为部署成本敏感的代码助手提供了切实可行的工程路线。

  1. 领域持续预训练有效:从通用模型检查点出发,用领域数据继续训练 6T tokens 即可显著提升专项能力,无需从头训练。
  2. 数据过滤规则对代码模型至关重要:V2 的多层过滤(行长、字母比例、JSON/YAML 长度阈值、近去重)贡献了 5.5-6.7% 的 HumanEval 提升。
  3. 奖励模型优于原始编译器反馈:RL 训练时,用编译器反馈训练的奖励模型比直接使用编译信号更好——它提供更平滑的梯度,减轻了测试覆盖不足的问题。
  4. GRPO 是 PPO 的经济替代:省掉 critic 模型,在代码 RL 场景中同样有效。
  5. FIM 训练对小模型有效但对大模型未必:Lite 版本用 FIM(PSM 模式,0.5 比率)获益,但 236B 版本仅用 NTP,可能因为大规模 MoE 已隐式覆盖了填充模式。
  6. 指数归一化的教训:架构修改在万亿级训练前必须彻底验证,小变动可能导致整体不稳定。