人手一個(gè)編程助手!北大最強(qiáng)代碼大模型CodeShell-7B開(kāi)源,性能霸榜,IDE插件全開(kāi)源
今天,北京大學(xué)軟件工程國(guó)家工程研究中心知識(shí)計(jì)算實(shí)驗(yàn)室聯(lián)合四川天府銀行AI實(shí)驗(yàn)室,正式開(kāi)源70億參數(shù)的代碼大模型CodeShell,成為同等規(guī)模最強(qiáng)代碼基座。
與此同時(shí),團(tuán)隊(duì)將軟件開(kāi)發(fā)代碼助手的完整解決方案全部開(kāi)源,人手一個(gè)本地化輕量化的智能代碼助手的時(shí)代已經(jīng)來(lái)臨!
CodeShell代碼:https://github.com/WisdomShell/codeshell
CodeShell基座模型:https://huggingface.co/WisdomShell/CodeShell-7B
代碼助手VSCode插件:https://github.com/WisdomShell/codeshell-vscode
具體來(lái)說(shuō),CodeShell-7B基于5000億Tokens進(jìn)行了冷啟動(dòng)訓(xùn)練,上下文窗口長(zhǎng)度為8192。
在權(quán)威的代碼評(píng)估基準(zhǔn)(HumanEval和MBPP)上,CodeShell取得同等規(guī)模最好的性能,超過(guò)了CodeLlama-7B和StarCodeBase-7B。
與此同時(shí),同CodeShell-7B配套的量化與本地部署方案,以及支持VSCode與JetBrains IDE的插件也全部開(kāi)源,為新一代智能代碼助手提供了輕量高效的全棧開(kāi)源解決方案。
CodeShell模型和插件的相關(guān)代碼已經(jīng)在Github發(fā)布,并嚴(yán)格遵循Apache 2.0開(kāi)源協(xié)議,模型在HuggingFace平臺(tái)發(fā)布,支持商用。
CodeShell:性能最強(qiáng)的7B代碼基座大模型
CodeShell構(gòu)建了高效的數(shù)據(jù)治理體系,通過(guò)冷啟動(dòng)預(yù)訓(xùn)練5000億Token,代碼生成性能超過(guò)了CodeLlama-7B與StarCoder-7B。
相比而言,CodeLlama在強(qiáng)大的Llama2上繼續(xù)預(yù)訓(xùn)練依然學(xué)習(xí)了超過(guò)5000億Token,而StarCoder冷啟動(dòng)訓(xùn)練了10000億Token,是CodeShell的兩倍。
CodeShell的原始訓(xùn)練數(shù)據(jù)基于自己爬取的Github數(shù)據(jù)、Stack和StarCoder數(shù)據(jù)集,以及少量高質(zhì)量的中英文數(shù)據(jù)。
通過(guò)在數(shù)據(jù)判重、數(shù)據(jù)過(guò)濾規(guī)則、數(shù)據(jù)質(zhì)量模型上設(shè)計(jì)了一套體系化的數(shù)據(jù)治理流水線,CodeShell構(gòu)建了高質(zhì)量的預(yù)訓(xùn)練數(shù)據(jù)。
CodeShell構(gòu)建了包含7萬(wàn)個(gè)詞的詞表,中文、英文、代碼的壓縮比分別為2.83、3.29、3.21,支持中英文和代碼的平衡且高效的編解碼。
在更小規(guī)模的各種基座架構(gòu)上進(jìn)行大量預(yù)訓(xùn)練實(shí)驗(yàn)后,CodeShell架構(gòu)設(shè)計(jì)最終融合了StarCoder和Llama兩者的核心特性。
以GPT-2為基礎(chǔ),采用fill-in-middle(FIM)模式支持代碼特有的補(bǔ)齊生成方法,引入Grouped-Query Attention和ROPE位置編碼,最終形成了CodeShell高性能且易于擴(kuò)展上下文窗口的獨(dú)特架構(gòu)。
為了獲得最大的分布式訓(xùn)練效率,Codeshell基于Megatron-LM,在Attention算子優(yōu)化、數(shù)據(jù)預(yù)處理、數(shù)據(jù)加載、日志輸出、狀態(tài)監(jiān)控、分布式訓(xùn)練管理等方面進(jìn)行了深度定制,支持Flash Attention2加速,訓(xùn)練吞吐量達(dá)到了每GPU每秒3400 Token的業(yè)界先進(jìn)水平。
CodeShell預(yù)訓(xùn)練的上下文窗口為8192。經(jīng)過(guò)5000億Token訓(xùn)練,CodeShell在humaneval和mbpp兩個(gè)主流評(píng)測(cè)數(shù)據(jù)集都體現(xiàn)了明顯的優(yōu)勢(shì)。在humaneval的其它編程語(yǔ)言評(píng)測(cè)中,如JavaScript、Java、C++,CodeShell依然性能領(lǐng)先。
在CodeShell的訓(xùn)練中團(tuán)隊(duì)發(fā)現(xiàn),通過(guò)刻意「刷榜」訓(xùn)練,可以讓代碼基座評(píng)分「虛高」,但是在實(shí)際應(yīng)用和微調(diào)中無(wú)法體現(xiàn)與分?jǐn)?shù)匹配的潛力。
為了驗(yàn)證CodeShell預(yù)訓(xùn)練的「純粹性」,團(tuán)隊(duì)采用WizardCoder的Evol-instruction數(shù)據(jù)構(gòu)建方法生成微調(diào)數(shù)據(jù),使用這份數(shù)據(jù)分別對(duì)CodeShell、CodeLlama、StarCoder進(jìn)行微調(diào),并用WizardCoder提供的Prompt進(jìn)行統(tǒng)一的HumanEval評(píng)估。這一場(chǎng)景下CodeShell依然保持優(yōu)異性能,充分驗(yàn)證了CodeShell的真實(shí)底座能力。
CodeShell在Hggingface權(quán)威的代碼大模型榜單中的表現(xiàn)也極其亮眼!在這份榜單中,各種經(jīng)過(guò)特定優(yōu)化的代碼基座和微調(diào)模型,在HumanEval評(píng)分上可以超越CodeLLama,但是體現(xiàn)綜合能力的綜合勝率(Win Rate)與CodeLlama卻依然有很大差距。
令人驚喜的是,CodeShell不僅在HumanEval上霸榜7B模型,綜合勝率與CodeLlama-7B持平??紤]到CodeLlama-7B訓(xùn)練的Token數(shù)量超過(guò)兩萬(wàn)五千億,而CodeShell的數(shù)量?jī)H為五分之一,這份榜單充分體現(xiàn)了CodeShell團(tuán)隊(duì)的技術(shù)實(shí)力。
正在研發(fā)中的CodeShell新版本將在強(qiáng)大的代碼能力基礎(chǔ)進(jìn)一步提升中英文處理能力,綜合能力值得更大的期待。
CodeShell-Chat:功能齊全的代碼助手模型
在CodeShell底座基礎(chǔ)上,團(tuán)隊(duì)面向真實(shí)的軟件開(kāi)發(fā)場(chǎng)景,通過(guò)高效微調(diào),訓(xùn)練了支持對(duì)話、代碼生成、代碼補(bǔ)齊、代碼注釋、代碼檢查與測(cè)試用例生成的全能代碼助手模型CodeShell-Chat。
為此,CodeShell團(tuán)隊(duì)分別構(gòu)造了數(shù)萬(wàn)條高質(zhì)量代碼對(duì)話數(shù)據(jù)和代碼補(bǔ)齊數(shù)據(jù),設(shè)計(jì)了基于規(guī)則與基于嵌入表示相結(jié)合的微調(diào)數(shù)據(jù)篩選方法,構(gòu)造了多任務(wù)一致的微調(diào)數(shù)據(jù)格式,并在基座模型上采用任務(wù)分類(lèi)優(yōu)化策略進(jìn)行小規(guī)模微調(diào),最終得到了高效實(shí)用的代碼助手模型。
為了進(jìn)一步降低使用門(mén)檻,支持輕量級(jí)本地部署,團(tuán)隊(duì)針對(duì)CodeShell獨(dú)有的架構(gòu)擴(kuò)展了llama.cpp —— 一個(gè)純 C/C++ 實(shí)現(xiàn)的LLaMA模型高效推理接口,以支持CodeShell的模型在各種計(jì)算架構(gòu)中的格式轉(zhuǎn)化、推理運(yùn)行以及量化部署。
在16G內(nèi)存的蘋(píng)果筆記本上進(jìn)行推理,響應(yīng)速率可達(dá)每秒18 Token,真實(shí)的使用體驗(yàn)非常流暢。
想象一下,一個(gè)在飛行途中的程序員,打開(kāi)普通的Mac電腦,即可使用性能幾乎無(wú)損、僅占4G內(nèi)存的4-bits量化版本。本地部署不僅保障了數(shù)據(jù)安全,更是可以隨時(shí)隨地使用!
方便易用的CodeShell代碼助手插件
對(duì)眾多開(kāi)發(fā)者而言,即便擁有功能強(qiáng)大的代碼助手模型,其應(yīng)用門(mén)檻仍然過(guò)高。
為此,CodeShell團(tuán)隊(duì)誠(chéng)意滿(mǎn)滿(mǎn)地把IDE插件也開(kāi)源了!
IDE插件目前支持VSCode和IntelliJ IDEA,適用于各種主流編程語(yǔ)言。
在開(kāi)發(fā)過(guò)程中,CodeShell代碼助手插件提供了兩種模式,即專(zhuān)注模式和交互模式,兩種模式相互協(xié)同,共同提升開(kāi)發(fā)效率。
在專(zhuān)注模式下,通過(guò)對(duì)當(dāng)前項(xiàng)目代碼的分析,提供代碼提示與補(bǔ)全功能,從而提高編程效率。
在交互模式下,IDE插件通過(guò)向代碼助手大模型發(fā)送特定的交互Prompt和用戶(hù)輸入,可提供豐富的功能,來(lái)看幾個(gè)實(shí)例。
智能問(wèn)答:在編程過(guò)程中直接向代碼助手模型提出問(wèn)題,無(wú)需切換至其他界面,支持對(duì)話與編程兩種場(chǎng)景無(wú)縫融合。
代碼解釋?zhuān)?/span>使用自然語(yǔ)言解釋代碼的運(yùn)行過(guò)程,讓開(kāi)發(fā)者更好地理解代碼的結(jié)構(gòu)和邏輯。
安全檢測(cè):檢測(cè)代碼中的潛在安全風(fēng)險(xiǎn),如可能出現(xiàn)的SQL注入、跨站腳本打擊等,幫助排查安全性風(fēng)險(xiǎn)。
其它功能還包括:
自動(dòng)添加注釋——為代碼自動(dòng)生成描述其功能、參數(shù)及返回值等相關(guān)信息的注釋?zhuān)?/span>
代碼優(yōu)化與審計(jì)——對(duì)代碼進(jìn)行深入分析,檢測(cè)潛在的錯(cuò)誤、冗余代碼和性能瓶頸,并為開(kāi)發(fā)者提供相應(yīng)的修復(fù)建議;
代碼格式檢查——自動(dòng)檢測(cè)代碼的排版和格式問(wèn)題,發(fā)現(xiàn)潛在的不規(guī)范現(xiàn)象;
性能評(píng)估——對(duì)代碼的性能風(fēng)險(xiǎn)進(jìn)行評(píng)估,發(fā)現(xiàn)潛在的性能瓶頸,為優(yōu)化代碼性能提供支持;
測(cè)試用例生成——基于代碼邏輯,自動(dòng)創(chuàng)建測(cè)試用例,以輔助進(jìn)行代碼測(cè)試和驗(yàn)證,確保代碼的正確性和穩(wěn)定性。
開(kāi)發(fā)者下載模型,在本地做簡(jiǎn)單操作和配置,即可馬上體驗(yàn)。
全面的代碼能力自動(dòng)評(píng)估工具
CodeShell團(tuán)隊(duì)同時(shí)發(fā)布了一個(gè)針對(duì)代碼助手能力的統(tǒng)一評(píng)估基準(zhǔn),近期將開(kāi)源并公開(kāi)論文,加入到CodeShell的開(kāi)源「全家桶」中。
在大模型評(píng)測(cè)上,CodeShell團(tuán)隊(duì)底蘊(yùn)深厚,團(tuán)隊(duì)此前曾經(jīng)發(fā)布過(guò)通用大模型對(duì)話能力的自動(dòng)評(píng)估工具PandaLM。
開(kāi)源地址:https://github.com/WeOpenML/PandaLM
CodeShell團(tuán)隊(duì)在模型訓(xùn)練中發(fā)現(xiàn),現(xiàn)有的評(píng)估基準(zhǔn)無(wú)法準(zhǔn)確反映其真實(shí)能力,其面臨的問(wèn)題包括試題難度較低、評(píng)估場(chǎng)景與實(shí)際開(kāi)發(fā)環(huán)境脫節(jié)等,同時(shí)評(píng)估基準(zhǔn)提供的任務(wù)上下文信息也非常有限,導(dǎo)致代碼大模型評(píng)估者難以進(jìn)行深入分析。
為此,CodeShell團(tuán)隊(duì)提出了一個(gè)包含完整程序上下文的多任務(wù)編程模型評(píng)估基準(zhǔn)CodeShell-UCB(Unified Code Bench)。
CodeShell-UCB的評(píng)估任務(wù)提供了完整的程序上下文信息,包括完整的真實(shí)項(xiàng)目代碼、運(yùn)行環(huán)境和執(zhí)行腳本。
CodeShell-UCB通過(guò)執(zhí)行程序分析、規(guī)則篩選、人工篩選,提煉出了代碼助手任務(wù)試題,并提供了一套統(tǒng)一的編譯、運(yùn)行、測(cè)試環(huán)境。
CodeShell-UCB的五個(gè)評(píng)測(cè)任務(wù)位覆蓋了軟件開(kāi)發(fā)的重要場(chǎng)景:
1. 代碼生成:關(guān)注如何自動(dòng)生成優(yōu)質(zhì)、符合要求的代碼片段。CodeShell-UCB包含了235個(gè)單函數(shù)代碼生成試題。
2. 基于被測(cè)代碼的測(cè)試用例生成:關(guān)注如何基于特定的被測(cè)代碼自動(dòng)生成有效、全面的測(cè)試用例。CodeShell-UCB包含了139個(gè)基于被測(cè)代碼的測(cè)試用例生成試題。
3. 基于問(wèn)題報(bào)告的測(cè)試用例生成:當(dāng)存在錯(cuò)誤報(bào)告時(shí),快速并精確地創(chuàng)建出相應(yīng)的測(cè)試用例,不僅可以幫助快速定位、修復(fù)問(wèn)題,同時(shí)也可以提高回歸測(cè)試的效率。CodeShell-UCB包含了58個(gè)基于問(wèn)題報(bào)告的測(cè)試用例生成試題。
4. 缺陷檢測(cè):自動(dòng)化的缺陷檢測(cè)能夠大幅度提高開(kāi)發(fā)效率并且減少人為疏漏造成的錯(cuò)誤。CodeShell-UCB包含了956個(gè)檢測(cè)樣本的標(biāo)簽平衡缺陷檢測(cè)試題。
5. 缺陷修復(fù):一旦缺陷被檢測(cè)出,如何對(duì)其進(jìn)行有效的修復(fù)也是一個(gè)復(fù)雜且重要的任務(wù)。CodeShell-UCB包含了478個(gè)單函數(shù)缺陷代碼的缺陷修復(fù)試題。
這五個(gè)任務(wù)提供了一個(gè)全面深入的評(píng)估方案,支持不同軟件開(kāi)發(fā)場(chǎng)景下檢驗(yàn)和評(píng)估代碼大模型的能力。
同時(shí),CodeShell-UCB推理框架具有較高的通用性,涵蓋了本地Huggingface模型的推理、本地Text-Generation-Inference的加速推理,以及使用閉源API(如OpenAI API、Claude API)的推理。
生成的代碼隨后會(huì)在CodeShell-UCB執(zhí)行器中運(yùn)行和評(píng)估,提供了包括編譯成功率、Pass@K、Pass@T以及測(cè)試覆蓋率在內(nèi)的多樣化、多維度的評(píng)估指標(biāo)。
下表展示了代碼助手CodeShell-Chat和在WizardCoder的對(duì)比。
盡管WizardCoder通過(guò)在CodeLlama上精心微調(diào)獲得了很高的HumanEval分?jǐn)?shù),但是在更加綜合全面的測(cè)試基準(zhǔn)下,CodeShell-Chat各種編碼任務(wù)下具有明顯的優(yōu)勢(shì),更適合軟件開(kāi)發(fā)的實(shí)際場(chǎng)景。
CodeShell-UCG評(píng)估基準(zhǔn)既可以用于評(píng)估模型的編程能力,也可以用于評(píng)估各種不同的Prompt設(shè)計(jì)策略,研究者可以在CodeShell-UCB的基礎(chǔ)上進(jìn)行數(shù)據(jù)與任務(wù)的擴(kuò)展并展開(kāi)更細(xì)致的模型分析。
北京大學(xué)軟件工程國(guó)家工程研究中心知識(shí)計(jì)算實(shí)驗(yàn)室(張世琨、葉蔚課題組)長(zhǎng)期關(guān)注軟件工程與人工智能交叉領(lǐng)域,聚焦程序語(yǔ)言與自然語(yǔ)言的語(yǔ)義理解與交互問(wèn)題,在打造CodeShell的過(guò)程中建立了一支大模型精英團(tuán)隊(duì),覆蓋基座預(yù)訓(xùn)練、基礎(chǔ)設(shè)施優(yōu)化、數(shù)據(jù)治理、模型微調(diào)與對(duì)齊、模型評(píng)估、模型量化與部署等核心環(huán)節(jié)與任務(wù),近期將推出更加重磅的模型與產(chǎn)品,敬請(qǐng)期待!