IBM巨献:用于代码智能的Granite Code系列开放基础模型
一直以来,IBM研究院以其深厚的技术积累和创新精神走在科技前沿。作为全球领先的技术研究机构之一,IBM研究院不仅在传统计算机科学领域取得了丰硕成果,更在人工智能、量子计算、云计算等新兴领域展现了其强大的研发实力和前瞻性视角。特别是在人工智能领域,IBM研究院推出的多项创新技术和产品,如著名的问答系统“沃森”(Watson),已经成为业界的标杆,推动了整个行业的进步。
近年来随着软件开发过程的复杂化,代码智能成为了提高开发效率、降低错误率的关键技术。自2023年开始,IBM研究院推出了Granite Code模型系列,这是一系列开放基础模型,旨在提升代码智能水平,辅助开发者更高效地完成编程任务。Granite Code模型系列通过深度学习技术,能够理解和生成代码,帮助修复漏洞,解释和文档化代码,维护代码库等,其应用潜力巨大。
最新Granite Code模型系列的推出,不仅是IBM研究院在人工智能领域的又一重要贡献,也预示着代码智能技术的新发展方向。这些模型的开放性,使得更广泛的开发者和研究者能够利用这些先进的工具,共同推动软件开发领域的创新。可以预见,Granite Code模型系列将在提高软件开发质量、加速软件创新进程等方面发挥重要作用,对整个IT行业产生深远影响。
01.背景与动机
随着软件系统的不断增长和复杂化,开发者面临着越来越多的挑战,包括代码质量控制、缺陷检测、以及维护成本的上升。在这样的背景下,代码智能技术的发展显得尤为重要,它能够帮助开发者提高效率,减少错误,从而加速软件开发进程。
开放基础模型(Open Foundation Models)的出现,为软件开发带来了革命性的影响。这些模型通过大规模的数据训练,能够理解和生成代码,辅助开发者完成从代码编写到调试的各个环节。它们的开放性质意味着更多的开发者和研究者可以共同参与到模型的改进和应用中,推动了整个行业的创新。
IBM研究院推出的Granite Code模型系列,是在这一背景下的重要创新。这些模型不仅覆盖了116种编程语言,而且在大小上从3亿到340亿参数不等,适用于从复杂的应用程序现代化任务到内存受限的设备上的使用。Granite Code模型系列的创新点在于其强大的代码理解和生成能力,以及在代码修复、解释和文档化等多个方面的应用潜力。研究动机则是为了解决软件开发中的实际问题,如提高代码质量、降低维护成本,以及加速开发进程。(链接:https://github.com/ibm-granite/granite-code-models)
图1:Granite-8B-代码(基本/指令)与HumanEvalPack上类似大小的其他开源(代码)LLM的比较(Muennighoff et al.,2023),涵盖3个编码任务和6种编程语言。
Granite Code模型的主要优势包括:
·全能代码LLM:Granite Code模型在不同类型的代码相关任务上实现了有竞争力或最先进的性能,包括代码生成、解释、修复、编辑、翻译等,展示了其解决多样化编码任务的能力。
·值得信赖的企业级LLM:所有模型都是在IBM的AI伦理原则指导下,使用许可允许的数据进行训练的,由IBM的法律团队指导,以确保企业可信赖地使用。所有Granite Code模型都在Apache 2.0许可下发布。
02.模型架构
Granite Code模型系列的设计理念是为了解决软件开发中的多样化问题,包括但不限于代码生成、缺陷修复、代码解释、文档生成以及代码库维护等。
表1:Granite Code模型的模型配置。
技术架构的核心在于Granite Code模型是基于变压器(Transformer)架构的解码器模型。这种架构已经在自然语言处理领域证明了其有效性,特别是在处理长序列数据时。Granite Code模型采用了深层的网络结构,这使得模型能够捕捉到编程语言中的复杂模式和依赖关系。模型的深度和宽度,即其层数和每层的宽度,都是经过精心设计的,以确保模型能够处理各种规模的代码,从简单的脚本到复杂的系统级应用程序。
Granite Code模型有两个主要变体,分别是基础模型(Granite Code Base)和指令跟随模型(Granite Code Instruct),后者通过结合Git提交与人类指令以及开源合成代码指令数据集进行微调。基础模型经过两阶段训练策略从头开始训练:第一阶段,模型在116种编程语言中训练了3到4万亿个token,以确保对编程语言和语法有全面的理解;第二阶段,模型在5000亿个token上进一步训练,这些token是从代码和自然语言领域精心设计的高质量数据混合而成,以提高模型的推理能力。指令模型是通过在CommitPack、OASST、HelpSteer和开源数学数据集(包括MathInstruct和MetaMathQA)上进一步微调上述训练好的基础模型得到的,包括用于提高指令跟随和推理能力的合成代码数据集。
图2:Granite34B代码有效训练的深度升级概述。我们利用1.6T令牌后的20B模型,在不改变训练和推理框架的情况下,用相同的代码预训练数据开始训练34B模型。
在一系列综合性基准测试中对代码LLM进行了广泛评估,包括HumanEvalPack、MBPP(+)、RepoBench、ReCode等。这些基准测试涵盖了许多不同类型的编码任务,不仅仅是Python中的代码合成,还包括代码修复、代码解释、代码编辑、代码翻译等,涵盖了大多数主要编程语言(Python、JavaScript、Java、Go、C++、Rust等)。研究发现,在开源模型中,Granite Code模型在所有模型大小和基准测试中表现出非常强劲的性能(通常比Granite大两倍的其他开源代码模型表现更好)。此外,由于推理对于解决复杂的问题和任务至关重要,他们还在六个数学基准测试上测试了Granite-8B-Code-Base模型,包括MATH、GSM8K以及具有计算工具访问权限的问题解决,在这些测试中,Granite 8B模型的性能优于大多数最先进的7B或8B LLM。
数据来源和处理是构建有效模型的另一个关键因素。Granite Code模型训练所使用的数据集涵盖了116种编程语言,这些数据来自于公开的代码库、论坛和其他编程相关的文档。在数据预处理阶段,IBM研究院的团队采用了多种技术来清洗和筛选数据,确保模型训练使用的是高质量的数据。例如,他们会移除代码中的重复部分、过滤掉低质量的代码片段,以及排除可能包含敏感信息的数据。此外,数据集还经过了去重和模糊去重处理,以减少训练集中的冗余信息。
参数规模对性能的影响显而易见。Granite Code模型系列包括从3亿到340亿参数不等的模型,这一宽广的参数范围使得模型能够适应不同的应用场景。在参数规模较小的模型中,它们可以被部署在内存受限的设备上,如移动设备和嵌入式系统。而参数规模较大的模型则能够处理更复杂的任务,如大规模的代码库维护和复杂的代码生成任务。模型的性能随着参数规模的增加而提高,但同时也需要更多的计算资源和更长的训练时间。
在模型架构方面,他们基于Transformer解码器架构训练了一系列不同大小的代码模型。对于所有模型架构,他们使用预归一化:将归一化应用于注意力和MLP块的输入。例如,3B模型是Granite-code模型家族中最小的模型,使用RoPE嵌入和多头注意力进行训练。该模型使用带GLU的swish激活函数(也称为swiglu)进行MLP训练。对于归一化,他们使用RMSNorm,因为它在计算上比LayerNorm更高效。3B模型的训练上下文长度为2048个token。8B模型的架构与3B模型类似,但使用了分组查询注意力(GQA),在此规模下提供了模型性能和推理效率之间更好的折衷。他们使用4096个token的上下文长度训练8B模型。
Granite Code模型系列的技术架构、数据处理方法以及参数规模的设计,共同确保了模型在代码智能领域的高性能和广泛适用性。
03.训练与评估
训练过程中采用的方法和技术
Granite Code模型的训练过程采用了最先进的机器学习技术和大规模数据集。模型训练主要分为两个阶段:
1.预训练阶段:在这一阶段,模型使用了大量的代码数据,这些数据覆盖了116种编程语言。通过这种多语言的训练,模型能够学习到不同编程语言的语法和结构特点。此外,预训练还包括了自然语言处理任务,以提高模型对代码注释和文档的理解能力。Granite Code模型经过两阶段训练,第一阶段(仅代码训练):3B和8B模型在包含116种语言的4万亿token的代码数据上进行训练。20B参数模型在3万亿token的代码上进行训练。34B模型在20B模型的1.6T检查点之后的1.4T token上进行训练。第二阶段(代码+语言训练):在第二阶段,他们包括了额外的高质量公开数据,包括技术、数学和网络文档,以进一步提高模型在推理和问题解决技能方面的性能,这些技能对代码生成至关重要。他们在第二阶段训练中为所有模型训练了500B token(80%代码和20%语言数据)。
2.微调阶段:在预训练的基础上,模型会针对特定的编程任务进行微调。这包括代码生成、代码修复、代码解释等多种任务。微调使模型能够在特定任务上达到更高的精度和效率。他们使用因果语言建模目标和填充中间(Fill-In-the-Middle, FIM)目标进行训练。FIM目标的任务是在给定上下文和后续文本的情况下预测插入的token。他们训练他们的模型以在PSM(前缀-后缀-中间)和SPM(后缀-前缀-中间)模式下工作,使用与Starcoder相同的相关格式控制token。
基础设施方面,他们使用IBM的两个超级计算集群Vela和Blue Vela进行训练,分别配备NVIDIA A100和H100 GPU。Vela A100 GPU集群的每个节点都有2×Intel Xeon可扩展处理器,与8×80GB A100 GPU通过NVLink和NVSwitch相连。Vela集群采用RoCE(RDMA over Converged Ethernet)和GDR(GPU-direct RDMA)进行高性能网络通信。同样,Blue Vela集群的每个节点由双48核Intel处理器组成,配备8×80GB H100 GPU。Blue Vela采用3.2Tbps InfiniBand互连,以促进节点之间的无缝通信,以其高吞吐量和低延迟而闻名。此外,Blue Vela采用单独的、专用的InfiniBand存储网络,为每个计算节点提供800Gbps的速度,由多个ESS6000存储设备支持。两个集群为他们的模型提供了可扩展且高效的训练基础设施,可以在数千个GPU上进行训练。他们估计Granite Code模型的预训练碳排放量约为455 tCO2eq,这是基于模型的总能耗和美国国家平均碳强度因子0.423 kg CO2eq/KWh计算得出的,没有考虑数据中心的位置。Blue Vela集群运行在100%可再生能源上,以最小化环境影响。
在训练过程中,IBM研究院采用了多种技术来优化模型性能,包括但不限于:
- 多阶段训练策略:通过分阶段训练,模型能够逐步学习和适应不同的任务和数据集。
- 高质量数据集:精心筛选和预处理的数据集确保了训练的有效性和模型的泛化能力。
- 大规模并行训练:利用IBM的超级计算资源,模型能够在短时间内完成大规模的并行训练。
各种编程语言和任务上的表现
Granite Code模型在多种编程语言和任务上都展现了出色的性能。在代码生成任务中,模型能够准确地生成符合语言规范的代码片段。在代码修复任务中,模型能够识别出代码中的错误并提供修复方案。在代码解释任务中,模型能够清晰地解释代码的功能和逻辑。
在不同编程语言的处理上,Granite Code模型也展现了强大的多语言支持能力。无论是常用的编程语言如Python、Java、JavaScript,还是较少见的语言如Go、Rust,模型都能够提供高质量的代码智能服务。
与其他现有模型的性能对比
与市场上其他的代码智能模型相比,Granite Code模型在多个方面都显示出了优势。例如,与CodeGemma、Starcoder2和Llama3等模型相比,Granite Code模型在代码生成和修复任务上的准确率更高,处理速度更快,且更能适应不同的编程环境和任务需求。
图3:Granite-8B-Code-Instruct、Mistral-7B-Instruct-v0.2、Gemma-7B-IT和Llama-3-8B-Instruction在HumanEvalPack上的性能。
在代码生成方面,他们采用了HumanEvalSynthesize基准测试,该测试将HumanEval基准测试中的Python问题扩展到另外五种常用编程语言,即JavaScript、Java、Go、C++、Rust。他们使用贪婪解码以零样本的方式评估所有模型,对于基础模型使用完成格式,对于指令调整模型使用指令模板。在构建指令调整模型的提示时,他们遵循官方示例提供的格式。他们在HuggingFace模型卡片、GitHub仓库和正式出版物或技术报告中搜索合适的提示格式。
在MultiPL-E基准测试中,他们比较了18种不同编程语言上的所有基础模型,按照Lozhkov等人的方法,以0.2的温度和0.95的top-p采样每个提示的50个完成。从表中可以看出,没有一个单一的模型在所有模型大小的每种语言上都表现最好。与同等大小的开源模型CodeLlama-7B相比,Granite-8B-Code-Base在16/18种编程语言上表现最佳。在中等大小的模型中,Starcoder2-15B表现最佳。在大型模型中,Granite-34B-Code-Base在大多数语言上都比CodeLlama-34B表现更好,展示了其在多种语言上的代码生成效果。
Granite Code模型系列不仅在技术上达到了行业领先水平,而且在开放性和适用性上也为未来的软件开发趋势提供了新的可能性。
04.应用场景
企业软件开发中的应用潜力
Granite Code模型系列的设计初衷是为了提高软件开发的效率和质量。在企业级软件开发中,这些模型可以大幅度减少开发者的重复工作,自动化常规但复杂的编程任务。例如,在维护大型代码库时,Granite Code模型可以自动识别和修复安全漏洞,或者对遗留代码进行现代化改造,这对于保持企业软件的竞争力至关重要。
模型在代码生成、修复、解释方面的实际效果
代码生成:Granite Code模型能够根据开发者的需求生成高质量的代码片段。在实际应用中,开发者可以通过提供功能描述来生成相应的代码,这不仅提高了开发速度,也降低了因手动编码导致的错误。
代码修复:这些模型在识别和修复代码中的缺陷方面表现出色。它们能够理解代码的上下文,自动提出修复建议,甚至直接生成修复后的代码,极大地提高了软件的可靠性和安全性。
代码解释:Granite Code模型还能够对代码进行解释,帮助开发者理解复杂的代码逻辑。这一功能对于新加入项目的开发者来说尤其有用,可以快速上手并参与到项目中。
内存受限设备上的应用前景
随着物联网和移动设备的普及,对在内存受限设备上运行高效AI模型的需求日益增长。Granite Code模型系列中较小的模型可以部署在这些设备上,执行代码分析、缺陷检测等任务,而不会占用过多的计算资源。这使得即使是资源受限的设备也能够利用AI的力量来优化和保障软件质量。
Granite Code模型系列不仅在技术上达到了行业领先水平,而且在开放性和适用性上也为未来的软件开发趋势提供了新的可能性。
05.鲁棒性分析
表16显示了不同模型在每个扰动类别的最差情况RP@1。
表16:RP@1在Recode基准上的性能。接下来对所有模型使用具有贪婪采样的HumanEval基准的扰动版本,以消除随机性效应并实现公平比较。
代码扰动的挑战:在实际的软件开发过程中,代码扰动是常见的问题,它可能源于开发者的错误、外部库的更新或其他不可预见的变化。一个鲁棒的代码智能模型应该能够有效地处理这些扰动,维持其性能不受影响。
Granite Code模型的应对策略:Granite Code模型通过在训练过程中引入各种扰动,提高了模型的鲁棒性。这包括对函数名、文档字符串和代码本身的变化进行模拟,以此训练模型识别和适应这些变化。此外,模型还被设计为能够在不同程度的噪声和扰动下保持稳定的性能。
最坏情况下的性能表现:在ReCode基准测试中,Granite Code模型展现了其在最坏情况下的性能。即使在极端的代码扰动情况下,Granite Code模型也能够保持较高的代码生成和修复准确率。这证明了模型在处理现实世界软件开发中遇到的复杂问题时的可靠性。
性能表现的具体分析
RP@1性能指标:在ReCode基准测试中,RP@1(Robust Pass@1)是衡量模型在面对扰动时是否能正确生成或修复代码的指标。Granite Code模型在不同的扰动类别中都展现了优异的RP@1性能,特别是在文档字符串和函数名的扰动测试中。
图4:Granite代码模型在Berkeley函数调用排行榜上的性能。总体精度随着模型大小的增加而不断提高,这表明大型模型在函数调用能力方面的优势。
图5:Berkley函数调用排行榜上的Granite-8B-Code与CodeLlama-7B。Granite-8B-Code(基本/指导)在所有三个指标上始终优于CodeLlama-7B(基本/指示)。
与其他模型的对比:与市场上其他的代码智能模型相比,Granite Code模型在鲁棒性方面表现出了明显的优势。即使在参数规模较小的模型中,Granite Code模型也能够有效地处理代码扰动,而在参数规模较大的模型中,其鲁棒性更是显著。
06.未来展望
随着技术的发展和市场需求的变化,Granite Code模型预计将在多个方向上进行扩展和深化。模型的参数规模可能会继续增长,以提供更高的性能和更强的泛化能力。模型可能会在特定领域进行优化,例如针对大数据分析、云计算等领域的特定需求。此外模型的应用范围也可能会扩展到代码安全分析、智能代码审查等新的领域。
Granite Code模型的开放性质意味着它们可以不断地进行更新和改进。IBM研究院可能会定期发布模型的更新版本,以纳入最新的研究成果和市场反馈。同时,开发者社区的贡献也可能成为模型改进的重要来源。通过持续的迭代,Granite Code模型将能够保持其在行业中的领先地位。
在处理复杂的软件项目时,长上下文的处理能力对于模型的性能至关重要。未来的研究可能会专注于如何提高模型在长上下文中的表现,例如通过改进模型的注意力机制或引入新的上下文管理技术。此外,针对特定编程语言的专门化模型也是未来研究的一个重要方向。这些专门化模型可以为特定语言提供更高效的代码智能服务,例如针对Python、Java等流行语言的专门化模型。
总结来说,Granite Code模型系列不仅在技术上达到了行业领先水平,而且在未来的发展潜力上也展现了巨大的前景。IBM研究院在这一系列模型上的工作,不仅展示了其在人工智能领域的技术实力,也为软件开发的未来趋势提供了新的方向。这些模型的开放性和多功能性,将使其在推动软件开发自动化和智能化方面发挥重要作用。
参考资料:
1.https://arxiv.org/pdf/2405.04324
2.https://github.com/ibm-granite/granite-code-models
3.https://www.ibm.com/impact/ai-ethics