当前位置: 首页 > news >正文

【自然语言处理】【大模型】CodeGeeX:用于代码生成的多语言预训练模型

CodeGeeX:用于代码生成的多语言预训练模型
《CodeGeeX: A Pre-Trained Model for Code Generation with Multilingual Evaluations on HumanEval-X》

论文地址:https://arxiv.org/pdf/2303.17568.pdf

相关博客
【自然语言处理】【大模型】CodeGen:一个用于多轮程序合成的代码大语言模型
【自然语言处理】【大模型】CodeGeeX:用于代码生成的多语言预训练模型
【自然语言处理】【大模型】LaMDA:用于对话应用程序的语言模型
【自然语言处理】【大模型】DeepMind的大模型Gopher
【自然语言处理】【大模型】Chinchilla:训练计算利用率最优的大语言模型
【自然语言处理】【大模型】大语言模型BLOOM推理工具测试
【自然语言处理】【大模型】GLM-130B:一个开源双语预训练语言模型
【自然语言处理】【大模型】用于大型Transformer的8-bit矩阵乘法介绍
【自然语言处理】【大模型】BLOOM:一个176B参数且可开放获取的多语言模型
【自然语言处理】【大模型】PaLM:基于Pathways的大语言模型
【自然语言处理】【chatGPT系列】大语言模型可以自我改进
【自然语言处理】【ChatGPT系列】FLAN:微调语言模型是Zero-Shot学习器
【自然语言处理】【ChatGPT系列】ChatGPT的智能来自哪里?

一、简介

​ 代码生成的目标是:给定人类意图的描述(例如:“写一个阶乘函数”),系统自动生成可执行程序。这个任务由来已久,解决的方案也层出不穷。近期,通过将程序看作是语言序列,利用深度学习的transformer架构进行建模,显著的改善了代码生成的质量。特别是当大规模的开源代码数据与大语言模型相结合。

​ OpenAI的12B模型CodeX证明了在数十亿行公开代码上预训练的大模型的潜力。通过使用生成式预训练的方式,CodeX能够很好地解决python中的入门级编程问题。研究显示,GitHub Copilot 88%的用户都表示编程效率提高了。随后,大量的代码大语言模型被开发出来,包括:DeepMind的AlphaCode、Salesforce的CodeGen、Meta的InCoder和Google的PaLM-Coder-540B

​ 本文提出了13B参数量的多语言代码生成模型CodeGeeX,其是在23种编程语言上预训练的。该模型在具有1536个Ascend 910 AI处理器的集群上训练了2个月,共计训练了8500亿个tokens。CodeGeeX有以下的一些特性:(1) CodeGeeX不同于CodeX,其模型本身以及训练代码都是开源的,有助于理解和改进预训练代码模型。CodeGeeX也支持在Ascend和NVIDIA GPUs等不同平台上推理。(2) 除了代码生成和代码补全,CodeGeeX也支持代码解释代码翻译。(3) 与知名的代码生成模型相比(CodeGen-16B、GPT-NeoX-20B、InCode-6.7B和GPT-J-6B),CodeGeeX的表现一致优于其他模型。

​ 本文还开发了HumanEval-X基准来评估多语言代码模型,因为:(1) HumanEval和其他基准仅包含单个语言的编程问题;(2) 现有的多语言数据集使用BLEU这样的字符串相似度指标进行评估,而不是验证生成代码的正确性。具体来说,对于HumanEval中每个Python问题,都人工用C++、Java、JavaScript、GO来重写其prompt、标准解决方案和测试用例。总的来说,在HumanEval-X中包含了820个手写的"问题-解决方案对"。此外,HumanEval-X同时支持代码生成和代码翻译的评估。

二、CodeGeeX模型

在这里插入图片描述

1.模型架构

Transformer Backbone。CodeGeeX使用纯解码器的GPT架构,并使用自回归语言建模。CodeGeeX的核心架构是39层的transformer解码器。在每个transformer层,包含:多头自注意力机制、MLP层、layer normalization和残差连接。使用类GELU的FaastGELU激活,其在Ascend 910 AI处理器上更加高效。
FastGELU ( X i ) = X i 1 + exp ⁡ ( − 1.702 × ∣ X i ∣ ) × exp ⁡ ( 0.851 × ( X i − ∣ X i ∣ ) ) (1) \text{FastGELU}(X_i)=\frac{X_i}{1+\exp(-1.702\times|X_i|)\times\exp(0.851\times(X_i-|X_i|))} \tag{1} FastGELU(Xi)=1+exp(1.702×Xi)×exp(0.851×(XiXi))Xi(1)
生成式预训练目标。采用GPT的范式,在大规模无监督代码数据上训练模型。总的来说,就是迭代地将代码token作为输入,预测下一个token并与真实的token进行比较。具体来说,对于长度为 n n n的任意输入序列 { x 1 , x 2 , … , x n } \{x_1,x_2,\dots,x_n\} {x1,x2,,xn},CodeGeeX的输出都是下一个token的概率分布
P ( x n + 1 ∣ x 1 , x 2 , … , x n , Θ ) = p n + 1 ∈ [ 0 , 1 ] 1 × v (2) \mathbb{P}(x_{n+1}|x_1,x_2,\dots,x_n,\Theta)=p_{n+1}\in[0,1]^{1\times v} \tag{2} P(xn+1x1,x2,,xn,Θ)=pn+1[0,1]1×v(2)
其中, Θ \Theta Θ表示所有参数, v v v是词表大小。通过将预测token与真实分布进行比较,可以优化交叉熵损失函数:
L = − ∑ n = 1 N − 1 y n + 1 log ⁡ P ( x n + 1 ∣ x 1 , ) (3) \mathcal{L}=-\sum_{n=1}^{N-1}y_{n+1}\log \mathbb{P}(x_{n+1}|x_1,) \tag{3} L=n=1N1yn+1logP(xn+1x1,)(3)
Top Query层和解码。原始的GPT使用pooler函数来获得最终的输出。我们在所有transformer层上添加一个额外的查询层(华为"盘古"也使用了这种层)来获得最终的embedding。如上图所示,top query层的输入被替换为位置 n + 1 n+1 n+1的query embedding。最终的输出乘以词嵌入矩阵的转置来获得输出概率分布。对于解决策略,CodeGeeX支持贪心、温度采样、top-k采样、top-p采样和beam search。

2. 预训练设置

在这里插入图片描述

代码语料。训练语料包含两个部分。第一部分是开源代码数据集:Pile和CodeParrot。第二部分是直接从GitHub爬取的Python、Java和C++代码,用于补充第一部分。选择的代码仓库至少有一个star且小于10MB,然后过滤文件:(1) 每行超过100个字符;(2) 自动生成的;(3) 字母比例小于40%的;(4) 大于100KB或者小于1KB的。上图展示了训练数据中23种编程语言的占比。训练数据会被划分为等长的片段。为了帮助模型区分多种语言,在每个片段前添加了语言相关的标签,例如:language: Python。

Tokenization。考虑到代码数据中有大量的自然语言注释且变量、函数、类别的命名通常也是有意义的单词,因此将代码数据也做文本数据并使用GPT-2 tokenizer。初始词表尺寸为50000,并将多个空格编码为额外的tokens来增加编码效率。具体来说,L个空白符被表示为<|extratoken_X|>,其中X=8+L。由于词表包含各种语言的tokens,这允许CodeGeeX处理各种语言的token,例如中文、法语等。最终的词表尺寸为 v = 52224 v=52224 v=52224

词嵌入和位置嵌入。词嵌入矩阵表示为 W w o r d ∈ R v × h W_{word}\in\mathbb{R}^{v\times h} WwordRv×h,位置嵌入矩阵表示为 W p o s ∈ R n m a x × h W_{pos}\in\mathbb{R}^{n_{max}\times h} WposRnmax×h,其中 h = 5120 h=5120 h=5120 n m a x = 2048 n_{max}=2048 nmax=2048。每个token都对应一个可学习的词嵌入 x w o r d ∈ R h x_{word}\in\mathbb{R}^h xwordRh以及一个可学习的位置嵌入 x p o s ∈ R h x_{pos}\in\mathbb{R}^{h} xposRh。两个嵌入相加得到输入的嵌入向量 x i n = x w o r d + x p o s x_{in}=x_{word}+x_{pos} xin=xword+xpos。最终,整个序列被转换为嵌入矩阵 X i n ∈ R n × h X_{in}\in\mathbb{R}^{n\times h} XinRn×h n n n是序列长度。

3. CodeGeeX训练

Ascend 910并行训练。CodeGeeX在Ascend 910 AI处理器(32GB)的集群上使用Mindspore进行训练。训练在192个节点的1526个AI处理器上进行了2个月。共计消耗了850B的tokens,约为5个epochs(213000steps)。为了提高训练效率,采用8路模型并行和192路数据并行,并使用ZeRO-2优化器来进一步降低显存消耗。最终,每个节点上的micro-batch size为16,全局batch size为3072。

​ 具体来说,使用Adam优化器来优化loss。模型权重采用FP16的格式,为了更高的精度和稳定性layer-norm和softmax使用FP32。模型占用GPU显存为27GB。初始学习率为1e-4,并应用cosine学习率调度:
l r c u r r e n t = l r m i n + 0.5 ∗ ( l r m a x − l r m i n ) ∗ ( 1 + cos ⁡ ( n c u r r e n t n d e c a y π ) ) (4) lr_{current}=lr_{min}+0.5*(lr_{max}-lr_{min})*(1+\cos(\frac{n_{current}}{n_{decay}}\pi)) \tag{4} lrcurrent=lrmin+0.5(lrmaxlrmin)(1+cos(ndecayncurrentπ))(4)
​ 下表示详细的训练参数。

在这里插入图片描述

训练效率优化。为了优化Mindspore框架来释放Ascend 910的潜力。采用了两项技术来显著改善训练效率:(1) 核融合(Kernel fusion);(2) Auto Tune optimization。下表是优化前和优化后的对比。

在这里插入图片描述

4. 快速推理

量化。应用post-training量化技术来降低CodeGeeX推理时的显存消耗。使用absolute maximum量化将所有线性层的权重 W W W从FP16转换为INT8:
W q = Round ( W λ ) , λ = Max ( ∣ W ∣ ) 2 b − 1 − 1 (5) W_q=\text{Round}(\frac{W}{\lambda}),\lambda=\frac{\text{Max}(|W|)}{2^{b-1}-1} \tag{5} Wq=Round(λW),λ=2b11Max(W)(5)
其中 b b b是比特宽度, b = 8 b=8 b=8 λ \lambda λ是缩放因子。

加速。经过8bit量化后,使用NVIDIA的FasterTransformer实现了更快版本的CodeGeeX。

三、HumanEval-X基准

​ HumanEval基准类似于MBPP和APPS,仅包含手写的Python编程问题,并不能直接应用于多语言代码生成的系统性评估。因此,本文开发了一个HumanEval的多语言变体,HumanEval-X。HumanEval中的每个问题都是用Python定义的,我们用C++、Java、JavaScript和Go重写了prompt、标准解决方案和测试用例。在HumanEval-X中共有820个"问题-解决方案对"。

任务。HumanEval-X会评估2个任务:代码生成和代码翻译。代码生成任务将函数声明和文本描述作为输入,并生成函数的实现代码。代码翻译任务将源语言实现的解决方案作为输入,并生成目标语言的对应实现。

度量(Metric)。使用测试用例来评估生成代码的正确性并衡量其pass@k。具体来说,使用无偏方法来估计pass@k:
pass@k : = E [ 1 − ( n − c k ) ( n k ) ] , n = 200 , k ∈ { 1 , 10 , 100 } (6) \text{pass@k}:=\mathbb{E}[1-\frac{\left(\begin{array}{l}n-c \\ k\end{array}\right)}{\left(\begin{array}{l}n \\ k\end{array}\right)}],\quad n=200,k\in\{1,10,100\} \tag{6} pass@k:=E[1(nk)(nck)],n=200,k{1,10,100}(6)
其中 n n n是生成的总数(200),k是采样数量, c c c是通过所有测试用例的样本数量。

四、CodeGeeX评估

  • 多语言代码生成

在这里插入图片描述

  • 多语言代码翻译

在这里插入图片描述

相关文章:

【自然语言处理】【大模型】CodeGeeX:用于代码生成的多语言预训练模型

CodeGeeX&#xff1a;用于代码生成的多语言预训练模型 《CodeGeeX: A Pre-Trained Model for Code Generation with Multilingual Evaluations on HumanEval-X》 论文地址&#xff1a;https://arxiv.org/pdf/2303.17568.pdf 相关博客 【自然语言处理】【大模型】CodeGen&#x…...

Open3D 非线性最小二乘拟合二维多项式曲线

目录 一、算法原理二、代码实现三、结果展示一、算法原理 多项式曲线表示为: p ( x ) = p 1 x n + p 2 x n...

kafka消息队列的两种模式

第一种模式&#xff1a; 点对点模式&#xff08;一对一&#xff0c;消费者主动拉取数据&#xff0c;消息收到后消息清除&#xff09; 1.消息生产者生产消息发送给队列&#xff0c;然后消费者从队列中取出并且消费消息 2.消息被消费以后&#xff0c;queue中不再有存储&#xff0…...

python语法复习

print&#xff1a;输出函数 print(520)效果&#xff1a;输出520. print(hello)效果&#xff1a;输出hello. print(1020)【效果&#xff1a;输出了:1020】注&#xff1a;“ ”在print里面是一个连接符。 print(1020)【效果&#xff1a;输出了30】注&#xff1a; 在此处…...

02-Java基础编程

Java基础编程 Java 基础语法Java 标识符变量变量的类型Java 基本数据类型基本数据类型转换 运算符常见运算符运算符的优先级 程序流程控制分支语句循环结构常用的循环结构循环的嵌套break 和 continue 关键字 数组一维数组多维数组的使用Arrays 工具类的使用数组中常见的异常 J…...

武忠祥老师每日一题||定积分基础训练(十)

已知f(x)连续 ∫ 0 x t f ( x − t ) d t 1 − cos ⁡ x , 求 ∫ 0 π 2 f ( x ) d x 的值。 \int_{0}^{x}tf(x-t)\,{\rm d}t1-\cos x,求\int_{0}^{\frac{\pi}{2}}f(x)dx的值。 ∫0x​tf(x−t)dt1−cosx,求∫02π​​f(x)dx的值。 已知一个关于f的变上限积分等式&#xff0c;&…...

C/C++趣味程序设计百例(41~50)

C/C语言经典、实用、趣味程序设计编程百例精解&#xff08;5&#xff09; 41.马克思手稿中的数学题 马克思手稿中有一道趣味数学问题&#xff1a;有30个人&#xff0c;其中有男人、女人和小孩&#xff0c;在一家饭馆吃饭花了50先令&#xff1b;每个男人花3先令&#xff0c;每个…...

论文阅读-2-DeepSMOTE Fusing Deep Learning and SMOTE for Imbalanced Data

文章目录 Abstract1. Introduction2. Learning From Imbalanced Data1. 数据级2. 算法级3. 集成方法 3. Deep Learning From Imbalanced Data基于深度神经网络的实例生成损失函数适应长尾识别 4. DeepSMOTEA. 动机B. 描述C. encoder-decoder框架D. 增强的损失函数E. 人工图像生…...

三种方法教你让模糊照片秒变高清图

现在随着数字相机和智能手机的普及&#xff0c;我们拍摄的照片数量越来越多&#xff0c;但是有些照片可能因为环境或技术等原因导致模糊不清&#xff0c;这时候我们就需要使用一些软件或工具来让照片变得清晰&#xff0c;以满足我们的需求。 下面介绍三种常用的照片变清晰的方…...

PyTorch深度学习实战 | 基于线性回归、决策树和SVM进行鸢尾花分类

鸢尾花数据集是机器学习领域非常经典的一个分类任务数据集。它的英文名称为Iris Data Set&#xff0c;使用sklearn库可以直接下载并导入该数据集。数据集总共包含150行数据&#xff0c;每一行数据由4个特征值及一个标签组成。标签为三种不同类别的鸢尾花&#xff0c;分别为&…...

服务端接口优化方案

一、背景 针对老项目&#xff0c;去年做了许多降本增效的事情&#xff0c;其中发现最多的就是接口耗时过长的问题&#xff0c;就集中搞了一次接口性能优化。本文将给小伙伴们分享一下接口优化的通用方案。 二、接口优化方案总结 1. 批处理 批量思想&#xff1a;批量操作数据…...

【并发基础】Happens-Before模型详解

目录 一、Happens-Before模型简介 二、组成Happens-Before模型的八种规则 2.1 程序顺序规则&#xff08;as-if-serial语义&#xff09; 2.2 传递性规则 2.3 volatile变量规则 2.4 监视器锁规则 2.5 start规则 2.6 Join规则 一、Happens-Before模型简介 除了显示引用vo…...

Kubernetes系列---Kubernetes 理论知识 | 初识

Kubernetes系列---Kubernetes 理论知识 | 初识 1.K8s 是什么&#xff1f;2.K8s 特性3.小拓展&#xff08;业务升级&#xff09;4.K8s 集群架构与组件①架构拓扑图&#xff1a;②Master 组件③Node 组件 五 K8s 核心概念六 官方提供的三种部署方式总结 1.K8s 是什么&#xff1f…...

KingbaseES 原生XML系列三--XML数据查询函数

KingbaseES 原生XML系列三--XML数据查询函数(EXTRACT,EXTRACTVALUE,EXISTSNODE,XPATH,XPATH_EXISTS,XMLEXISTS) XML的简单使其易于在任何应用程序中读写数据&#xff0c;这使XML很快成为数据交换的一种公共语言。在不同平台下产生的信息&#xff0c;可以很容易加载XML数据到程序…...

【51单片机】点亮一个LED灯(看开发板原理图十分重要)

&#x1f38a;专栏【51单片机】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【The Right Path】 &#x1f970;大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 目录 &#x1f354;基础内容 &#x1f3f3…...

数据可视化工具 - ECharts以及柱状图的编写

1 快速上手 引入echarts 插件文件到html页面中 <head><meta charset"utf-8"/><title>ECharts</title><!-- step1 引入刚刚下载的 ECharts 文件 --><script src"./echarts.js"></script> </head>准备一个…...

【AI绘画】——Midjourney关键词格式解析(常用参数分享)

目前在AI绘画模型中&#xff0c;Midjourney的效果是公认的top级别&#xff0c;但同时也是相对较难使用的&#xff0c;对小白来说比较难上手&#xff0c;主要就在于Mj没有webui&#xff0c;不能选择参数&#xff0c;怎么找到这些隐藏参数并且触发它是用好Mj的第一步。 今天就来…...

操作符知识点大全(简洁,全面,含使用场景,演示,代码)

目录 一.算术操作符 1.要点&#xff1a; 二.负数原码&#xff0c;反码&#xff0c;补码的互推 1.按位取反操作符&#xff1a;~&#xff08;二进制位&#xff09; 2.原反补互推演示 三.进制位的表示 1.不同进制位的特征&#xff1a; 2.二进制位表示 3.整型的二进制表…...

华工研究生语音课

这门课讲啥 语音蕴含的信息、语音识别的目的 语音的准平稳性、分帧、预加重、时域特征分析&#xff08;能量和过零率&#xff09;、端点检测&#xff08;双门限法&#xff09; 语音的基频及检测&#xff08;主要是自相关法、野点的处理&#xff09; 声音的产生过程&#xf…...

KingbaseES 原生XML系列二 -- XML数据操作函数

KingbaseES 原生XML系列二--XML数据操作函数(DELETEXML,APPENDCHILDXML,INSERTCHILDXML,INSERTCHILDXMLAFTER,INSERTCHILDXMLBEFORE,INSERTXMLAFTER,INSERTXMLBEFORE,UPDATEXML) XML的简单使其易于在任何应用程序中读写数据&#xff0c;这使XML很快成为数据交换的一种公共语言。…...

centos 7 部署awstats 网站访问检测

一、基础环境准备&#xff08;两种安装方式都要做&#xff09; bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...