自 2021 年,OpenAI 推出了 CodeX 以来,大语言模型(Large Language Model,LLM)的发展已经给代码生成工作带来了巨大的变革。作为 LLM 的一个重要分支,代码大模型(Code LLMs)不仅可以自动生成代码,还能够辅助代码审查、错误调试、代码补全等任务,从而大幅减少开发者在重复性劳动上的时间投入,让他们得以专注于创造本身。
不过,在面向代码的 LLMs 中,开源模型依然与最先进的专有模型存在较大差距,其主要原因在于这些专有模型的训练数据集通常为私有数据,限制了研究界在强基线模型构建和深入理解方面的能力。
为了弥补这一不足,来自墨尔本大学、复旦大学等高校的研究人员,联合无限光年推出了完全开放的代码大模型 OpenCoder。将开源代码 LLM 的性能提升至专有模型水平,同时也发布了完整的模型构建过程,旨在为代码 AI 研究的透明化和可重复性提供基础。
相关论文以《OpenCoder:顶级代码大型语言模型的开放手册》(OpenCoder: The Open Cookbook for Top-Tier Code Large Language Models)为题发表在预印本网站arXiv上 [1]。
研究团队的目标在于填补开源代码模型与商业化代码模型在性能与透明度上的空白,因此,团队在论文中提供了完整的可复现数据集与训练方法。
在最初的数据预处理方面,OpenCoder 采用了两类主要数据源:从 GitHub 的公开库中收集的原始代码以及来自 Web 数据库的代码相关的 Web 数据。
首先,研究团队排除了所有超过 8MB 的文件,这些大多数为非文本文件。此外,只保留特定编程语言的文件,这些语言通过文件扩展名进行识别,并参考 GitHub 的 linguist 工具,最终保留了 607 种编程语言文件,以保证数据的多样性和相关性。
为了确保数据多样性并减少偏差,OpenCoder 采用了精确去重和模糊去重的方法,通过 SHA256 哈希值对每个文档进行计算,去除完全相同的文件,同时利用 MinHash 和局部敏感哈希(LSH)方法进一步减少内容相似的文件。在数据清洗中,还去除了无关的版权声明和个人身份信息,并通过一系列启发式规则对数据进行过滤,以确保代码的质量。
为了最大程度利用高质量的数据集,OpenCoder 保留了原始数据的分布特征,但对部分高资源编程语言进行了下采样,例如将 Java 数据从 409GB 下采样至 200GB,将 HTML 数据从 213GB 下采样至 64GB,以减少无信息结构化内容的影响。最终,课题组预训练阶段生成了大约 730B 的 token。
对于与代码相关的 Web 数据,团队通过 Common Crawl 数据集进行高质量数据的抽取,结合 FastText 模型进行自动化的数据标注与筛选,并对域名进行相关性分析和手动注释,最终获取了 330GB 的高质量的网页代码数据集。
至于模型架构及其训练方面,OpenCoder 的 1.5B 参数和 8B 参数这两种规模的模型均采用标准的 Transformer 架构,注意力机制使用多头注意力,以增强对复杂代码结构的建模能力。此外,其采用了旋转位置编码(RoPE)以更好地处理长距离依赖关系,提高对上下文的理解能力。
图丨OpenCoder 的关键超参数概览(来源:arXiv)
然后,团队采用了 WSD(Warmup, Steady, Decay)学习率调度方法,以确保模型在不同训练阶段的稳定性和高效性。训练初期通过 2000 步的 warmup 阶段逐渐增加学习率,达到峰值后在稳定阶段保持较长时间,最后在退火阶段逐渐减少学习率,以实现模型的精细调优。
消融实验的结果说明,使用高质量数据进行退火可以显著提升模型在复杂编码任务中的表现,尤其是在计算预算有限的情况下,精心选择的高质量数据能够更有效地提高模型的效率和稳定性。
训练使用了 Megatron-LM 框架,在 512 个 H100 GPU 上进行分布式训练,以确保在大规模数据上的高效计算。训练 8B 模型的总时间约为 187.5 小时,总 GPU 时数为 96000 小时。
在 OpenCoder 的后训练阶段,团队首先从 Evol-Instruct、Infinity-Instruct 和 McEval-Instruct 等多个数据库中,通过多种语言的采样收集了大量开源的指令语料。接着,再从 WildChat 和 Code-290k-ShareGPT 等数据集中抽取真实用户查询,并使用 LLM 清洗数据,以去除低质量响应。
为进一步提升模型在指令理解和代码生成任务中的表现,OpenCoder 还进行了双阶段的指令微调,分别针对计算机科学理论和实际编码任务进行优化。
在第一阶段,团队重点合成了与计算机科学理论相关的问题-答案 (QA) 对,使模型能够更深入地理解算法、数据结构和网络等理论概念,由此让模型能更精准地回答关于二叉搜索树、动态规划和面向对象设计等主题的问题。第二阶段,研究人员则通过从 GitHub 提取的高质量代码数据集对模型进行微调,以提高其在实际的编码任务上的表现。
为了检验 OpenCoder 的能力,研究人员在多个基准上将它与其他流行的开源模型(如 StarCoder2 、Qwen2.5-Code 等)进行了比较,包括 HumanEval、MBPP 和 BigCodeBench,覆盖了代码生成、代码补全和代码理解等不同编码场景下的任务。结果表明,OpenCoder 在这些任务中始终表现优于这些模型。
例如,在 HumanEval 基准测试中,OpenCoder-8B 的 Pass@1 达到了 68.9%,超过了 StarCoder2-15B 的 46.3%。在 MBPP 基准测试中,OpenCoder-8B 的表现也达到了 79.9%,强于其他同类模型。
此外,在多语言代码生成评估 MultiPL-E 与综合多语言代码评估基准 McEval 中,其表现也同样突出,证实了其较为出色的多语言性能。
值得一提的是,研究团队还发现,使用 GitHub 星标作为数据过滤标准的模型比未使用此标准的模型在代码生成和代码补全任务中的成功率更高,这进一步验证了高质量数据源对模型性能的直接影响。再结合前述去重处理与退火等阶段的分析,这些结果揭示出数据处理、数据质量和训练流程中的关键因素对模型性能的影响。
总结而言,OpenCoder 作为一个完全开源的代码语言模型,不仅将开源代码模型的性能提升至商业化模型水平,也为研究界提供了一套透明、可复现的完整训练材料,有望推动对代码生成技术的进一步发展。
未来,研究团队将继续优化模型和数据,并通过不断地更新和用户反馈的融入,进一步提升模型的适应性和多样性。
相关代码与数据集已在 GitHub 开源(项目地址:https://opencoder-llm.github.io/)。
参考资料:
1. https://arxiv.org/abs/2411.04905
2. https://opencoder-llm.github.io/
排版:刘雅坤