8月12日,在掘力计划系列第21场《解析大语言模型的训练和应用》活动中,智谱AI的薛宇飞博士应邀作了题为《CodeGeeX:从代码生成模型到AI编程助手》的技术分享。
薛宇飞博士是智谱AI大模型事业部的副总裁,他拥有清华大学计算机系的博士学位和博士后经历,在人工智能领域有多年的研究和产品经验,曾任职于多家顶级科技公司。这次薛博士以自身团队在代码生成模型方面的研究为切入点,详细介绍了从训练一个大规模的通用代码生成模型,到落地产品化并开发IDE插件,最终使广大开发者能够享受到AI编程助手带来的便利。
背景:编程向更简单方向发展
从计算机诞生以来,编程工作就在不断朝着更简单、更符合人的思维逻辑方向发展。早期的机器语言极为复杂难懂,汇编语言相比机器语言提高了可读性和生产效率,然后出现了面向过程和面向对象的高级语言,进一步降低了编程的门槛。近年来,低代码平台的兴起使不专业的开发者也能参与软件开发,AI辅助代码生成技术更是让自动编程成为可能。
自动生成代码的想法随着人工智能技术的进步也在逐步实现。早期主要采用基于规则的方法,2015年第一次有研究将深度学习应用于代码生成,取得了一定进展。2020年, Transformer 架构不仅通过 GPT-3 模型展示它在自然语言生成方面的惊人能力,也开始被应用到了代码生成领域。2021年,OpenAI 推出了规模达到百亿参数的 Codex 代码生成模型,使自动代码生成真正具备实用性。此后,业界纷纷推出自己的代码生成模型和编程助手产品。
CodeGeeX 模型训练
CodeGeeX 项目于2022年1月启动,4月开始正式训练,6月训练完成。训练数据主要来源于公开数据集和 GitHub 高质量代码。公开数据集提供初始训练语料,GitHub 代码经筛选后确保质量。第一版 CodeGeeX 支持23种编程语言,其中 Python、C++、Java 的训练代码量最大。大模型可以从不同语言中学习通用逻辑,不需要语言完全均衡。
原始代码数据需要进行预处理。首先对代码进行分词,然后将每个词转换成对应的ID,得到模型可直接识别的格式。此外,每个代码片段前加语言标识,让模型更好地学习到不同语言的特性。
CodeGeeX 采用GPT结构,包含40个 Transformer 层,参数总量达到130亿。基于GPT的生成方式是顺序生成,每次根据前文预测下一个词。训练过程中团队与华为合作,在华为昇腾910 AI处理器上完成。使用FP16精度、数据并行和模型并行训练技术,经过两个月完成训练。
训练过程中,CodeGeeX团队还与华为昇思 MindSpore 团队的工程师一起对训练框架进行了优化。如通过算子融合等技术,将训练速度提升了2.5倍;加入流水线并行后,整体效率可提升3倍之多。这些成果为后续国产芯片的大模型训练带来借鉴。
模型评测与优化
训练完成后,对模型进行评测与优化才能使其投入实际使用。由于之前针对多语言代码生成模型缺乏科学的评测基准,团队基于HumanEval构建了HumanEval-X评测基准,将其从只支持 Python 扩展到 C++、Java、JavaScript 和 Go 五种语言,可以更全面地评估模型的多语言生成能力。
评测结果显示,CodeGeeX 在 Python 和 Java 上的 Pass@1 指标明显优于对手模型,其他语言也有出色表现,是当时综合表现最优的开源多语言代码生成模型。
为减小模型大小便于实际部署,团队使用量化与推理优化技术。最终模型从 27GB 降低到 15GB,推理速度也提升2倍多。基于上述工作,CodeGeeX 能够在普通 GPU 上流畅运行。
AI编程助手应用
代码生成模型完成之后,团队着手开发 IDE 插件,将模型应用到实际编程过程中。CodeGeeX 插件支持 VS Code 和JetBrains 等主流 IDE。用户可以利用代码补全、生成注释等功能,也可以通过自然语言聊天提问。
代码补全可以智能提示后续代码,语义代码注释可自动添加详细注释,代码翻译可以在多种语言之间转换。这些功能都基于 CodeGeeX 模型或在其基础上进行微调得到。用户可以选择中文或英文注释。新版模型支持更多语言,如 Kotlin、Vue 等。
CodeGeeX 插件可以自动生成复杂SQL查询语句,通过公开SQL练习平台的题目,前20题全部正确,最后10题也有很多正确,达到可助力编程的标准。该插件已经累积15万用户,日活跃2.5万,获得广大开发者认可。
CodeGeeX二代模型升级
今年7月团队推出了第二代模型CodeGeeX2-6B。它 使用 ChatGLM2-6B 作为基底模型,在此基础上使用代码数据进行微调。这样一来,新模型规模减小到6B,但效果显著提升,如 Python Pass@1 提升57%,已超过参数规模更大的 StarCoder 模型。
HumanEval (Pass@1,10,100)
Model | Pass@1 | Pass@10 | Pass@100 |
---|---|---|---|
CodeGen-16B-multi | 19.2 | 34.6 | 55.2 |
CodeGeeX-13B | 22.9 | 39.6 | 60.9 |
Codex-12B | 28.8 | 46.8 | 72.3 |
CodeT5Plus-16B-mono | 30.9 | 51.6 | 76.7 |
Code-Cushman-001 | 33.5 | 54.3 | 77.4 |
LLaMA-65B | 23.7 | – | 79.3 |
LLaMA2-70B | 29.9 | – | – |
CodeGen2.5-7B-mono | 33.4 | 58.4 | 82.7 |
StarCoder-15B | 33.2 | 61 | 84.7 |
CodeGeeX2-6B | 35.9 | 62.6 | 88.3 |
HumanEval-X (Pass@1)
Model | Python | C++ | Java | JavaScript | Go | Rust | Overall |
---|---|---|---|---|---|---|---|
CodeGen-16B-multi | 19.2 | 18.1 | 15 | 18.4 | 13 | 1.8 | 14.2 |
CodeGeeX-13B | 22.9 | 17.1 | 20 | 17.6 | 14.4 | 4.3 | 16 |
Replit-code-v1-3B | 22 | 20.1 | 20.1 | 20.1 | 12.2 | 8.6 | 17.2 |
CodeGen2.5-7B-multi | 30.6 | 24.3 | 29 | 27.5 | 18.9 | 20.1 | 25.1 |
StarCoder-15B | 35.5 | 28.2 | 31.5 | 33.2 | 21.3 | 17.8 | 27.9 |
CodeGeeX2-6B | 35.9 | 29.3 | 30.8 | 32.2 | 22.5 | 18.1 | 28.1 |
CodeGeeX2 继承了 ChatGLM2 的中英文语言理解能力,支持更长的文本序列。此外,支持语言种类从23种提升到上百种。新版模型权重对学术研究完全开放,可在GitHub或Hugging Face上获取权重的下载及使用方式。
结语
综上所述,CodeGeeX 从一个编程语言生成模型发展成一个可供广大开发者使用的AI编程助手,已经走过两年时间。期间团队进行了模型设计、训练、评估、优化、产品化等一系列创新性的工作。先使用 GPT 结构训练出百亿参数规模的通用模型,然后以 ChatGLM 为基础进行调优,使新版模型效果更优。在 IDE 插件中集成代码生成等功能,真正将AI的力量带入到开发的日常之中。
当前 CodeGeeX 插件已经积累大量用户,也获得他们的认可。团队将继续改进产品,以期让编程对所有人来说都更简单、更有效率。大模型编程助手正在成为编程发展的新方向,相信未来必将惠及更多开发者,提升软件开发的生产力。
关于掘力计划
掘力计划由稀土掘金技术社区发起,致力于打造一个高品质的技术分享和交流的系列品牌。聚集国内外顶尖的技术专家、开发者和实践者,通过线下沙龙、闭门会、公开课等多种形式分享最前沿的技术动态。