- 论文标题: CodeGemma: Open Code Models Based on Gemma
- 机构: Google LLC
- 论文链接: https://arxiv.org/pdf/2406.11409.pdf
CodeGemma模型概述
CodeGemma是基于Google DeepMind的Gemma模型系列(Gemma Team et al., 2024)开发的一系列开放代码模型。这些模型继承了Gemma预训练模型的基础,并在此基础上进一步训练,使用的数据主要是代码,训练数据量在5000亿到1000亿token之间。CodeGemma模型在代码完成和生成任务中达到了最先进的性能,同时在大规模情况下仍保持强大的理解和推理能力。
CodeGemma发布了三种模型:一个7B的代码预训练模型,一个7B的指令调优代码模型,以及一个专门为代码填充和开放式生成训练的2B模型。这些模型的系谱在文中的图1中有所展示。
在发布的第一个版本(v1.0)中,包括了所有三种模型,随后在一个月后的第二个版本(v1.1)中,对预训练的2B模型和指令调优的7B模型进行了更新。如果速度不是关键考虑因素,建议使用v1.1版本,因为它在质量上有较好的平衡提升。
模型训练和数据处理
1. 数据处理和预训练
所有CodeGemma v1.0模型都是在主要由英语网页文档、数学和代码组成的5000亿token数据上进一步训练的。2B v1.1模型则在1万亿token上训练。所有2B模型都是100%使用代码训练的,而7B模型则是80%代码和20%自然语言的混合。我们的代码语料库来源于公开可用的代码仓库。数据集经过去重和过滤,以移除评估代码中的污染以及某些个人和敏感数据。除了Gemma的处理步骤外,我们还为代码数据执行了额外的预训练步骤。
2. 指令调优
指令调优的7B v1.1模型与其1.0版本不同之处在于使用的强化学习算法(基于Gemma 1.1)和合成数据生成的具体细节。这些模型都遵循以下的一般方向。
为了提高模型与现实世界应用的一致性,我们通过将代码仓库中最相关的源文件共同定位,并尽最大努力将它们分组到相同的训练示例中来创建训练示例。具体来说,我们采用了两种启发式方法:基于依赖图的打包和基于单元测试的词汇打包。
为了构建依赖图,我们首先按仓库对文件进行分组。对于每个源文件,我们从顶部N行中提取导入,并执行后缀匹配以确定在仓库结构中最长的匹配路径。我们确定文件之间的边缘重要性(一种启发式测量),并移除不重要的边缘以打破循环依赖(在Python中常见)。然后,我们计算图中所有对的最短路径,其中较短的距离表示文件关系更强。最后,我们使用拓扑排序对文件图进行线性化,选择基于到已排序节点的最小距离的下一个无父节点,并使用字典顺序来打破平局。
模型性能评估
1. 代码完成和生成任务的性能
CodeGemma模型在代码完成和生成任务中表现出色。特别是,2B预训练模型在代码完成任务中表现突出,其低延迟特性对于需要快速响应的用例非常关键。此外,7B模型在代码生成任务中也显示了强大的性能,尤其是在多语言代码生成方面,如BabelCode测试所示(表4)。这些模型在HumanEval和Mostly Basic Python Problems基准测试中的表现(表3)进一步验证了其优越性。
2. 自然语言理解能力
CodeGemma模型保留了基础Gemma模型的自然语言处理能力。在自然语言理解方面,CodeGemma的表现优于多个同类模型,例如Mistral 7B和Llama-2 13B模型。这一优势体现在多个自然语言处理基准测试中,如BoolQ和PIQA(Clark et al., 2019; Bisk et al., 2019)。这些能力使得CodeGemma模型不仅在代码相关任务,也在需要理解和生成自然语言的任务中表现出色。
3. 数学推理能力
CodeGemma模型在数学推理能力方面也显示出卓越的性能。通过在多个数学数据集上进行训练,如Math Dataset和MathQA,模型的数学问题解决能力得到了显著提升。这些数据集包括从数学竞赛中收集的问题以及基于程序生成的代数问题,这些训练帮助模型在复杂的数学推理任务中表现优异(表5)。
实际应用和部署
CodeGemma模型的设计使其非常适合在实际应用和部署中使用。2B模型由于其快速的代码填充能力,特别适合集成到集成开发环境(IDE)和本地环境中。这一模型在内存和响应速度方面的优化,使其成为开发者的有力工具。
7B模型则因其在代码任务和自然语言理解任务中的强大表现,更适合部署在托管环境中,如云计算平台。这些模型在处理大规模和复杂的代码生成和理解任务时,能够提供高质量的输出。
在部署这些模型时,需要注意的是,应选择合适的输出停止策略以适应部署环境。例如,可以使用生成FIM哨兵令牌的方法来截断输出,以确保生成的代码质量和一致性。
总之,CodeGemma模型系列通过在代码生成、自然语言理解和数学推理等多个方面的出色表现,为各种实际应用场景提供了强大的支持。
模型的优势和局限性
1. 模型的优势
CodeGemma模型在代码生成和理解方面展现出了显著的优势。这些模型不仅在自然语言处理任务中保持了强大的性能,而且在数学推理方面也显示出了卓越的能力。例如,CodeGemma 7B模型在多种编程语言的代码生成任务中表现优异,这一点在BabelCode的评估中得到了验证(见表4)。此外,这些模型在处理大规模代码数据集时,能够有效地进行代码补全和生成,特别是2B预训练模型在低延迟场景下表现出了极高的效率,这对于集成开发环境(IDEs)等应用场景非常关键。
2. 模型的局限性
尽管CodeGemma模型在多个方面表现出色,但它们也存在一些局限性。首先,尽管7B模型在代码任务中表现优异,但其在推理时需要较大的内存,这可能限制了它们在资源受限的环境中的应用。此外,根据Gemma团队的报告,所有模型都在处理某些特定类型的代码或语言结构时存在一定的局限性,尤其是在跨文件代码依赖关系的自动补全方面。此外,虽然模型在数学问题解决方面表现良好,但在一些高难度的数学问题上,模型的解决能力仍有待提高。