论文阅读_代码生成模型_CodeGeeX

英文名称: CodeGeeX: A Pre-Trained Model for Code Generation with Multilingual Evaluations on HumanEval-X
中文名称: CodeGeeX:一种用于代码生成的预训练模型,并在HumanEval-X上进行多语言评估
链接: https://arxiv.org/abs/2303.17568
代码: https://github.com/THUDM/CodeGeeX 7.6k Starhttps://github.com/THUDM/CodeGeeX2 6.5k Star
作者: Qinkai Zheng, Xiao Xia, Xu Zou, Yuxiao Dong, Shan Wang, Yufei Xue, Zihan Wang, Lei Shen, Andi Wang, Yang Li, Teng Su, Zhilin Yang, Jie Tang
机构: 清华大学, Zhipu.AI, 华为
日期: 2023-03-30
引用次数: 89

1 读后感

这是一篇比较早的论文,于 2022 年 4 月至 6 月期间,在 1,536 个 Ascend 910 AI 处理器集群上,对 23 种编程语言进行了训练,总共使用了超过 850B 个 token,模型于 2022 年 9 月公开发布。

该论文介绍了 CodeGeeX 的第一代技术,而 CodeGeeX2 则基于 ChatGLM2,底层结构转向了 llama2。新版本没有附带新的论文和开源代码。

通过阅读这篇论文,我们可以了解到开发代码生成的起始阶段,包括:现有对基础架构的调整、数据组织和模型评估的过程。从代码实现的角度来看,CodeGeeX 是完全开源的。它使用 Mindspore 作为深度学习框架,而非主流的 torch。不过,它提供了类似于 torch 的调用方法,所以只需简单浏览即可。

与 copilot 相比,CodeGeeX 免费使用的。我的使用体验是:功能差异不大,只是质量稍逊色一些。

2 摘要

目标:介绍 CodeGeeX,一个拥有 130 亿参数的,支持多编程语言的代码生成模型。

方法:CodeGeeX 用 850 B 个 token 进行了模型预训练,涵盖了 23 种编程语言。

结论:实验结果表明,CodeGeeX 在性能上优于规模相似的多语言代码模型。

3 引言

主要贡献

  • 推出了 CodeGeeX,一个 13B 参数的 23 语言代码生成模型,其在代码生成和翻译上超过了同等规模的多语言基线。
  • 为 VS Code、JebBrains 和 Tencent Cloud Studio 开发了 CodeGeeX 扩展插件,比 Copilot 有更多功能,包括代码完成、生成、翻译和解释,且能提高 83.4% 用户的编码效率。
  • 创建了 HumanEval-X 基准测试,以评估多语言代码模型在代码生成和翻译任务的功能正确性,推动对预训练代码模型的理解和发展。

4 实现

4.1 模型架构

基于 Transformer 框架,采用了仅解码器网络进行自回归语言建模。CodeGeeX 的核心架构是一个 39 层的转换器解码器。在每个 Transformer 层中,应用了多头自注意力机制,然后是 MLP 层、层归一化和残差连接。并使用了 FastGELU 激活函数。

采用 GPT 范式,在大量未标记的代码数据上训练模型。

在顶部查询层和解码方面,原始的 GPT 模型使用池函数来获取最终输出。而文中模型在所有其他转换器层之上使用了一个额外的查询层,并通过注意力来获得最终的嵌入。

4.2 预训练

4.2.1 训练数据

训练语料库包含两部分:

第一部分来自开源代码数据集,包括 Pile(Gao 等人,2020 年)和 CodeParrot3。Pile 包含了 GitHub 上星级超过 100 的公共仓库的子集,从中选择了 23 种流行编程语言的文件,包括 C++,Python,Java,JavaScript,C,Go 等。根据每个文件的后缀和它所属仓库的主要语言来确定编程语言。CodeParrot 是来自 BigQuery 的另一个公开的 Python 数据集。

第二部分是直接从 GitHub 公共仓库中抓取的 Python,Java 和 C++ 的补充数据,这些数据在第一部分中没有出现。选择的仓库至少有一个星级,总大小在 10MB 以内,然后过滤掉那些:1)平均每行超过 100 个字符的文件,2)自动生成的文件,3)字母比例小于 40% 的文件,4)大于 100KB 或小于 1KB 的文件。按照 PEP8 标准格式化 Python 代码。

4.2.2 Tokenization

考虑到 1)代码数据中存在大量自然语言注释,2)变量、函数和类的命名通常是有意义的词,将代码数据与文本数据相同,并应用 GPT-2 标记器。由于词汇表包含来自各种自然语言的标记,因此它允许 CodeGeeX 处理英语以外的语言的标记,如中文、法语、俄语、日语等。最终的词汇量为 52,224 。

4.2.3 输入词和位置嵌入

在给定 tokens 后,每个 token 会与一个词嵌入相关联,同时也会获取位置信息的嵌入。这两种嵌入相加后形成模型的输入嵌入,最后整个序列被转换为输入嵌入。

4.3 训练

在 Ascend 910 上进行并行训练。CodeGeeX 在带有 Mindspore(v1.7.0)的 Ascend 910 AI 处理器(32GB)集群上进行了训练。与 NVIDIA GPU 和 PyTorch/TensorFlow 相比,Ascend 和 Mindspore 相对较新。整个预训练过程需要两个月的时间,在 192 个节点和 1,536 个 AI 处理器上,850B 代币,相当于 5+ 个 epoch(213,000 步)。

4.4 快速推理

为了提供预训练的 CodeGeeX,实现了一个纯 PyTorch 版本的 CodeGeeX,它支持在 NVIDIA GPU 上进行推理。为了实现快速且节省内存的推理,将量化和加速技术应用于预训练的 CodeGeeX。

量化前后对比如下:

5 评测

主实验结果如下:

后面的 CodeGeeX2 相比 CodeGeeX 又好很多,下图取自 CodeGeeX2 github。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/508458.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习目标检测】二十二、基于深度学习的肺炎检测系统-含数据集、GUI和源码(python,yolov8)

肺炎尽管很常见,但准确诊断是一项困难的任务。它要求训练有素的专家对胸部X光片进行检查,并通过临床病史,生命体征和实验室检查进行确认。肺炎通常表现为胸部X光片上一个或多个区域的阴影(opacity)增加。但是,由于肺部有许多其他状…

【笔记】OpenHarmony和HarmonyOS区别及应用开发简介

一、概念 OpenHarmony(OH) : OpenAtom OpenHarmonyHarmonyOS(HO):开发 | 华为开发者联盟 (huawei.com) HO当前最高是3.1,在华为mate 60上面也是。关于4.0、5.0和next这类版本说法都是面向用户的,不是开发人员。对于程序员&#…

Python爬虫——解析常用三大方式之JsonPath

目录 JsonPath 安装 使用 我们的json数据 基本使用 案例 总结 JsonPath 主要适用于解析一些json的数据 安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ jsonpath 使用 obj json.load(open( json文件 , r , encoding utf-8 ) )ret jsonpath.…

【C++ 函数栈】栈区保存函数参数和函数调用的过程

目录 1 调用过程 🙋‍♂️ 作者:海码007📜 专栏:C专栏💥 标题:【C 函数栈】栈区保存函数参数和函数调用的过程❣️ 寄语:人生的意义或许可以发挥自己全部的潜力,所以加油吧&#xff…

yolov5训练太慢的解决方案

问题原因 训练太慢大多是因为没有安装CUDA和pytorch,导致的只有cpu在跑,显卡没跑 这就是很典型的。 解决方案 第一步:安装CUDA 在本机上面安装CUDA,记住只有N卡可以安装,一开始的电脑是自带CUDA的。 如果不是自带的CUDA&…

自己本地模拟内存数据库增删改查

目录 学习初衷准备代码实现结果感谢阅读 学习初衷 用于满足自己的测试要求,不连接数据库,也不在意数据丢失 准备 maven依赖 org.springframework.boot spring-boot-starter-test test 代码实现 内存数据库(InMemoryDatabase&#xff0…

Java中的List

List集合的特有方法 方法介绍 方法名描述void add(int index,E element)在此集合中的指定位置插入指定的元素E remove(int index)删除指定索引处的元素,返回被删除的元素E set(int index,E element)修改指定索引处的元素,返回被修改的元素E get(int inde…

【OpenGL编程手册-04】详细解释着色器

着色器 目录 一、说明二、着色器语言GLSL2.1 典型的着色器代码2.2 数据类型2.2.1 向量 2.3 输入与输出2.3.1 顶点着色器2.3.2 片段着色器 2.4 Uniform2.5 函数后缀含义2 .6 更多属性! 三、我们自己的着色器类四、从文件读取五、 编译着色器练习 一、说明 在Hello T…

故障诊断 | 一文解决,XGBoost极限梯度提升树的故障诊断(Matlab)

效果一览 文章概述 故障诊断 | 一文解决,XGBoost极限梯度提升树的故障诊断(Matlab) 模型描述 XGBoost通过集成多个决策树来建立一个强大的预测模型。它采用了一种特殊的梯度提升技术,称为极限梯度提升(Extreme Gradient Boosting),以提高模型的性能和鲁棒性。 极限梯度…

足球青训俱乐部|基于Springboot的足球青训俱乐部管理系统设计与实现(源码+数据库+文档)

足球青训俱乐部管理系统目录 目录 基于Springboot的足球青训俱乐部管理系统设计与实现 一、前言 二、系统设计 1、系统架构设计 三、系统功能设计 1、管理员登录界面 2、公告信息管理界面 3、学员管理界面 4、商品信息管理界面 5、课程安排管理界面 四、数据库设计…

Hackthebox - Authority

#ansible #Certify 赛博雨天:https://yutianqaq.github.io/ Recon smb smbmap -H 10.10.11.222 -u 挂载 smb 到 kali mount -t cifs //10.10.11.222/Development ./smb -o usernamesmb 在 cat smb/Automation/Ansible/PWM/defaults/main.yml 得到 ansible 的加…

java012 - Java集合基础

1、集合基础 1.1 集合概述 引用数据类型包括:类、接口、数组[] 1.2 ArrayList构造和添加方法 代码: 空集合对象:[] add() add(int index,E element): 1.3 ArrayList集合常用方法