: 多語言代碼生成模型2022年9月19日 | 語言:En

偽代碼生成源代碼_chatgpt生成偽代碼_偽代碼生成工具

是一個具有130億參數的多編程語言代碼生成預訓練模型。采用華為框架實現chatgpt生成偽代碼,在鵬城實驗室“鵬城云腦II”中的192個節點(共1536個國產昇騰910 AI處理器)上訓練而成。截至2022年6月22日,歷時兩個月在20多種編程語言的代碼語料庫(>8500億)上預訓練得到。有以下特點:

全新多編程語言評測基準-X:-X是第一個支持功能正確性評測的多語言、多任務的基準,包含820個人工編寫的高質量代碼生成題目、測試用例與參考答案,覆蓋5種編程語言(、C++、Java、、Go),支持代碼生成與代碼翻譯能力的評測。

chatgpt生成偽代碼_偽代碼生成源代碼_偽代碼生成工具

在-X代碼生成任務上,與其它開源基線模型相比,取得了最佳的平均性能。

背景:預訓練大模型代碼生成

近年來,使用代碼語料訓練的大規模預訓練模型取得飛速進步。通過使用求解初級編程問題,展示了預訓練模型在該方面的潛力。此后,一系列代碼生成模型亦得以面世,比如、、、、等。這些模型都使用了多種編程語言進行訓練,但是它們往往僅在上做正確性評測,在其它語言上的生成性能尚不明確。

現有的公開評測基準主要關注兩種評價指標:字符串相似性( )或功能正確性( )。第一種指標,如和多語言基準,涵蓋了代碼補全、翻譯、概括等任務。它們使用了BLEU和這類判斷相似性的指標,但這些指標并不能很好反映代碼是否正確。相反地,第二種指標通過測試用例來判斷代碼功能上是否正確,如、MBPP、APPS等基準。然而,這些基準只支持,并不支持其他編程語言。缺乏評價代碼正確性的多語言基準,阻礙了多語言代碼生成模型的發展。

: 多語言代碼生成模型

架構:是一個基于的大規模預訓練編程語言模型。它是一個從左到右生成的自回歸解碼器,將代碼或自然語言標識符()作為輸入,預測下一個標識符的概率分布。含有40個層,每層自注意力塊的隱藏層維數為5120,前饋層維數為,總參數量為130億。模型支持的最大序列長度為2048。

chatgpt生成偽代碼_偽代碼生成工具_偽代碼生成源代碼

左側:訓練數據中各編程語言占比。右側:訓練損失函數隨訓練步數下降曲線。

語料:的訓練語料由兩部分組成。第一部分是開源代碼數據集,The Pile 與。The Pile包含上擁有超過100顆星的一部分開源倉庫,我們從中選取了23種編程語言的代碼。第二部分是補充數據,直接從開源倉庫中爬取、Java、C++代碼;為了獲取高質量數據,我們根據以下準則選取代碼倉庫:1)至少擁有1顆星;2)總大小[注釋符] : [語言],例如:# : 。我們使用與GPT-2相同的分詞器,并將空格處理為特殊標識符,詞表大小為。整個代碼語料含有23種編程語言、總計1587億個標識符(不含填充符)。

國產平臺實現與訓練

我們在 1.7框架上實現了模型,并使用鵬城實驗室的全國產計算平臺上進行訓練。具體來說,使用了其一個計算集群中的1536個昇騰910 AI處理器(32GB)進行了兩個月左右的訓練(2022年4月18日至6月22日)。除了-norm與使用FP32格式以獲得更高的精度與穩定性,模型參數整體使用FP16格式,最終整個模型需要占用約27GB顯存。為了增加訓練效率,我們使用8路模型并行和192路數據并行的訓練策略,微批大小為16、全局批大小為3072,并采用ZeRO-2優化器降低顯存占用。

在開發與訓練過程中,我們和華為團隊合作,對框架進行了部分優化,進而大幅度提升訓練效率。比如,我們發現矩陣乘法的計算時間占比僅為22.9%,大量時間被用于各類其它算子,因此實現了一系列算子融合,包括單元素算子融合、層歸一化算子融合、與矩陣乘法融合、批量矩陣乘法與加法融合等;再比如我們還對矩陣乘法算子的維度實現自動搜索調優,使其搜索出效率最高的計算維度組合。這些優化為訓練速度帶來了顯著提升,在同等GPU卡數規模下(128卡),昇騰910對這一模型的訓練效率從約為 A100的16.7%提升至43%;在千卡規模下,昇騰910訓練效率相比自身優化前提升近300%。下表為優化前與優化后,昇騰910與英偉達A100在模型訓練上的效率對比。使用優化后的軟硬件訓練時,單日訓練量可達到543億個標識符(含填充符)。我們還嘗試進一步加入流水線優化(訓練時未實裝),整體訓練效率再次提升,單日訓練量達到841億個標識符(含填充符),證明了國產深度學習平臺與工具的快速迭代能力以及強大競爭力。

偽代碼生成源代碼_chatgpt生成偽代碼_偽代碼生成工具

910 與 A100優化前后訓練效率對比

偽代碼生成源代碼_偽代碼生成工具_chatgpt生成偽代碼

進一步加入流水線并行等優化后, 910整體訓練效率有極大提升

除了對平臺的支持,我們也正在將模型遷移適配到其它平臺,并將在近期開源跨平臺代碼和模型權重,讓研究者可以在不同平臺上運行。

-X: 多語言代碼生成基準

為了更好地評測代碼生成模型的多語言生成能力,我們構建了一個新基準-X。此前,多語言代碼生成能力是基于語義相似度(比如)衡量的,具有一定誤導性;-X則可用于衡量生成代碼的功能正確性。-X包含820個高質量手寫樣本,覆蓋、C++、Java、、Go,可用于多種任務。

偽代碼生成工具_chatgpt生成偽代碼_偽代碼生成源代碼

-X支持的任務示例。聲明、描述、解答分別用紅、綠、藍色標注。代碼生成將聲明與描述作為輸入,輸出解答。代碼翻譯將兩種語言的聲明與源語言的解答作為輸入,輸出目標語言的解答。

-X中每個語言的樣本,包含了聲明、描述和解答,它們之間的組合可以支持不同的下游任務,包括生成、翻譯、概括等。我們目前關注兩個任務:代碼生成與代碼翻譯。對于代碼生成任務,模型將函數聲明與文檔字符串作為輸入,輸出函數實現;對于代碼翻譯任務,模型將兩種語言的函數聲明與源語言的實現作為輸入,輸出目標語言上的實現。我們在代碼翻譯任務中不將文檔字符串輸入模型,以避免模型直接通過描述生成答案。在兩種任務下,我們都采用所使用的無偏pass@k指標,判斷生成代碼的功能正確性。

多語言代碼生成

偽代碼生成源代碼_偽代碼生成工具_chatgpt生成偽代碼

左上:在-X的代碼生成任務中,模型在所有語言上的平均表現。其他:在五種語言上具體的pass@k(k=1,10,100)性能。的平均表現優于-6.7B和--6B/16B。

我們將與另外兩個開源代碼生成模型進行比較,分別為Meta的與的,選取-6.7B、--6B 與 --16B。能獲得最佳的平均性能,顯著超越了參數量更小的模型(7.5%~16.3%的提升),與參數量更大的模型--16B表現相當(平均性能 54.76% vs. 54.39%)。

多語言生成超越最佳單一語言生成

chatgpt生成偽代碼_偽代碼生成源代碼_偽代碼生成工具

在-X中,在5種語言下對各問題的解答率,按下的解答率排序。

我們觀察了每道題目的具體解答情況,發現題目在不同語言上的解答率有著較大區別,某些題目更適合用特定語言進行解答。這個現象啟發我們將固定的生成次數分配到多種語言上,從而讓生成結果更多樣,增大其中至少有一個正確解答的概率。

偽代碼生成源代碼_偽代碼生成工具_chatgpt生成偽代碼

固定生成預算時-X下的多語言生成結果。每種方法最佳模型的結果用粗體顯示,每個模型最佳方法的結果用斜體顯示。

如果采用平均分配chatgpt生成偽代碼,比如使用每種語言生成20次,即可讓正確率有所提升。我們還使用另一種啟發式方法,根據訓練語料中各語言占比來分配生成的次數,可以將的pass@100 從60.92%提升到62.95%。使用這種啟發式方法后,我們測試的所有模型的性能都有所提升,pass@100相對最好的單語言生成提升了1~3%。在上述的分配方式中,的表現都比其它基線模型更好。

跨語言代碼翻譯

偽代碼生成工具_chatgpt生成偽代碼_偽代碼生成源代碼

-X上的代碼翻譯任務結果。加粗結果表示在每種語言pass@k上的最佳效果。

我們還評測了模型在多語言間代碼翻譯上的性能。對于,我們評測了未經微調的-13B與經過微調的-13B-FT(使用 中代碼翻譯任務的訓練集與一部分Go語言數據微調)。如上表顯示,模型對特定語言存在偏好,比如擅長將其他語言翻譯為與C++,而--16B擅長翻譯為和Go,這可能是由于訓練集中的語料占比存在差異。在20個翻譯對中,我們還觀察到兩種語言互相翻譯的表現常常是呈負相關的,這可能說明現有的模型還不足以學好所有的語言。

在線生成與翻譯DEMO

偽代碼生成源代碼_chatgpt生成偽代碼_偽代碼生成工具

我們為上述兩個任務開發了DEMO:代碼生成和代碼翻譯,歡迎點擊體驗!

自動編程VS Code插件

基于,我們開發了一個免費的VS Code插件(插件市場搜索“”即可下載),輔助多語言編程開發。除了多語言代碼生成/翻譯能力,我們還利用強大的少樣本生成能力,將其變成一個可自定義的編程助手。少樣本生成意味著不需要在特定任務上進行微調,用戶只需通過提供自定義提示語句,即可實現一些有趣的功能。比如,用戶可以在提示中加入具有特定代碼風格的代碼,會加以模仿,生成類似風格的代碼。用戶也可以加入一些特定格式的代碼讓掌握新技能,如逐行解釋代碼(如動圖所示)。馬上前往VS Code嘗試,自定義你的編程助手吧!

chatgpt生成偽代碼_偽代碼生成源代碼_偽代碼生成工具

上述例子中,我們在輸入中提供了額外提示----一段逐行解釋代碼的示例,加以模仿,將現有的一段代碼按照相同的方式進行解釋。可以通過類似的方式,加入其他的提示,讓模型掌握更多的能力.

未來研究

在之前工作的基礎上,進一步展示了大規模預訓練模型在代碼生成上的強大能力,以及進一步擴展到各種形式化語言上的潛力。這僅僅是第一步,還有很多問題值得我們在未來繼續探索,這里給出三點我們的思考。

第一,我們發現模型容量對多語言能力十分關鍵。人類程序員在掌握幾種編程語言的情況下,能快速遷移到其他語言。與之相反,模型則需要為每種語言分配較大的模型容量來存儲相關的知識(一個典型的例子是有著5400億參數量的,依靠超大的模型容量取得了驚人的效果),卻沒有很好抽象出編程語言的高階知識。如何讓模型學習到編程語言的共性,從而快速遷移到其他語言上仍是一個巨大的挑戰。

第二,展現了一定的推理能力,但并沒有推廣到所有語言上。能使用不同語言解決編程問題,但各種語言擅長解答的問題分布卻有較大差異。盡管模型已經能學習到各種語言正確的語法chatgpt生成偽代碼,卻無法用不同語言解決同一個問題。我們猜想這可能與不同編程語言的特性有關(比如庫功能更加完善),或者是因為在訓練集中出現了某種語言的類似實現,但缺少了其他語言的。無論是哪種情況,都反映了當前的模型在推理能力上存在局限,讓模型獲得更加可靠的推理能力還需要長期的研究。

第三,的少樣本生成能力亟待進一步探索。對于大規模預訓練模型,微調(fine-)的成本是昂貴的,如何使用少量的樣本就讓模型生成想要的代碼,對代碼生成模型的實用化具有非常大的意義。近期的一些工作,如思考過程提示方法(-of- )就展現了驚人的結果,這極大啟發了我們將這一技術也用于中。這同時也是我們設計自定義編程助手的初衷,希望程序員和研究者們能和我們一起探索如何更好地使用。

如果您有相關評論或建議,歡迎發送郵件至。

致謝

這一項目由國家自然科學基金杰出青年科學基金項目(No. )支持。學生負責人

鄭勤鍇(清華大學知識工程實驗室),夏簫(清華大學知識工程實驗室),鄒旭(清華大學知識工程實驗室)

技術貢獻

清華大學知識工程實驗室:曾奧涵,鄭問迪,薛理龍

清華大學交叉信息學院:劉益楓,陳彥儒,徐奕辰(北郵大四訪問清華期間研究工作)

鵬城實驗室:陳慶玉,李忠琦,范高俊

智譜AI:薛宇飛,王山,陜杰才,姜皓瀚,劉璐,薛旋,張鵬

華為昇騰團隊:姚逸璠,蘇騰,鄧啟輝,周斌

數據標注

程銳杰(清華大學),于沛楠(清華大學),張競堯(智譜AI),黃鉑文(智譜AI),王炤宇(智譜AI)

指導教師

楊植麟(清華大學交叉信息學院),東昱曉(清華大學知識工程實驗室),陳文光(清華大學實驗室),唐杰(清華大學知識工程實驗室)

計算資源支持

鵬城實驗室

智譜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.

免責聲明:本文系轉載,版權歸原作者所有;旨在傳遞信息,不代表本站的觀點和立場和對其真實性負責。如需轉載,請聯系原作者。如果來源標注有誤或侵犯了您的合法權益或者其他問題不想在本站發布,來信即刪。