AI知识库

53AI知识库

学习大模型的前沿技术与行业应用场景


【LLM-code】CodeGemma:基于Gemma的代码大模型
发布日期:2024-04-30 05:42:32 浏览次数: 1901


   

一、结论写在前面   
CodeGemma,这是一系列基于Gemma构建的专业开源代码模型,能够执行各种代码和自然语言生成任务。发布了三个模型checkpoint。CodeGemma 7B的预训练(PT)和指令调整(IT)变体具有非常强大的自然语言理解能力,在数学推理方面表现出色,并且与其他开放模型的代码能力相匹配。CodeGemma 2B是一种先进的代码补全模型,专为在延迟敏感环境中进行快速代码填充和开放式生成而设计。

         

 

二、模型细节  

推出的CodeGemma,这是基于谷歌DeepMind的Gemma模型的一系列开源的代码模型。

CodeGemma模型是在Gemma预训练模型的基础上进一步训练的,主要使用了超过5000亿个代码token,采用了与Gemma模型系列相同的架构。因此,CodeGemma模型在完成和生成任务中取得了SOTA的代码性能,同时在大规模上保持了强大的理解和推理能力。发布了一个7B的代码预训练模型和一个7B的指令调整的代码模型。此外,还发布了一个专门为代码填充和开放式生成而训练的2B模型。这些模型的血统如图1所示。    

image-20240409224946241

         

 

预训练  

训练数据  

CodeGemma模型进一步在来自网络文档、数学和代码的主要英语语言数据中训练了5000亿个token。2B模型使用100%的代码进行训练,而7B模型则使用80%的代码和20%的自然语言混合进行训练。代码语料库来自公开可用的代码存储库。数据集进行了去重和过滤,以消除评估代码和某些个人和敏感数据的污染。除了对Gemma进行的处理外,还对代码数据进行了额外的预训练步骤。    

填充中间的预处理(Preprocessing for Fill-in-the-Middle)  

预训练的CodeGemma模型使用基于填充中间(FIM)任务的方法进行训练,并改进了原始作品中提到的缺点,以及根据经验发现的现有FIM训练模型的系统性问题。相关的格式控制标记列在表1中。模型被训练以同时适用于PSM(前缀-后缀-中间)和SPM(后缀-前缀-中间)模式。图2显示了一个以PSM格式化的示例片段。

多文件打包(Multi-file Packing)  

许多下游与代码相关的任务涉及基于存储库级别的上下文生成代码,而不是单个文件。为了提高模型与现实世界应用的对齐度,我们通过将最相关的源文件放置在代码存储库中,并尽最大努力将它们分组到相同的训练示例中来创建训练示例。具体而言,采用两种启发式方法:基于依赖图的打包和基于单元测试的词法打包。    

为了构建依赖图,首先按存储库对文件进行分组。对于每个源文件,从前N行中提取导入项,并执行后缀匹配以确定存储库结构内的最长匹配路径。确定文件之间的边的重要性(一种启发式测量),并删除不重要的边以打破循环依赖关系(在Python中常见)。然后,在图中计算所有对之间的最短路径,其中较短的距离表示较强的文件关系。最后,使用拓扑排序将文件的图线性化,选择下一个未有父节点的节点,基于到排序节点的最小距离,并使用词典顺序来打破关系。

未被此依赖图方法覆盖的文件在其存储库内按字母顺序排序,单元测试与其实现一起打包(例如,TestFoo.java 与 Foo.java 并排)。

指令微调  

训练数据包括开源数学数据集和合成生成的代码,以及Gemma使用的微调数据集。通过让模型接触数学问题,旨在增强其逻辑推理和问题解决能力,这对于代码生成至关重要。

数学数据集  

为了增强编码模型的数学推理能力,我们对多种数学数据集进行了监督微调,包括:

MATH数据集:这是一套来自竞赛的12500道具有挑战性的数学问题的集合,为训练模型提供了逐步解决方案,用于答案推导和解释生成(Hendrycks等人,2021年)。    

GSM8k 数据集:这是一个包含8500个小学数学问题的数据集。该数据集测试模型的多步推理能力,突显了问题的简单性,但同时也显示出模型的局限性(Cobbe等人,2021a年)。

MathQA 数据集:这是一个大规模的数学文字问题数据集(Amini等人,2019年),其注释是在AQuA数据集(Ling等人,2017年)的基础上构建的。

合成数学数据:这是一个通过编程生成的代数问题数据集,用于提高解决长代数问题的能力。

通过利用这些多样化的数据集,我们让模型接触到广泛的数学问题,增强了它们执行复杂数学推理的能力。我们的训练实验表明,这些数据集显著提升了代码生成的性能。

         

 

   

代码数据集  

有效地对大型语言模型进行指令调整以用于代码生成任务,需要大量的问答对。我们利用合成代码指令数据生成创建了用于监督微调(SFT)和从人类反馈中进行强化学习(RLHF)的数据集。我们采取以下步骤:

示例生成:遵循《OSS-Instruct》论文(Wei等人,2023年)中概述的方法,我们生成了一组自包含的问题-答案对。

后过滤:我们使用一个语言模型来评估生成的问题-答案对的帮助程度和正确性,对问题-答案对进行过滤。

评估  

通过自动化基准测试,在各种领域评估CodeGemma的代码完成和生成性能,以及自然语言理解能力。

填充能力  

人工评估填充  
CodeGemma模型是为了代码补全而训练的。使用Fried等人(2023年)介绍的HumanEval填充基准中的单行和多行指标来评估。在表2中显示了与其他FIM感知代码模型的性能比较。

观察到,我2B预训练模型在代码补全用例中表现出色,低延迟是一个关键因素。它的性能与其他模型相当,而在推理过程中,在许多情况下,速度几乎是其他模型的两倍。将这种加速归因于基础Gemma架构的决策。    

实际评估  
通过在具有跨文件依赖关系的代码中屏蔽随机片段,从模型中生成样本,并使用生成的片段重新测试代码文件来验证我们模型的填充能力,以表明它的表现符合预期,这与Liu等人(2023年)或Ding等人(2023年)的方法类似。由于我们包含了最近提交的开源代码,我们不直接使用评估结果,而是使用具有相同测试方法的内部版本。

除了进行离线评估之外,该模型还在实时编码环境中进行了测试,以评估其性能并将其与当前的谷歌完成模型进行基准测试。

         

 

   

编码能力  

Python编码  
在编码评估中使用的经典基准是HumanEval(和Mostly Basic Python Problems。在表3中呈现了结果。

与基础的Gemma模型相比,CodeGemma模型在编码领域的任务中表现显著更好。

多语言基准   

BabelCode用于衡量CodeGemma在多种流行编程语言上的代码生成性能。结果见表4。    

语言能力   
评估了在各种领域的性能,包括问答、自然语言)和数学推理()。将两个7B模型的结果与调整指令的Gemma 7B模型的结果呈现在图3中。

CodeGemma保留了基础Gemma模型中所见到的大部分自然语言能力。CodeGemma的PT和IT模型在性能上均优于Mistral 7B7.2%和Llama2 13B模型19.1%。此外,在表5中比较了几个7B大小类别的代码模型的GSM8K和MATH分数,结果表明与类似大小的模型相比,CodeGemma在数学推理方面表现出色。

实际考虑因素   
CodeGemma专为在延迟敏感环境中进行实际使用和部署而设计。2B模型比比较集合中的所有模型都要快得多,这对于延迟敏感的应用程序(如代码补全)至关重要。根据评估结果,这种加速并没有带来显著的、可测量的质量妥协——2B模型在代码填充任务中的表现与同类其他开放模型相比表现得同样好甚至更好。因此,CodeGemma 2B非常适合在集成开发环境(IDEs)、本地环境和其他具有内存约束的应用程序中使用。    

7B模型以其强大的性能而闻名,是通用的编码模型,在编码任务方面超过了基线的Gemma模型,同时保持了高水平的自然语言理解能力。在推理期间需要更大的内存要求,使得这些模型特别适合部署在托管环境和对模型质量至关重要的应用程序中。

推理建议  

对于预训练模型,提示应该被格式化为代码补全任务,例如函数完成、文档字符串生成和导入建议。图4展示了一个提示格式的示例,其中文件路径是可选的但建议使用。模型输出的停止策略应该被谨慎选择,以与部署环境保持一致。最直接的方法是在生成FIM(填充中间)哨兵标记时截断,如表1所示。

同样的格式化方式,使用    


53AI,企业落地应用大模型首选服务商

产品:大模型应用平台+智能体定制开发+落地咨询服务

承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业

联系我们

售前咨询
186 6662 7370
预约演示
185 8882 0121

微信扫码

与创始人交个朋友

回到顶部

 
扫码咨询