Seed-Coder: Let the Code Model Curate Data for Itself
一、引言
-
背景:大型语言模型(LLM)在代码相关任务中表现出色,能显著提升开发者生产力,推动软件行业发展。但现有开源LLM在代码预训练数据构建上多依赖人工筛选,存在可扩展性差、主观偏差风险及维护成本高等问题。
-
研究目标:提出Seed-Coder模型,通过以模型为中心的数据处理流程,减少人工参与,提升代码预训练数据质量,从而增强模型在代码任务上的表现。
-
贡献:Seed-Coder在多个开源模型中取得了最先进的性能,甚至超越了一些规模更大的模型,证明了其在代码生成、补全、编辑、推理和软件工程任务上的优势。
二、预训练
-
数据管道:Seed-Coder的数据管道设计注重效率和成本控制,采用并行处理方式,将不同过滤器解耦,支持增量数据扩展和灵活的管道操作。输入是来自GitHub和网络档案的原始代码数据,输出是经过多步处理的预训练数据,包括文件级代码、仓库级代码、提交数据和代码相关网页数据等类别。
-
数据成分:
-
GitHub数据:作为主要预训练语料库,通过去重、语法检查等预处理步骤,以及基于LLM的质量过滤步骤,筛选出高质量代码文件。利用LLM对代码文件进行评分,过滤掉低质量文件,构建了包含89种编程语言的代码预训练语料库。
-
提交数据:包含开发者集体智慧,通过格式化为代码变更预测任务,利用大规模GitHub提交数据进行预训练,为模型提供密集监督,学习现实世界的代码变更模式。
-
代码相关网页数据:从大规模网络档案中提取代码相关数据,采用预处理和质量过滤机制,确保数据高质量和多样性。包括使用FastText模型和LLM质量过滤器,分别用于识别与代码相关的内容和评估内容质量。
-
高质量数据和长上下文数据:为了进一步提升模型性能和对齐预训练模型与后训练数据的分布,构建了高质量数据集,结合质量评分和迭代训练的fastText模型进行数据筛选。同时,引入长上下文训练,支持长达32K tokens的序列,提升模型对长上下文的理解能力。
-
-
预训练策略:采用Llama 3结构,模型具有82亿参数。预训练消耗了总共6万亿tokens,包括在代码相关网页数据和数学相关网页数据上的初始训练,以及在精心策划的代码数据上的后续训练等阶段。在训练过程中,学习率逐步调整,以优化模型性能。
三、后训练
-
指令模型:通过监督微调(SFT)和直接偏好优化(DPO)提升基础模型适应各种现实任务的能力。在构建SFT数据集时,注重数据的多样性、质量和难度,通过合成数据生成、风格增强等方法,以及基于规则和模型的过滤技术,确保数据质量。同时,采用沙盒验证机制进行自我修正,迭代优化输出。
-
推理模型:利用长链推理(LongCoT)强化学习提升模型在复杂编码任务中的多步推理能力。从基础模型开始,先进行LongCoT热身阶段,再进行基于GRPO的强化学习训练。
四、去污染
为了确保训练数据不受潜在测试数据泄露的影响,对整个训练数据(包括预训练和后训练数据)进行了去污染处理,采用10-gram过滤方法,移除与关键基准数据集存在任何10-gram词重叠的数据。
五、评估
-
基础模型评估:Seed-Coder-8B-Base在代码生成、代码补全和代码推理等任务上表现出色。在HumanEval(+)和MBPP(+)基准测试中,取得了领先的性能;在MultiPL-E基准测试中,超越了其他同尺寸的开源模型;在CRUXEval基准测试中,展现了较强的代码推理能力;在“代码中的针”压力测试中,实现了100%的准确率。
-
指令模型评估:Seed-Coder-8B-Instruct在代码生成、代码推理、代码编辑和软件工程等多个编码任务上进行了全面评估。在MHPP、BigCodeBench、LiveCodeBench等基准测试中,取得了显著优于其他同尺寸模型的成绩,甚至在某些情况下超越了更大规模的模型。
-
推理模型评估:Seed-Coder-8B-Reasoning在LiveCodeBench、IOI和Codeforces等具有挑战性的任务上进行了实验评估。在LiveCodeBench上,经过强化学习训练后,模型的总体pass@1得分显著提高;在IOI和Codeforces评估中,模型得分与一些更大型的模型相当,展现出较强的推理能力。
六、结论、局限性与未来工作
-
结论:Seed-Coder模型家族在多种编码基准测试中取得了最先进的性能,证明了通过LLM自主策划训练数据以提升代码智能和推理能力的可行性。
-
局限性:Seed-Coder主要专注于编码任务,训练时排除了一般网络数据,因此在通用自然语言理解和处理更广泛任务的能力上存在限制。与一些大型模型相比,其预训练的tokens数量较少,导致通用知识和数学知识不足,从而限制了模型的内在理解能力。
-
未来工作:将Seed-Coder视为一个不断壮大的模型家族的基础,未来将在多个模型尺寸上进一步改进编码能力。