比StarCoder更强悍,AI代码助手CodeGeeX2-6B开源,ChatGLM2 为基座

510 阅读4分钟

来源 | 学术头条

ChatGPT、Midjourney、GitHub Copilot 等由 AI 大模型驱动的工具问世以来,越来越多的人开始思考这样一个问题:

在不久的将来,我们的工作机会会被 AI 替代吗?

以创造 AI 模型/工具的程序员为例,来自 GitHub 的数据显示,目前 41% 的代码都是由 AI 生成的。

Stability AI 创始人兼 CEO Emad Mostaque 日前甚至断言, “五年内将不再有(人类)程序员”

尽管目前的代码模型还没有达到超越所有人类优秀程序员的水平,但随着生成式 AI 的飞速发展,这确实是一个值得担忧的问题。

既然打不过,那就选择加入——将代码模型作为我们的“AI编程助手”。

据 GLM 技术团队消息,继去年 9 月发布多语言代码生成模型一代 CodeGeeX 之后,更强大的多语言代码生成模型 CodeGeeX2 来了。据介绍,CodeGeeX2 性能优于 StarCoder,最低只需 6GB 显存,且已开源。团队在官方微信公众号上写道,“我们希望每一位程序员,都能在自己的机器上跑上一个自己的编程助手。”

ChatGLM2 赋能

据官方博客介绍,CodeGeeX2 是多语言代码生成模型 CodeGeeX 的第二代模型,基于 ChatGLM2 架构注入代码实现。

得益于 ChatGLM2 的更优性能,CodeGeeX2-6B 在多项指标上取得了较大的性能提升。与 150 亿参数的 StarCoder-15B 相比,CodeGeeX2-6B 凭借 60 亿参数便实现了近 10% 的优势。

此外,不仅 CodeGeeX2-6B 的代码能力得到了大幅提升,且获得了更优秀的模型特性,做到了更开放,是一个更全面的 AI 编程助手。具体如下:

  • 更强大的代码能力:
    基于 ChatGLM2-6B 基座语言模型,CodeGeeX2-6B 进一步经过了 600B 代码数据预训练,相比一代模型,在代码能力上全面提升,HumanEval-X 评测集的六种编程语言均大幅提升(Python +57%, C++ +71%, Java +54%, JavaScript +83%, Go +56%, Rust +321%),在Python 上达到 35.9% 的 Pass@1 一次通过率,超越规模更大的 StarCoder-15B。
  • 更优秀的模型特性:
    继承 ChatGLM2-6B 模型特性,CodeGeeX2-6B 更好支持中英文输入,支持最大 8192 序列长度,推理速度较一代 CodeGeeX-13B 大幅提升,量化后仅需6GB显存即可运行,支持轻量级本地化部署。
  • 更全面的AI编程助手:
    CodeGeeX 插件(VS Code, Jetbrains)后端升级,支持超过 100 种编程语言,新增上下文补全、跨文件补全等实用功能。结合 Ask CodeGeeX 交互式 AI 编程助手,支持中英文对话解决各种编程问题,包括且不限于代码解释、代码翻译、代码纠错、文档生成等,帮助程序员更高效开发。
  • 更开放的协议:
    CodeGeeX2-6B 权重对学术研究完全开放。

性能全面提升

为了展示新一代多语言代码生成基座模型的优异性能,团队在 HumanEval、HumanEval-X、DS1000 基准上对 CodeGeeX2 进行了测评。数据显示,CodeGeeX2 的代码能力较上一代实现了大幅提升。(评价指标 Pass@k 定义与论文中一致)。

同时,CodeGeeX2 与上一代相比,对部署更加友好。得益于使用 Multi-Query Attention 和 Flash Attention,推理速度更快,且量化后仅需 6GB 显存即可运行。

另外,团队开发了支持 VS Code、IntelliJ IDEA、PyCharm、GoLand、WebStorm、Android Studio 等 IDE 的 CodeGeeX 插件。在插件中,用户可以更直接体验到 CodeGeeX2 模型在提升代码生成与补全、添加注释、代码翻译及技术问答方面开发效率的能力。

另外,官方博客也提供了「快速开始」指南,使用 transformers 即可快速调用 CodeGeeX2-6B:

from transformers import AutoTokenizer, AutoModel  
tokenizer = AutoTokenizer.from_pretrained("THUDM/codegeex2-6b", trust_remote_code=True)  
model = AutoModel.from_pretrained("THUDM/codegeex2-6b", trust_remote_code=True, device='cuda')  
model = model.eval()  
  
# remember adding a language tag for better performance  
prompt = "# language: python\n# write a bubble sort function\n"  
inputs = tokenizer.encode(prompt, return_tensors="pt").to(model.device)  
outputs = model.generate(inputs, max_length=256, top_k=1)  
response = tokenizer.decode(outputs[0])  
  
>>> print(response)  
# language: python  
# write a bubble sort function  
  
  
def bubble_sort(list):  
    for i in range(len(list) - 1):  
        for j in range(len(list) - 1):  
            if list[j] > list[j + 1]:  
                list[j], list[j + 1] = list[j + 1], list[j]  
    return list  
  
  
print(bubble_sort([5, 2, 4, 6, 1, 3]))  

更多 CodeGeeX2 的技术细节,详见官方博客:

github.com/THUDM/CodeG…