論文閱讀_代碼生成模型_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.pswp.cn/news/712070.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712070.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712070.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

無處不在的智慧:嵌入式系統引領智能生活

無處不在的智慧:嵌入式系統引領智能生活 嵌入式系統作為智能生活的重要組成部分,正逐漸滲透到我們的日常生活中,引領著智能生活的發展。以下將從多個方面對嵌入式系統在智能生活中的引領作用進行詳細論述。 智能家居中的嵌入式系統應用 嵌…

訓練1 : 老頭

以前用blender做的特效 總結 頭發很費時間, 需要參考和練習眼窩周邊結構還有些待準確把握從光與影中揣摩輪廓形狀 從少量面掌握大體, 從多數面雕刻細節

terminal下環境不統一導致的程序報錯(powersell改cmd)

1.報錯現象 在terminal下利用命令行執行代碼顯示運行環境缺包: 但將命令中的參數寫入參數文件,運行train.py時,程序可以正常運行: 直接運行train.py:程序可用: 2.原因分析 參考文章 控制臺環境和項目環境不一致問…

【Mysql】InnoDB 中 B+ 樹索引的注意事項

一、根頁面萬年不動 在之前的文章里,為了方便理解,都是先畫存儲用戶記錄的葉子節點,然后再畫出存儲目錄項記錄的內節點。 但實際上 B 樹的行成過程是這樣的: 每當為某個表創建一個 B 樹索引,都會為這個索引創建一個根…

C++高級面試題:請解釋 C++ 中的標準模板庫(STL)及其常見組件

請解釋 C 中的標準模板庫(STL)及其常見組件 C 標準模板庫(Standard Template Library,STL)是 C 標準庫的一部分,提供了豐富的通用數據結構和算法實現,以及許多與數據處理相關的工具。STL 中的組…

循環隊列的實現

文章目錄 循環隊列的概念循環隊列的實現循環隊列的判空和判滿鏈表or數組 循環隊列的概念 設計你的循環隊列實現。 循環隊列是一種線性數據結構,其操作表現基于 FIFO(先進先出)原則并且隊尾被連接在隊首之后以形成一個循環。它也被稱為“環形緩…

快速下載Huggingface的大語言模型

提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 文章目錄 前言一、Huggingface是什么?二、基于官方huggingface-cli下載(基礎,斷線風險)1.安裝hf下載環境2.配置環境變量3.注冊…

CSAPP-信息的表示和處理

文章目錄 概念掃盲思想理解經典好圖安全事件 概念掃盲 1.大端高位在前,小端低位在前 2.邏輯運算符(&& 、||、!)與位級運算(&、|、~)的差異 3.宏可以保證無論代碼如何編譯,都能生成…

flutterandroidx支持,【工作經驗分享】

基于Linux的pc啟動過程 我們都知道,所有的程序軟件包括操作系統都是運行在內存中的,然而我們的操作系統一般是存放在硬盤上的,當我們按下開機鍵的時候,此時內存中什么程序也沒有,因此需要借助某種方式,將操…

百度SEO工具,自動更新網站的工具

在網站SEO的過程中,不斷更新網站內容是提升排名和吸引流量的關鍵之一。而對于大多數網站管理員來說,頻繁手動更新文章并進行SEO優化可能會是一項繁瑣且耗時的任務。針對這一問題,百度自動更新文章SEO工具應運而生,它能夠幫助網站管…

搭建nginx+keepalived高可用(主備模式)

nginx安裝 1. 前置依賴安裝 yum install gcc gcc-c pcre pcre-devel zlib zlib-devel openssl openssl-devel -y2. 編譯安裝nginx nginx下載地址: https://nginx.org/en/download.html ## 安裝包位置:信息港16.11:/root/shl tar xvf nginx-1.20.2.ta…

chartjs 餅狀圖

之前要把canvas先清除掉&#xff0c;不然刷新數據&#xff0c;還會有前面的圖表 function clearCanvas(){$(#donutChart).remove();$(#chartdiv).append(<canvas id"donutChart" style"min-height: 500px; height: 500px; max-height: 500px; max-width: 70%…

淺談mysql mvcc

目錄 前言 mvcc 是如何工作的&#xff1f; 數據的更新 前言 mvcc 與一個事物的隔離級別有關&#xff0c;未提交讀永遠讀的是當前值&#xff0c;串行化是通過加鎖實現&#xff0c;這兩種隔離級別都與mvcc 沒有任何關系。只要一提到mvcc應該想到的是讀提交以及可重復讀&#…

vue+element ui上傳圖片到七牛云服務器

本來打算做一個全部都是前端完成的資源上傳到七牛云的demo&#xff0c;但是需要獲取token&#xff0c;經歷了九九八十一難&#xff0c;最終還是選擇放棄&#xff0c;token從后端獲取&#xff08;springboot&#xff09;。如果你們有前端直接能解決的麻煩記得私我哦&#xff01;…

『Linux從入門到精通』第 ? 期 - 動靜態庫

文章目錄 &#x1f490;專欄導讀&#x1f490;文章導讀&#x1f427;什么是庫&#xff1f;&#x1f427;為什么要有庫&#xff1f;&#x1f427;寫一個自己的庫&#x1f426;方法一&#x1f426;方法二 靜態庫&#x1f426;標準化&#x1f426;方法三 動態庫&#x1f426;配置動…

python中自定義報錯

class MyError(Exception):def __init__(self,num):#錄入的數Exception.__init__(self)self.numnumdef __str__(self):return 這是我定義的第%d個異常 %(self.num)使用 try:raise MyError(4) except MyError as e:print(e)raise 其作用是指定拋出的異常名稱&#xff0c;以及異常…

題目 1240: 生日日數

題目描述: CCC老師的生日是YY年MM月DD日&#xff0c;他想知道自己出生后第一萬天紀念日的日期&#xff08;出生日算第0天&#xff09;。 代碼: package lanqiao;import java.time.LocalDate; import java.util.*;public class Main {public static void main(String[] args)…

數據結構題目①——數組

前言 本篇文章為博主進行代碼隨想錄——數組練習后的總結會涉及到每一道題目的詳細的思路整理&#xff0c;以及本人的易錯點&#xff0c;希望對大家有所幫助 數組介紹&#xff1a; 數組在C語言中就已經有所涉及&#xff0c;它是一個最基礎的數據結構&#xff0c;而在數據結構中…

Java學習—FileInputStream

在Java編程中&#xff0c;文件操作是日常任務之一。無論是讀取配置文件、處理圖像&#xff0c;還是讀寫日志文件&#xff0c;理解如何有效地進行文件讀取都是非常重要的。Java提供了多種方式來操作文件&#xff0c;而FileInputStream是其中最基礎也是最直接的一種。本文將深入探…

Spring面試系列-01

1. 什么是 Spring 框架? Spring中文翻譯過來是春天的意思,被稱為J2EE的春天,是一個開源的輕量級的Java開發框架, 具有控制反轉(IoC)和面向切面(AOP)兩大核心。Java Spring框架通過聲明式方式靈活地進行事務的管理,提高開發效率和質量。 Spring框架不僅限于服務器端的…