DeepSeek-Coder-V2 — 开源 MoE 代码模型首次逼近 GPT-4 Turbo
DeepSeek-Coder-V2
Section titled “DeepSeek-Coder-V2”发布日期: 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 模型。
关键架构决策
Section titled “关键架构决策”基于 DeepSeek-V2 的 MoE + MLA 架构
Section titled “基于 DeepSeek-V2 的 MoE + MLA 架构”V2 沿用了 DeepSeek-V2 的架构:MoE 层 + Multi-Head Latent Attention(MLA)。MLA 通过低秩压缩减少 KV 缓存,在长上下文(128K)场景中尤为重要。V2 是首个将 MLA 用于代码模型的实践。
修复指数归一化稳定性问题
Section titled “修复指数归一化稳定性问题”论文明确提到,在从 V2 继续预训练时,出现了训练不稳定问题,原因是指数归一化(exponential normalization)。修复方式很简单:回退到传统归一化。这个细节虽小,但揭示了在 MoE 架构中做架构修改时需要格外小心——小改动可能在万亿级训练中放大为灾难。
六万亿 Token 数据工程
Section titled “六万亿 Token 数据工程”数据构成和过滤策略是 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%。
长上下文扩展:YaRN 两阶段
Section titled “长上下文扩展:YaRN 两阶段”从 V2 的 16K 上下文扩展到 128K,使用 YaRN(scale=40, α=1, β=32)两阶段训练:
- 32K 序列、batch 1152、1000 步
- 128K 序列、batch 288、1000 步
结果在 Needle In A Haystack 测试中表现良好——在所有上下文窗口长度上都能正确检索。
GRPO 强化学习对齐
Section titled “GRPO 强化学习对齐”V2 是 DeepSeek 系列中较早使用 GRPO 的模型之一。与 PPO 相比,GRPO 不需要 critic 模型,计算成本更低。对齐管线:
- SFT: 混合指令数据(20K 代码 + 30K 数学 + 通用数据),总计 300M tokens,1B tokens 训练量。
- 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-V2 | GPT-4 Turbo (闭源) | CodeLlama 34B |
|---|---|---|---|
| 参数量 (激活) | 236B (21B) | 未知 (~1.7T Dense) | 34B (Dense) |
| 上下文 | 128K | 128K | 16K |
| 代码语言 | 338 | 未知 | 20+ |
| HumanEval | 88.4 | 86-90 | 53.1 |
| 开源 | ✅ 可商用 | ❌ | ✅ |
| 每token成本 | 低 (MoE 21B) | 高 (Dense) | 中 (34B) |
V2 的范式意义在于:MoE 可以在代码领域以 1/10 的激活参数实现与 Dense 万亿模型相当的代码能力。这为部署成本敏感的代码助手提供了切实可行的工程路线。
可复用的工程经验
Section titled “可复用的工程经验”- 领域持续预训练有效:从通用模型检查点出发,用领域数据继续训练 6T tokens 即可显著提升专项能力,无需从头训练。
- 数据过滤规则对代码模型至关重要:V2 的多层过滤(行长、字母比例、JSON/YAML 长度阈值、近去重)贡献了 5.5-6.7% 的 HumanEval 提升。
- 奖励模型优于原始编译器反馈:RL 训练时,用编译器反馈训练的奖励模型比直接使用编译信号更好——它提供更平滑的梯度,减轻了测试覆盖不足的问题。
- GRPO 是 PPO 的经济替代:省掉 critic 模型,在代码 RL 场景中同样有效。
- FIM 训练对小模型有效但对大模型未必:Lite 版本用 FIM(PSM 模式,0.5 比率)获益,但 236B 版本仅用 NTP,可能因为大规模 MoE 已隐式覆盖了填充模式。
- 指数归一化的教训:架构修改在万亿级训练前必须彻底验证,小变动可能导致整体不稳定。