chatgpt生成偽代碼 CodeGeeX: 多語言代碼生成模型
是一個具有130億參數(shù)的多編程語言代碼生成預(yù)訓(xùn)練模型。采用華為框架實現(xiàn)chatgpt生成偽代碼,在鵬城實驗室“鵬城云腦II”中的192個節(jié)點(共1536個國產(chǎn)昇騰910 AI處理器)上訓(xùn)練而成。截至2022年6月22日,歷時兩個月在20多種編程語言的代碼語料庫(>8500億)上預(yù)訓(xùn)練得到。有以下特點:
全新多編程語言評測基準-X:-X是第一個支持功能正確性評測的多語言、多任務(wù)的基準,包含820個人工編寫的高質(zhì)量代碼生成題目、測試用例與參考答案,覆蓋5種編程語言(、C++、Java、、Go),支持代碼生成與代碼翻譯能力的評測。
在-X代碼生成任務(wù)上,與其它開源基線模型相比,取得了最佳的平均性能。
背景:預(yù)訓(xùn)練大模型代碼生成
近年來,使用代碼語料訓(xùn)練的大規(guī)模預(yù)訓(xùn)練模型取得飛速進步。通過使用求解初級編程問題,展示了預(yù)訓(xùn)練模型在該方面的潛力。此后,一系列代碼生成模型亦得以面世,比如、、、、等。這些模型都使用了多種編程語言進行訓(xùn)練,但是它們往往僅在上做正確性評測,在其它語言上的生成性能尚不明確。
現(xiàn)有的公開評測基準主要關(guān)注兩種評價指標:字符串相似性( )或功能正確性( )。第一種指標,如和多語言基準,涵蓋了代碼補全、翻譯、概括等任務(wù)。它們使用了BLEU和這類判斷相似性的指標,但這些指標并不能很好反映代碼是否正確。相反地,第二種指標通過測試用例來判斷代碼功能上是否正確,如、MBPP、APPS等基準。然而,這些基準只支持,并不支持其他編程語言。缺乏評價代碼正確性的多語言基準,阻礙了多語言代碼生成模型的發(fā)展。
: 多語言代碼生成模型
架構(gòu):是一個基于的大規(guī)模預(yù)訓(xùn)練編程語言模型。它是一個從左到右生成的自回歸解碼器,將代碼或自然語言標識符()作為輸入,預(yù)測下一個標識符的概率分布。含有40個層,每層自注意力塊的隱藏層維數(shù)為5120,前饋層維數(shù)為,總參數(shù)量為130億。模型支持的最大序列長度為2048。
左側(cè):訓(xùn)練數(shù)據(jù)中各編程語言占比。右側(cè):訓(xùn)練損失函數(shù)隨訓(xùn)練步數(shù)下降曲線。
語料:的訓(xùn)練語料由兩部分組成。第一部分是開源代碼數(shù)據(jù)集,The Pile 與。The Pile包含上擁有超過100顆星的一部分開源倉庫,我們從中選取了23種編程語言的代碼。第二部分是補充數(shù)據(jù),直接從開源倉庫中爬取、Java、C++代碼;為了獲取高質(zhì)量數(shù)據(jù),我們根據(jù)以下準則選取代碼倉庫:1)至少擁有1顆星;2)總大小[注釋符] : [語言],例如:# : 。我們使用與GPT-2相同的分詞器,并將空格處理為特殊標識符,詞表大小為。整個代碼語料含有23種編程語言、總計1587億個標識符(不含填充符)。
國產(chǎn)平臺實現(xiàn)與訓(xùn)練
我們在 1.7框架上實現(xiàn)了模型,并使用鵬城實驗室的全國產(chǎn)計算平臺上進行訓(xùn)練。具體來說,使用了其一個計算集群中的1536個昇騰910 AI處理器(32GB)進行了兩個月左右的訓(xùn)練(2022年4月18日至6月22日)。除了-norm與使用FP32格式以獲得更高的精度與穩(wěn)定性,模型參數(shù)整體使用FP16格式,最終整個模型需要占用約27GB顯存。為了增加訓(xùn)練效率,我們使用8路模型并行和192路數(shù)據(jù)并行的訓(xùn)練策略,微批大小為16、全局批大小為3072,并采用ZeRO-2優(yōu)化器降低顯存占用。
在開發(fā)與訓(xùn)練過程中,我們和華為團隊合作,對框架進行了部分優(yōu)化,進而大幅度提升訓(xùn)練效率。比如,我們發(fā)現(xiàn)矩陣乘法的計算時間占比僅為22.9%,大量時間被用于各類其它算子,因此實現(xiàn)了一系列算子融合,包括單元素算子融合、層歸一化算子融合、與矩陣乘法融合、批量矩陣乘法與加法融合等;再比如我們還對矩陣乘法算子的維度實現(xiàn)自動搜索調(diào)優(yōu),使其搜索出效率最高的計算維度組合。這些優(yōu)化為訓(xùn)練速度帶來了顯著提升,在同等GPU卡數(shù)規(guī)模下(128卡),昇騰910對這一模型的訓(xùn)練效率從約為 A100的16.7%提升至43%;在千卡規(guī)模下,昇騰910訓(xùn)練效率相比自身優(yōu)化前提升近300%。下表為優(yōu)化前與優(yōu)化后,昇騰910與英偉達A100在模型訓(xùn)練上的效率對比。使用優(yōu)化后的軟硬件訓(xùn)練時,單日訓(xùn)練量可達到543億個標識符(含填充符)。我們還嘗試進一步加入流水線優(yōu)化(訓(xùn)練時未實裝),整體訓(xùn)練效率再次提升,單日訓(xùn)練量達到841億個標識符(含填充符),證明了國產(chǎn)深度學習平臺與工具的快速迭代能力以及強大競爭力。
910 與 A100優(yōu)化前后訓(xùn)練效率對比
進一步加入流水線并行等優(yōu)化后, 910整體訓(xùn)練效率有極大提升
除了對平臺的支持,我們也正在將模型遷移適配到其它平臺,并將在近期開源跨平臺代碼和模型權(quán)重,讓研究者可以在不同平臺上運行。
-X: 多語言代碼生成基準
為了更好地評測代碼生成模型的多語言生成能力,我們構(gòu)建了一個新基準-X。此前,多語言代碼生成能力是基于語義相似度(比如)衡量的,具有一定誤導(dǎo)性;-X則可用于衡量生成代碼的功能正確性。-X包含820個高質(zhì)量手寫樣本,覆蓋、C++、Java、、Go,可用于多種任務(wù)。
-X支持的任務(wù)示例。聲明、描述、解答分別用紅、綠、藍色標注。代碼生成將聲明與描述作為輸入,輸出解答。代碼翻譯將兩種語言的聲明與源語言的解答作為輸入,輸出目標語言的解答。
-X中每個語言的樣本,包含了聲明、描述和解答,它們之間的組合可以支持不同的下游任務(wù),包括生成、翻譯、概括等。我們目前關(guān)注兩個任務(wù):代碼生成與代碼翻譯。對于代碼生成任務(wù),模型將函數(shù)聲明與文檔字符串作為輸入,輸出函數(shù)實現(xiàn);對于代碼翻譯任務(wù),模型將兩種語言的函數(shù)聲明與源語言的實現(xiàn)作為輸入,輸出目標語言上的實現(xiàn)。我們在代碼翻譯任務(wù)中不將文檔字符串輸入模型,以避免模型直接通過描述生成答案。在兩種任務(wù)下,我們都采用所使用的無偏pass@k指標,判斷生成代碼的功能正確性。
多語言代碼生成
左上:在-X的代碼生成任務(wù)中,模型在所有語言上的平均表現(xiàn)。其他:在五種語言上具體的pass@k(k=1,10,100)性能。的平均表現(xiàn)優(yōu)于-6.7B和--6B/16B。
我們將與另外兩個開源代碼生成模型進行比較,分別為Meta的與的,選取-6.7B、--6B 與 --16B。能獲得最佳的平均性能,顯著超越了參數(shù)量更小的模型(7.5%~16.3%的提升),與參數(shù)量更大的模型--16B表現(xiàn)相當(平均性能 54.76% vs. 54.39%)。
多語言生成超越最佳單一語言生成
在-X中,在5種語言下對各問題的解答率,按下的解答率排序。
我們觀察了每道題目的具體解答情況,發(fā)現(xiàn)題目在不同語言上的解答率有著較大區(qū)別,某些題目更適合用特定語言進行解答。這個現(xiàn)象啟發(fā)我們將固定的生成次數(shù)分配到多種語言上,從而讓生成結(jié)果更多樣,增大其中至少有一個正確解答的概率。
固定生成預(yù)算時-X下的多語言生成結(jié)果。每種方法最佳模型的結(jié)果用粗體顯示,每個模型最佳方法的結(jié)果用斜體顯示。
如果采用平均分配chatgpt生成偽代碼,比如使用每種語言生成20次,即可讓正確率有所提升。我們還使用另一種啟發(fā)式方法,根據(jù)訓(xùn)練語料中各語言占比來分配生成的次數(shù),可以將的pass@100 從60.92%提升到62.95%。使用這種啟發(fā)式方法后,我們測試的所有模型的性能都有所提升,pass@100相對最好的單語言生成提升了1~3%。在上述的分配方式中,的表現(xiàn)都比其它基線模型更好。
跨語言代碼翻譯
-X上的代碼翻譯任務(wù)結(jié)果。加粗結(jié)果表示在每種語言pass@k上的最佳效果。
我們還評測了模型在多語言間代碼翻譯上的性能。對于,我們評測了未經(jīng)微調(diào)的-13B與經(jīng)過微調(diào)的-13B-FT(使用 中代碼翻譯任務(wù)的訓(xùn)練集與一部分Go語言數(shù)據(jù)微調(diào))。如上表顯示,模型對特定語言存在偏好,比如擅長將其他語言翻譯為與C++,而--16B擅長翻譯為和Go,這可能是由于訓(xùn)練集中的語料占比存在差異。在20個翻譯對中,我們還觀察到兩種語言互相翻譯的表現(xiàn)常常是呈負相關(guān)的,這可能說明現(xiàn)有的模型還不足以學好所有的語言。
在線生成與翻譯DEMO
我們?yōu)樯鲜鰞蓚€任務(wù)開發(fā)了DEMO:代碼生成和代碼翻譯,歡迎點擊體驗!
自動編程VS Code插件
基于,我們開發(fā)了一個免費的VS Code插件(插件市場搜索“”即可下載),輔助多語言編程開發(fā)。除了多語言代碼生成/翻譯能力,我們還利用強大的少樣本生成能力,將其變成一個可自定義的編程助手。少樣本生成意味著不需要在特定任務(wù)上進行微調(diào),用戶只需通過提供自定義提示語句,即可實現(xiàn)一些有趣的功能。比如,用戶可以在提示中加入具有特定代碼風格的代碼,會加以模仿,生成類似風格的代碼。用戶也可以加入一些特定格式的代碼讓掌握新技能,如逐行解釋代碼(如動圖所示)。馬上前往VS Code嘗試,自定義你的編程助手吧!
上述例子中,我們在輸入中提供了額外提示----一段逐行解釋代碼的示例,加以模仿,將現(xiàn)有的一段代碼按照相同的方式進行解釋。可以通過類似的方式,加入其他的提示,讓模型掌握更多的能力.
未來研究
在之前工作的基礎(chǔ)上,進一步展示了大規(guī)模預(yù)訓(xùn)練模型在代碼生成上的強大能力,以及進一步擴展到各種形式化語言上的潛力。這僅僅是第一步,還有很多問題值得我們在未來繼續(xù)探索,這里給出三點我們的思考。
第一,我們發(fā)現(xiàn)模型容量對多語言能力十分關(guān)鍵。人類程序員在掌握幾種編程語言的情況下,能快速遷移到其他語言。與之相反,模型則需要為每種語言分配較大的模型容量來存儲相關(guān)的知識(一個典型的例子是有著5400億參數(shù)量的,依靠超大的模型容量取得了驚人的效果),卻沒有很好抽象出編程語言的高階知識。如何讓模型學習到編程語言的共性,從而快速遷移到其他語言上仍是一個巨大的挑戰(zhàn)。
第二,展現(xiàn)了一定的推理能力,但并沒有推廣到所有語言上。能使用不同語言解決編程問題,但各種語言擅長解答的問題分布卻有較大差異。盡管模型已經(jīng)能學習到各種語言正確的語法chatgpt生成偽代碼,卻無法用不同語言解決同一個問題。我們猜想這可能與不同編程語言的特性有關(guān)(比如庫功能更加完善),或者是因為在訓(xùn)練集中出現(xiàn)了某種語言的類似實現(xiàn),但缺少了其他語言的。無論是哪種情況,都反映了當前的模型在推理能力上存在局限,讓模型獲得更加可靠的推理能力還需要長期的研究。
第三,的少樣本生成能力亟待進一步探索。對于大規(guī)模預(yù)訓(xùn)練模型,微調(diào)(fine-)的成本是昂貴的,如何使用少量的樣本就讓模型生成想要的代碼,對代碼生成模型的實用化具有非常大的意義。近期的一些工作,如思考過程提示方法(-of- )就展現(xiàn)了驚人的結(jié)果,這極大啟發(fā)了我們將這一技術(shù)也用于中。這同時也是我們設(shè)計自定義編程助手的初衷,希望程序員和研究者們能和我們一起探索如何更好地使用。
如果您有相關(guān)評論或建議,歡迎發(fā)送郵件至。
致謝
這一項目由國家自然科學基金杰出青年科學基金項目(No. )支持。學生負責人
鄭勤鍇(清華大學知識工程實驗室),夏簫(清華大學知識工程實驗室),鄒旭(清華大學知識工程實驗室)
技術(shù)貢獻
清華大學知識工程實驗室:曾奧涵,鄭問迪,薛理龍
清華大學交叉信息學院:劉益楓,陳彥儒,徐奕辰(北郵大四訪問清華期間研究工作)
鵬城實驗室:陳慶玉,李忠琦,范高俊
智譜AI:薛宇飛,王山,陜杰才,姜皓瀚,劉璐,薛旋,張鵬
華為昇騰團隊:姚逸璠,蘇騰,鄧啟輝,周斌
數(shù)據(jù)標注
程銳杰(清華大學),于沛楠(清華大學),張競堯(智譜AI),黃鉑文(智譜AI),王炤宇(智譜AI)
指導(dǎo)教師
楊植麟(清華大學交叉信息學院),東昱曉(清華大學知識工程實驗室),陳文光(清華大學實驗室),唐杰(清華大學知識工程實驗室)
計算資源支持
鵬城實驗室
智譜AI
項目總負責
唐杰(清華大學知識工程實驗室 & 北京智源人工智能研究院)
參考文獻
Mark Chen, , Jun, Yuan, de , , , Yuri , , Greg , et al. on code. :2107., 2021.
Li, Choi, , Nate , , Rémi , Tom , , , Dal Lago, et al. - code with . :2203., 2022.
Erik , Bo Pang, , Lifu Tu, Huan Wang, Zhou, , and . A for . :2203., 2022.
, , Lin, Sida Wang, Eric , Shi, , Wen-tau Yih, Luke , and Mike . : A for code and . :2204., 2022.
F Xu, Uri Alon, , and . A of of code. In of the 6th ACM on , pp. 1–10, 2022.
, , , , , Adam , Paul , Won , , , and et al. Palm: with . :2204., 2022.
Lu, Daya Guo, Shuo Ren, , , , , Dawn , , Duyu Tang, et al. 2021. : A for code and . :2102..
Ming Zhu, Jain, , , , and K . 2022. : A for - code . :2206.
, , Todd Ward, and Wei-Jing Zhu. 2002. Bleu: a for of . In of the 40th of the for , 311–318.
Shuo Ren, Daya Guo, Lu, Long Zhou, Liu, Duyu Tang, Neel , Ming Zhou, , and Ma. 2020. : a for of code . :2009..
, , Nye, , , , , Cai, , Quoc Le, et al. 2021. with . :2108..
Dan , , , , Akul , Guo, , , He, Dawn Song, et al. 2021. with apps. :2105..
Leo Gao, , Sid , , , , , He, , Noa , et al. The pile: An of text for . :2101., 2020.
Alec , , Tim , and Ilya . by pre . 2018.
, Jeff , , and He. ZeRO: . In SC20: for High , , and , pp. 1–16. IEEE, 2020.
Wei, Wang, Dale , , Ed Chi, Quoc Le, and Zhou. of in . :2201., 2022.
免責聲明:本文系轉(zhuǎn)載,版權(quán)歸原作者所有;旨在傳遞信息,不代表本站的觀點和立場和對其真實性負責。如需轉(zhuǎn)載,請聯(lián)系原作者。如果來源標注有誤或侵犯了您的合法權(quán)益或者其他問題不想在本站發(fā)布,來信即刪。
聲明:本站所有文章資源內(nèi)容,如無特殊說明或標注,均為采集網(wǎng)絡(luò)資源。如若本站內(nèi)容侵犯了原著者的合法權(quán)益,可聯(lián)系本站刪除。