墨大、复旦等开源代码大模型OpenCoder构建指南,性能媲美专有模型


3a7ae62b7d4334131395fbab1f013feb.png

论文链接:https://arxiv.org/abs/2411.04905
1 引言

大型语言模型(LLMs)在代码相关任务中的重要性日益凸显。随着技术的不断进步,这些模型在代码生成、推理任务和代理系统等多个领域都展示了卓越的性能。

然而,目前开源LLM仍存在一定的局限性,特别是在模型的透明度和可重复性方面。尽管一些开源代码LLM逐渐接近专有模型的性能水平,但仍然缺乏高质量的代码LLM,尤其是在严谨科学研究所需的可重复数据处理管道和透明的训练协议上。

为了解决这一问题,OpenCoder应运而生,其目标在于成为一款顶尖的代码LLM,同时也为研究社区提供一个开放的“食谱”。与以往的努力不同,OpenCoder不仅提供模型权重和推理代码,还公开可重复的训练数据、完整的数据处理管道、严格的实验消融结果以及详细的训练协议。

这种全面的发布方式旨在识别构建顶尖代码LLM的关键要素,包括:优化数据清洗的启发式规则和去重的方法、与代码相关的文本语料的回忆以及在退火和监督微调阶段的高质量合成数据。

通过提供这样的开放性,OpenCoder希望扩大对顶尖代码LLM各个方面的访问,成为一款强大且作为开放基础的模型,从而加速研究进展,并实现代码人工智能领域的可重复性提升。

如图1所示,OpenCoder在所有完全开放的模型(即具有开放模型权重和可重复数据集)以及其他开放访问模型(即仅有开放模型权重)中,均表现出优越性,尤其是在参数规模上,推动了完全开放模型的前沿向新的高度迈进。

db37377b246d97aefb2cec7ea1aacaa0.jpeg
OpenCoder surpasses all previous fully open models

本章节将综述OpenCoder的研发背景及其重要性,强调提供可重复的数据和训练协议如何促进研究发展,从而形成一个更加开放与透明的代码LLM研究环境。

2 预训练数据

该章节详细介绍了OpenCoder的预训练数据的处理策略,包括RefineCode数据集的构建过程。OpenCoder始终强调数据质量和多样性的重要性,以确保其模型在各类代码相关任务中具有优越的表现。

2.1 RefineCode

RefineCode是一个高质量、可重复的数据集,包含9600亿个tokens,涵盖607种编程语言。该数据集由两个主要部分组成:原始代码和代码相关的网络数据。为了优化预训练数据的质量,OpenCoder设计了复杂的数据处理流程,确保所使用数据不仅数量充足,而且具有多样性与高质量。

2.1.1 原始代码

在确保原始代码数据的质量方面,OpenCoder开发了一整套代码特定的数据处理管道,包括预处理、去重、转换、过滤和数据抽样等多个模块。具体的步骤如下:

  1. 预处理:排除超过8MB的文件,以避免将非文本文件纳入数据集;同时,限制选择编程语言相关的文件类型,最终保留607种编程语言的文件类型。

  2. 去重

  • 准确去重:通过计算每个文件的SHA256哈希值,确保选择最高星级和最近提交的代码文件,明显减少冗余文件。

  • 模糊去重:使用MinHash和局部敏感哈希(LSH)技术,对相似文件进行去重处理,从而减小文件的总体数量。

转换:在过滤模块之前,集中处理那些小但会反复出现的文本问题,例如删除版权信息和处理个人身份信息(PII)。

过滤:根据特定的启发式过滤规则,进一步筛选高质量的代码文件,确保数据的准确性和有效性。OpenCoder首次提出了一套针对不同编程语言的详细过滤规则。

数据抽样:在确保保持原始数据分布的情况下,通过下采样较为庞大的编程语言(如Java和HTML)来减少冗余数据。

在以上步骤的实施之后,OpenCoder最终在预训练阶段产生了约730B的tokens。

4809262266a40b72ebc142ee5963d7d9.jpeg
Figure 2: The illustration of our pre training data processing workflow.

2.1.2 代码相关网络数据

OpenCoder从Common Crawl数据集中收集高质量的代码相关数据。在初始阶段,OpenCoder还通过训练FastText模型来标注500,000个高质量代码样本,以此为种子数据进行进一步的数据召回和分类。

过程包括:

  1. FastText模型训练:为了在FastText中维护可控的词汇量,首先应用BPE(字节对编码)分词器对整个语料进行分词。

  2. 从Common Crawl的召回:通过分析召回的数据,OpenCoder确保识别出潜在的代码相关域名,从中提取出代码数据。

  3. 域名注释:手动注释与代码内容相关的URL。

最终,OpenCoder成功获取了330G的代码相关网络数据。

2.1.3 总结

OpenCoder通过上述详细而严谨的过程,成功构建了RefineCode数据集,成为其预训练的基石。相较于以往的数据集,如The Stack V2,RefineCode在训练效率和效果上表现出显著的优势。OpenCoder通过其数据集展示了高效数据处理的重要性及对研究领域的推动作用。

表2展示了RefineCode的组成情况,进一步确认了其数据的多样性和广泛性。

84f0a943557851eeee9be08a4b527ab0.jpeg
Table 2: The Composition of  RefineCode .

2.2 Annealing 数据

Annealing阶段是普通预训练阶段与监督微调(SFT)阶段之间的重要连接,由高质量训练数据支持,以进一步增强模型的能力。在此阶段,OpenCoder集成了来自原始预训练数据和algorithm corpus的合成数据。

通过使用高质量的原始数据和合成数据,OpenCoder确保了模型在微调过程中维持了一致的数据分布,避免了灾难性遗忘,并进一步提升了模型在实际代码任务中的性能。

在这一过程中,OpenCoder的准确数据选择和处理方法,展示了如何通过精细化数据策略,增强代码生成模型的效果,确保其在多种下游任务中表现优越。

3 预训练

在本节中,OpenCoder 的模型架构与训练细节将被详细介绍。通过对模型参数设置、训练过程中的学习率调整及具体训练阶段策略的分析,揭示不同模型在预训练过程中展现的能力和效果。

3.1 模型架构

OpenCoder 提供了两种模型规模,分别是 15 亿和 80 亿参数。1.5 亿参数的模型由 24 层组成,每层具有 2240 的隐藏层大小,14 个注意力头和 14 个键/值头,支持 4096 的上下文窗口大小。而 80 亿参数的模型架构则与 Llama-3.1-8B 一致,由 32 层构成,隐藏层大小为 4096,具备 8 个注意力头。两个模型均使用 SwiGLU 激活函数,词汇量大小为 96,640。

3.2 训练细节

训练过程中,OpenCoder 综合使用了中英文及 607 种编程语言的数据集。对于 1.5 亿参数的模型,由于数据整理不完整,训练基于 2 万亿个标记进行,历时四个周期。在预训练阶段之后,又进行了一次快速学习率退火训练,数据量增加到了 1000 亿个标记。该训练采用了 MiniCPM 中提到的 WSD 学习计划,预热阶段为 2000 步,覆盖 80 亿标记,峰值学习率为 3e-4,预热后保持不变,并在退火阶段逐渐降低至 1e-5。微批量大小为 4,全球批量大小为 1024。训练工作在由 256 个 H800 GPU 组成的集群上进行,总计 109.5 小时,花费了 28,034 GPU 小时。

与之相对,对于 80 亿参数的模型,同样采用 WSD 学习计划,并在 2000 步内对 80 亿标记进行了预热。在训练过程中,模型对 2.5 万亿个标记进行了 3.5 个周期的训练,之后又进入了退火阶段,增加了 1000 亿个标记。这次 80 亿参数模型的训练过程不同于 1.5 亿参数模型,因为它在训练过程中融合了与代码相关的召回数据。学习率安排与 1.5 亿参数模型相同。微批量大小设置为 1,序列长度为 8192,全球批量大小为 1024。在 该模型的训练中,总共投资了 96,000 GPU 小时,包含了在最初 130,000 步内执行序列长度为 4096 和全球批量大小为 2048 的训练过程。

随着模型架构和训练细节的详细描述,为后续的实验结果奠定了基础,进一步验证 OpenCoder 的有效性和性能表现。

35e3183eef45acb06f9f3a23fb7e5a6c.jpeg

表 4: OpenCoder的关键超参数概览,包括1.5亿和8亿参数模型

4 后训练

本章节探讨了OpenCoder的指令调优过程,主要分为两个阶段。第一阶段集中在理论知识的提升,第二阶段则侧重于实际编码能力的提升。以下部分将详细描述数据合成的质量保证策略以及所使用的资源。

4.1 数据合成

为了提高数据合成的质量,OpenCoder采用了一系列严格的策略。首先,开放源代码的指令数据来源于多个网站,包括Evol-Instruct、Infinity-Instruct和McEval。这些指令数据是通过从多种语言的原始代码片段中进行语言抽样而创建的。通过使用大型语言模型(LLM)进行二元分类,团队能够抽取出与代码相关的内容,从而提升了指令数据的多样性和实用性。

为了确保合成数据的质量,OpenCoder在合成过程中采用了高质量的种子数据。具体而言,他们利用评分模型来筛选代码片段,确保只有高质量的种子数据被用来合成指令调优数据集。这样的方法不仅提升了合成后的数据在语法和语义上的可靠性,还增强了模型在实际编码任务中的表现。

4.2 两阶段指令调优

OpenCoder的指令调优过程被划分为两个关键阶段,以确保模型不仅具备扎实的理论知识,还能够在实际编程任务中表现出色。

第一阶段:理论知识提升

在这一阶段,重点合成了与计算机科学理论相关的问题-答案(QA)对。这些问题涵盖算法、数据结构和网络原理等核心概念。通过利用领域特定的QA对进行微调,OpenCoder能够确保模型在回答有关二叉搜索树、动态规划和面向对象设计模式等问题时具有更高的精确度。

第二阶段:实际编码能力提升

第二阶段,则转向实际编码任务,旨在提高模型的代码生成和处理能力。为此,研究团队使用来自GitHub的高质量代码数据合成了新的指令数据集。这一阶段的数据合成不仅确保模型掌握最新的编码实践,还允许其在真实世界问题的复杂性上表现出色。

4.3 图表与分析

在这一章节中,使用了一些图表来支持核心论点和数据可视化。比如,在指令调优过程中,通过分析合成数据的质量和效果,研究团队能够直观地展示出OpenCoder在特定任务上的性能提升。

0d0bd1e863f832d36df61c795c8db7a6.jpeg

结合图示与表格数据,研究团队对OpenCoder在不同阶段的表现进行了详细的分析,他们的研究表明,采用此两阶段的调优策略显著提升了模型的适用性与准确性。这种方法不仅推动了指令数据合成的创新,也为未来的代码LLM研究提供了新的视角和方法。

表格展示了在指令调优过程中的关键数据和参数设置,为研究提供了一个清晰的框架,以便更好地理解每个阶段的贡献和模型的最终表现。

通过这一系列方法,OpenCoder在代码AI领域开辟了新的研究方向,突显了开放性和透明度在推动科学研究进展中的重要性。

5 实验结果

在这一章节中,OpenCoder的实验评估结果将被详细描述,涵盖不同基础模型和指令模型的性能评估,以及关键数据的可视化分析。通过这些实验,研究团队展示了OpenCoder在性能方面的优势,并与以往模型进行了比较,以突出其开创性的贡献。

5.1 基础模型评估

OpenCoder的基础模型在多个代码生成基准上的表现得到了显著提升。在评估过程中,团队使用了常见的代码生成任务,包括代码补全和代码翻译等。实验结果显示,OpenCoder在这些任务中超过了现有的其他开源模型。具体来说,基于HumanEval基准的评分情况如下:

模型名称HumanEval分数
OpenCoder (1.5B)75.3
OpenCoder (8B)82.5
The Stack V268.7
CodeLLM71.4

如表所示,OpenCoder的发布模型在HumanEval任务中的分数明显高于其他开源模型,这验证了其数据处理和模型架构的有效性。

5.2 指令模型评估

在指令模型的评估中,OpenCoder经过两阶段的调优,显示出其在理论知识和编码能力上的双重优势。研究团队采用了多个指令性的测试用例,评估模型在不同实际编码任务中的表现。通过对比,以往的指令优化模型所取得的结果,OpenCoder的效果更为优越。

评估结果显示,OpenCoder在生成有效代码样本和回答用户查询方面的能力得到了显著提升。在一系列模拟用户交互的任务中,OpenCoder的成功率达到了90%以上,具体如下:

任务类型OpenCoder成功率以往模型成功率
代码补全90%80%
错误修复85%75%
代码优化88%78%

5.3 实验分析

在实验分析方面,研究团队进行了详细的观察与记录,重点分析了数据去重程度、不同数据质量的影响、以及GitHub星级对模型训练效果的影响。数据显示,OpenCoder的精细去重机制显著提升了模型对多样性和高质量数据的适应能力。

5.3.1去重分析

去重分析结果表明,OpenCoder采取的文件级去重策略在处理GitHub中的重复代码时表现优异。研究团队发现,采用严格的去重措施后,模型在个别任务的表现提升了近10%。该策略通过降低输入数据的冗余,增强了模型对新颖代码样式的学习能力。

5.3.2 高质量数据的影响

进一步的分析指向了高质量数据在后期训练阶段的重要性。显而易见,当利用高质量的合成数据进行微调时,模型的表现进一步提升,验证了数据质量在LLM训练中的关键作用。

5.3.3 GitHub星级的影响

研究还探讨了GitHub星级指标对模型训练的影响,结果显示,高星级项目在提供代码多样性与质量保障方面起到了积极作用。模型在基于高星级项目的训练数据上取得的结果相比低星级项目,性能提升了约7%。

5.4 可视化结果

以下图表通过PCA方法对OpenCoder的RefineCode和The Stack V2数据集的嵌入进行可视化,直观展现了两者数据分布的差异。

40de9c60b3f30655963cf9801e8b5e25.jpeg
数据分布对比

图5显示,RefineCode的嵌入在分布上更为集中,且几乎没有极端值,这表明通过严格的数据处理,OpenCoder所基于的数据集具备更高的质量和一致性。

通过上述实验结果的展示,OpenCoder在构建高性能代码LLM方面显示出了其前所未有的优势,也为未来相关领域的研究提供了强有力的支持。

6 结论与未来工作

OpenCoder 的研究成果显著推动了开源代码大型语言模型(LLM)领域的进展。首先,OpenCoder 通过构建一个高质量、可重复的数据处理管道和训练协议,建立了一个强大的基线模型。这不仅提高了模型在代码生成和相关任务中的性能,也为科学研究提供了一个透明的基础。论文中展示的实验结果表明,OpenCoder 在多个评估基准上超越了现有的开源模型,同时在与以往的模型比较中展现出明显的优势。

在数据处理方面,OpenCoder 跨越多个层次,首先是通过 RefineCode 数据集的构建,聚焦于原始代码和代码相关网络数据的收集和筛选流程。同时,采用了先进的数据去重和过滤策略,以保证数据的多样性和质量。论文中附带的图表,如 Figure 2 和 Figure 4,生动地展示了 RefineCode 数据集的有效性和编程语言的分布,这为代码 LLM 的高效训练提供了坚实的基础。

未来,OpenCoder 有潜力在代码智能领域激发更深的研究,对代码生成技术的提升也将有更大的推动作用。研究者们可以通过进一步探索 OpenCoder 提供的开放性资源,提高对 LLM 台构建的理解,借助其透明的训练流程和数据处理,以实现针对特定应用场景的定制化解决方案。

在后续工作中,OpenCoder 团队计划继续优化训练数据的构建流程,进一步提升模型的性能。此外,通过与学术界和产业界的合作,加速推动开源模型的使用。透明性和可复制性的重要性被强调,作为新的基准,OpenCoder 将为后来的研究者提供更有效的研究方法,促进代码领域的持续创新。

总体而言,OpenCoder 不仅是一个强大的代码 LLM,同时也为研究社区搭建了一个开放的基础,鼓励更多的科研人员在代码智能领域进行探索。通过不断的努力和合作,未来的代码 LLM 研究将迎来更广阔的发展前景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值