Files
note_sync/大模型/deepseek/02-代码模型/02-DeepSeek-Coder-V2-2406.11931_abstract.md
T

15 KiB
Raw Blame History

DeepSeek-Coder-V2:打破代码智能领域闭源模型的壁垒

原文标题:DeepSeek-Coder-V2: Breaking the Barrier of Closed-Source Models in Code Intelligence arXiv:2406.11931 | 发布:17 Jun 2024 作者/机构:Qihao Zhu、Daya Guo、Zhihong Shao、Dejian Yang 等(共同一作)+ DeepSeek(深度求索) 原文 PDF:02-DeepSeek-Coder-V2-2406.11931.pdf

一、摘要(全文翻译)

我们提出 DeepSeek-Coder-V2,一个开源的专家混合(Mixture-of-Experts, MoE)代码语言模型,在代码特定任务上取得了与 GPT4-Turbo 相当的性能。具体而言,DeepSeek-Coder-V2 是从 DeepSeek-V2 的一个中间检查点出发、使用额外 6 万亿 token 进一步预训练得到的。通过这一持续预训练,DeepSeek-Coder-V2 大幅增强了 DeepSeek-V2 的编码与数学推理能力,同时在通用语言任务上保持了相当的性能。与 DeepSeek-Coder-33B 相比,DeepSeek-Coder-V2 在代码相关任务的各个方面、以及推理与通用能力上都展现出显著进步。此外,DeepSeek-Coder-V2 将其支持的编程语言从 86 种扩展到 338 种,同时把上下文长度从 16K 扩展到 128K。在标准基准评测中,DeepSeek-Coder-V2 在编码与数学基准上取得了优于 GPT4-Turbo、Claude 3 Opus 和 Gemini 1.5 Pro 等闭源模型的性能。

二、核心贡献

  1. 两个规模的 MoE 代码模型:基于 DeepSeekMoE 框架发布 16B 与 236B 两个版本,激活参数分别只有 2.4B 和 21B,二者均支持 338 种编程语言与最长 128K token 上下文。
  2. 首个开源百亿级参数以上的代码模型:作者称这是首次尝试研发开源的千亿参数级代码模型;实验结果显示 236B 版本在编码与数学任务上均超过 GPT4-Turbo、Claude 3 Opus、Gemini 1.5 Pro 等当时最强的闭源模型。
  3. 面向代码与数学的持续预训练配方:在 DeepSeek-V2 中间检查点(已训 4.2T token)之上追加 6T token(60% 代码 + 10% 数学 + 30% 自然语言),总训练量 10.2T token,兼顾代码/数学强化与通用语言能力不退化。
  4. 多语言与长上下文大幅扩展:支持语言从 86 种增至 338 种,上下文从 16K 扩到 128K;语言扩展经 1B 模型消融验证有效(HumanEval 30.5%→37.2%,MBPP 44.6%→54.0%)。
  5. 代码场景的 RL 对齐:用编译器反馈与测试用例构造偏好数据训练奖励模型,再以 GRPO 做强化学习;在内部 LeetCode 测试集上奖励模型信号明显优于原始编译信号。
  6. 全面刷新开源模型成绩:HumanEval 90.2%、MBPP+ 76.2%(EvalPlus 流程下新的 SOTA)、LiveCodeBench 43.4%,并成为首个在 SWEBench 上超过 10% 的开源模型。
  7. 宽松许可开源:模型按宽松协议公开发布,允许研究与无限制的商业使用。

三、方法与技术要点

3.1 数据收集与语料构建

预训练语料由 60% 源代码、10% 数学语料与 30% 自然语言语料组成;自然语言部分直接采样自 DeepSeek-V2 的训练数据,因此论文重点说明代码与数学数据的采集、清洗与过滤流程。

GitHub 部分只收集 2023 年 11 月之前创建的公开仓库,沿用 DeepSeek-Coder 的过滤规则与近似去重:剔除平均行长超过 100 字符或最长行超过 1000 字符、以及字母字符占比低于 25% 的文件;除 XSLT 外,剔除前 100 字符中出现 <?xml version= 的文件;HTML 要求可见文本占比至少 20% 且不少于 100 字符;JSON/YAML 只保留 50–5000 字符的文件。过滤后得到 821B 代码 token(覆盖 338 种语言)与 185B 代码相关文本(如 markdown、issue)。

Common Crawl 部分沿用 DeepSeekMath 的迭代召回流程:以 StackOverflow、PyTorch 文档、math.stackexchange 等站点为初始种子语料训练 fastText 模型,用它召回更多代码/数学相关网页;由于中文等语言无法靠空格分词,改用 DeepSeek-V2 的 BPE 分词器,显著提升召回准确率;把首轮召回网页占比超过 10% 的域名判定为代码或数学相关域,再把这些域内相关的未采集网页补充进种子语料。迭代三次后从网页共获得 70B 代码相关 token 与 221B 数学相关 token(约为 DeepSeekMath 的 120B 数学语料的两倍)。同样的流程在 GitHub 上迭代两次,种子为人工挑选的、含详细描述的高质量代码,另收集 94B 源代码。最终新代码语料共 1,170B token,来自 GitHub 与 CommonCrawl。分词器与 DeepSeek-V2 相同。

为验证新语料质量,作者用 1B 参数模型做消融(表 1):用新语料训练 1T token,HumanEval 从 30.5% 升至 36.0%、MBPP 从 44.6% 升至 49.0%;继续训练到 2T token 后进一步提升到 37.2% 与 54.0%,说明新语料优于 DeepSeek-Coder 所用的代码语料。

3.2 训练策略:下一词预测与中间填充

DeepSeek-Coder-V2 16B 同时使用两个训练目标——下一词预测(Next-Token-Prediction, NTP)与中间填充(Fill-In-the-Middle, FIM);236B 版本只使用 NTP。FIM 采用 PSM(Prefix, Suffix, Middle)模式,在文档级别的预打包阶段把内容重排为「前缀—后缀—中间」的重建序列:


\texttt{<|fim\_begin|>}f_{pre}\texttt{<|fim\_hole|>}f_{suf}\texttt{<|fim\_end|>}f_{middle}\texttt{<|eos\_token|>}

FIM 的使用率为 0.5。这样设计的动因是:IDE 里的代码补全场景往往是「已知前后文、要补中间的空洞」,纯因果语言建模无法直接建模这种结构,而 FIM 让模型学会利用前后文双向线索完成缺省片段。

3.3 模型架构与训练超参数

架构与 DeepSeek-V2 保持一致,16B 与 236B 分别对应 DeepSeek-V2-Lite 与 DeepSeek-V2 的超参设置,激活参数为 2.4B 与 21B。作者提到训练过程中出现过不稳定与梯度尖峰,将其归因于指数归一化(exponential normalization)技巧,于是回退到常规归一化方法。

优化器为 AdamW,$\beta_1=0.9$、$\beta_2=0.95$、权重衰减 0.1;批大小与学习率按 DeepSeek-V2 的设定调整;学习率采用余弦衰减,2000 步预热后逐步降到初始值的 10%。为保持稳健的自然语言理解能力,两个模型都不是从头训练,而是从 DeepSeek-V2 的中间检查点(已训练 4.2T token)继续预训练,因此预训练阶段总曝光量达 10.2T 高质量 token(4.2T + 6T)。

3.4 长上下文扩展

沿用 DeepSeek-V2 的做法,用 YaRN 把上下文长度扩展到 128K,超参与 DeepSeek-V2 相同:缩放系数 $s=40$、$\alpha=1$、$\beta=32$。随后分两个阶段继续训练以增强长上下文能力:第一阶段序列长度 32K、批大小 1152、训练 1000 步;第二阶段序列长度 128K、批大小 288 个序列、再训练 1000 步,并在扩展阶段对长上下文数据比例做上采样。「大海捞针」(Needle In A Haystack, NIAH)测试结果(图 2)显示,DeepSeek-Coder-V2 在直到 128K 的所有上下文窗口长度上都表现良好。

3.5 对齐:有监督微调与强化学习

有监督微调(SFT):为构建 DeepSeek-Coder-V2 Chat,从 DeepSeek-Coder 收集 2 万条代码相关指令数据、从 DeepSeek-Math 收集 3 万条数学数据,并从 DeepSeek-V2 的指令数据中采样若干以维持通用能力,最终形成 300M token 的指令集;训练采用余弦调度、100 步预热、初始学习率 $5\times10^{-6}$、批大小 1M token、总计 1B token。为让模型在微调后仍支持代码补全,16B 版本在基座微调时继续使用 FIM 方法。

强化学习(RL):作者收集了约 4 万条代码与数学提示,每条代码提示都配有测试用例。数学偏好数据直接用 ground-truth 标签获得;代码方面,虽然编译器能给出 0/1 反馈,但部分提示的测试用例覆盖不完全,直接使用这种信号噪声较大且次优,因此论文在编译器数据上训练一个奖励模型,用它在 RL 中提供信号,比原始编译信号更鲁棒、泛化性更好。在内部测试集(Leetcode 与 Leetcode-zh)上奖励模型信号明显优于原始编译器信号(图 3),故后续实验统一使用奖励模型。算法采用与 DeepSeek-V2 相同的组相对策略优化(Group Relative Policy Optimization, GRPO);相比 PPO,GRPO 无需额外维护 critic 模型,成本更低且被证明相当有效。

3.6 评测设置

论文将任务分为编码、数学、通用自然语言三类。HumanEval(164 个 Python 题目,零样本)与 MBPP-Plus 均用贪心搜索并复现基线以保证公平,另把 HumanEval 扩展到 C++、Java、PHP、TypeScript、C#、Bash、JavaScript、Swift、R、Julia、D、Rust、Racket 等语言以测多语言能力。竞赛编程用 LiveCodeBench(训练数据截止 2023 年 11 月前,取 1201-0601 子集)与 USACO(307 题)。仓库级补全用 RepoBench v1.1,只用 2023 年 12 月的数据以避免泄漏。缺陷修复用 Defects4J(挑出 238 个仅需改单个方法的缺陷)、SWE-bench 与 Aider。

四、主要实验结果

基准 / 任务 本模型 对比对象 说明
HumanEval(Python) 90.2%(V2-Instruct 236B/21B) GPT-4-Turbo-0409 88.2%;GPT-4o-0513 91.0% 显著高于 GPT-4-Turbo,仅次于 GPT-4o
HumanEval 多语言平均(19 语言) 75.3% GPT-4o-0513 76.4%;Claude-3-Opus 70.8%;GPT-4-Turbo-0409 72.3% 平均分第二,Java、PHP 单项最高
MBPP+ 76.2% GPT-4o-0513 73.5%;GPT-4-Turbo-0409 72.2% 在 EvalPlus 流程下创下新 SOTA
HumanEval(16B Lite 版) 81.1%(2.4B 激活) DS-Coder-instruct 33B 79.3% Lite 版多语言平均 65.6%,高于 33B 模型的 61.9%
LiveCodeBench(1201-0601,226 题) 43.4% GPT-4-Turbo-0409 45.7%;GPT-4o-0513 43.4%;Claude-3-Opus 34.6% 与 GPT-4o 并列大模型最高,总排名第二
USACO 12.1% GPT-4o-0513 18.8%;GPT-4-Turbo-0409 12.3% 接近 GPT-4-Turbo,仍落后 GPT-4o
SWE-bench 12.7% GPT-4o-0513 26.7%;GPT-4-Turbo-0409 18.3%;Codestral 2.7% 首个超过 10% 的开源模型
Defects4J(238 个单方法缺陷) 21.0% GPT-4o-0513 26.1%;Claude-3-Opus 25.5%;Codestral 17.8% 开源模型中最佳,接近头部闭源模型
Aider(133 个 Python 编辑任务) 73.7% GPT-4o-0513 72.9%;Claude-3-Opus 68.4% 表中最高分,超过所有闭源模型
RepoBench v1.1(Lite-Base 16B) Python 平均 38.9%,Java 平均 43.3% DS-Coder-Base 33B:Python 39.1%、Java 44.8%;Codestral 22B:46.1%、45.7% 2.4B 激活参数即可比肩 33B 模型
FIM 单行填充(平均) 86.4%(Lite-Base 2.4B 激活) DS-Coder-Base 33B 86.4%;Codestral 22B 83.0% Python 80.0%、Java 89.1%、JavaScript 87.2%
CRUXEval-I-COT / -O-COT 70.0% / 75.1% GPT-4o-0513 77.4% / 88.7%;Claude-3-Opus 73.4% / 82.0% 开源模型中最强,但与头部闭源仍有差距
MATH 75.7% GPT-4o-0513 76.6%;GPT-4-Turbo-0409 73.4% 几乎追平 GPT-4o 的 SOTA
GSM8K 94.9% GPT-4o-0513 95.8%;Claude-3-Opus 95.0% 与闭源最强水平接近
AIME 2024 4/30(maj@64 时 5/30) GPT-4-Turbo-0409 3/30;GPT-4o/Claude/Gemini 均 2/30 解出题数多于所有对比模型
Math Odyssey 53.7% GPT-4o-0513 53.2%;GPT-4-1106 49.1% 略超 GPT-4o
MMLU(5-shot) 79.2(236B Instruct) DeepSeek-V2 Chat 78.1;Lite 版 60.1(V2-Lite 55.7) 通用语言能力与 DeepSeek-V2 相当甚至更好
Arena-Hard 65.00(236B Instruct) DeepSeek-V2 Chat 41.60;Lite 版 38.10(V2-Lite 11.40) 推理/代码/数学占比高的主观评测提升明显
MT-Bench / Alignbench 8.77 / 7.84 DeepSeek-V2 Chat 8.97 / 7.91 通用对齐类基准略低于 DeepSeek-V2 Chat

在代码生成上,236B 版本多语言平均分 75.3% 位居第二,仅低于 GPT-4o 的 76.4%,并在 Java 与 PHP 上取得最高分;MBPP+ 的 76.2% 刷新了当时的 SOTA。竞赛编程 LiveCodeBench 43.4% 与 GPT-4o 持平,USACO 12.1% 接近 GPT-4-Turbo 但仍明显落后 GPT-4o 的 18.8%。缺陷修复上 Aider 的 73.7% 超过所有对比模型(含闭源),SWE-bench 的 12.7% 虽为首个破 10% 的开源模型,却与 GPT-4o 的 26.7% 差距显著,作者归因于指令遵循能力不足。数学上 MATH 75.7% 几乎追平 GPT-4o,AIME 2024 解出题数(4/30)多于所有对比模型;CRUXEval 是开源最强但仍落后 GPT-4o,作者认为与 21B 激活参数的限制有关。通用语言方面,236B Instruct 在推理类基准上超过 DeepSeek-V2 Chat,但在 MT-Bench、AlpacaEval 2.0、AlignBench 上略低,归因于后者经过通用目的对齐阶段;16B Lite 版在知识密集型的 TriviaQA 上偏弱,因预训练网页数据量较少。

五、结论、局限与影响

  • 结论:DeepSeek-Coder-V2 从 DeepSeek-V2 出发,用 6 万亿 token 的高质量多源语料继续预训练,在显著提升编码与数学推理能力的同时保持了与 DeepSeek-V2 相当的通用语言性能;相比 DeepSeek-Coder,支持语言由 86 种增至 338 种,上下文由 16K 扩至 128K。实验表明其在代码与数学特定任务上达到与 GPT-4 Turbo、Claude 3 Opus、Gemini 1.5 Pro 等最强闭源模型相当的性能。
  • 局限性:作者自述的主要局限是指令遵循(instruction-following)能力与 GPT-4 Turbo 等当时最强模型仍有明显差距,导致在 SWE-bench 这类复杂场景与任务上表现不佳;此外 CRUXEval 上与闭源大模型的差距被归因于仅 21B 的激活参数限制了学习与求解能力。作者认为代码模型不仅需要强编码能力,还需要出色的指令遵循能力才能应对真实复杂编程场景,未来将重点改进这一点。
  • 影响:论文给出了「通用基座 + 领域持续预训练 + 领域偏好 RL」这一可复制的配方,证明开源 MoE 代码模型可以在代码与数学基准上追平乃至超过闭源旗舰;同时以宽松许可开源(含 16B 轻量版),使 2.4B 激活参数即可比肩 33B 稠密模型的补全与生成性能,对代码补全工具与低成本部署有直接实用价值。

六、关键术语对照表

English 中文
Mixture-of-Experts (MoE) 专家混合
DeepSeekMoE DeepSeek 专家混合框架
Total Parameters (#TP) 总参数量
Active Parameters (#AP) 激活参数量
Next-Token-Prediction (NTP) 下一词预测
Fill-In-the-Middle (FIM) 中间填充
PSM (Prefix, Suffix, Middle) 前缀—后缀—中间模式
Continual Pre-Training 持续预训练
Near-Deduplication 近似去重
fastText fastText(文本分类召回模型)
Byte Pair Encoding (BPE) 字节对编码
YaRN YaRN 上下文扩展方法
Needle In A Haystack (NIAH) 大海捞针长上下文测试
Supervised Fine-Tuning (SFT) 有监督微调
Group Relative Policy Optimization (GRPO) 组相对策略优化
Reward Model (RM) 奖励模型
Repository-Level Code Completion 仓库级代码补全
Instruction-Following 指令遵循