Code Llama:Llama 2 學(xué)會(huì)寫代碼了!

引言
Code Llama 是為代碼類任務(wù)而生的一組最先進(jìn)的、開放的 Llama 2 模型,我們很高興能將其集成入 Hugging Face 生態(tài)系統(tǒng)!Code Llama 使用與 Llama 2 相同的社區(qū)許可證,且可商用。
今天,我們很高興能發(fā)布 Hugging Face 對(duì) Code Llama 的全面支持 , 包括:
Hub 上的模型支持,包括模型卡及許可證
Transformers 已集成 Code Llama
TGI 已集成 Code Llama,以支持對(duì)其進(jìn)行快速高效的產(chǎn)品級(jí)推理
推理終端 (Inference Endpoints) 已集成 Code Llama
對(duì) Code Llama 的代碼基準(zhǔn)測(cè)試結(jié)果已發(fā)布
代碼大語(yǔ)言模型的發(fā)展對(duì)于軟件工程師來(lái)說(shuō)無(wú)疑是振奮人心的,因?yàn)檫@意味著他們可以通過 IDE 中的代碼補(bǔ)全功能來(lái)提高生產(chǎn)力,并利用其來(lái)處理重復(fù)或煩人的任務(wù),例如為代碼編寫文檔字符串或創(chuàng)建單元測(cè)試。
目錄
引言
目錄
Code Llama 簡(jiǎn)介
如何使用 Code Llama?
代碼補(bǔ)全
代碼填充
對(duì)話式指令
4 比特加載
演示
Transformers
使用 TGI 和推理終端
評(píng)估
其他資源
Code Llama 簡(jiǎn)介
Code Llama 包含 3 個(gè)不同參數(shù)量的版本,分別為: 7 億參數(shù)版、13 億參數(shù)版 以及 340 億參數(shù)版。在訓(xùn)練基礎(chǔ)模型時(shí),先用同等參數(shù)量的 Llama 2 模型初始化權(quán)重,然后在 5000 億詞元的代碼數(shù)據(jù)集上訓(xùn)練。 Meta 還對(duì)訓(xùn)得的基礎(chǔ)模型進(jìn)行了兩種不同風(fēng)格的微調(diào),分別為: Python 專家版 (再加 1000 億個(gè)額外詞元) ; 以及指令微調(diào)版,其可以理解自然語(yǔ)言指令。
這些模型在 Python、C++、Java、PHP、C#、TypeScript 和 Bash 中都展現(xiàn)出最先進(jìn)的性能。7B 和 13B 基礎(chǔ)版和指令版支持完形填空,因此非常適合用作代碼助手。
Code Llama 基于 16k 上下文窗口訓(xùn)練。此外,這三個(gè)尺寸的模型還進(jìn)行了額外的長(zhǎng)上下文微調(diào),使其上下文窗口最多可擴(kuò)展至 10 萬(wàn)詞元。
受益于 RoPE 擴(kuò)展方面的最新進(jìn)展,將 Llama 2 的 4k 上下文窗口增加到 Code Llama 的 16k (甚至可以外插至 100k) 成為可能。社區(qū)發(fā)現(xiàn)可以對(duì) Llama 的位置嵌入進(jìn)行線性插值或頻域插值,這使得通過微調(diào)讓基礎(chǔ)模型輕松擴(kuò)展到更大的上下文窗口成為可能。在 Code Llama 中,他們把頻域縮放和松弛技術(shù)二者結(jié)合起來(lái): 微調(diào)長(zhǎng)度是縮放后的預(yù)訓(xùn)練長(zhǎng)度的一小部分。這個(gè)做法賦予了模型強(qiáng)大的外推能力。

第一步是在 5000 億詞元的公開代碼數(shù)據(jù)集上訓(xùn)練出一個(gè)模型。該數(shù)據(jù)集中除了有代碼數(shù)據(jù)集外,還包含一些自然語(yǔ)言數(shù)據(jù)集,例如有關(guān)代碼和代碼片段的討論,且最終數(shù)據(jù)集是使用近似去重法去過重的。不幸的是,Meta 沒有披露有關(guān)該數(shù)據(jù)集的更多信息。
在對(duì)模型進(jìn)行指令微調(diào)時(shí),使用了兩個(gè)數(shù)據(jù)集: 為 Llama 2 Chat 收集的指令微調(diào)數(shù)據(jù)集和自指令數(shù)據(jù)集。自指令數(shù)據(jù)集收集了 Llama 2 編制出的編程面試問題,然后使用 Code Llama 生成單元測(cè)試和解答,最后通過執(zhí)行測(cè)試來(lái)評(píng)估解答。
如何使用 Code Llama?
Transformers
從 4.33 版開始支持 Code Llama。在此之前,需要從主分支進(jìn)行源代碼安裝才行。
演示
我們準(zhǔn)備了 這個(gè) Space 或下面的 Playground 以供大家嘗試 Code Llama 模型 (130 億參數(shù)!):

這個(gè)演示背后使用了 Hugging Face TGI,HuggingChat 也用了相同的技術(shù),具體內(nèi)容見下文。
你還可以玩玩 這個(gè)聊天機(jī)器人,或者復(fù)制一份到自己的賬號(hào)下以供你使用 – 它是自含的,因此你可以隨心所欲地修改代碼!
Transformers
從最新發(fā)布的 transformers
4.33 開始,你可以在 Code Llama 上應(yīng)用 HF 生態(tài)系統(tǒng)中的所有工具,例如:
訓(xùn)練和推理腳本和示例
安全的文件格式 (
safetensors
)與
bitsandbytes
(4 比特量化) 和 PEFT 等工具結(jié)合使用運(yùn)行模型生成所需的工具及輔助代碼
導(dǎo)出模型以進(jìn)行部署的機(jī)制
在 transformers
4.33 發(fā)布之前,用戶需要從主分支源碼安裝 transformers
。
代碼補(bǔ)全
我們可以使用 7B 和 13B 模型進(jìn)行文本/代碼補(bǔ)全或填充。下述代碼演示了如何使用 pipeline
接口來(lái)進(jìn)行文本補(bǔ)全。運(yùn)行時(shí),只需選擇 GPU 即可在 Colab 的免費(fèi) GPU 上運(yùn)行。
Code Llama 雖然專精于代碼理解,但其仍是一個(gè)語(yǔ)言模型。你仍然可以使用相同的生成策略來(lái)自動(dòng)完成注釋或自然語(yǔ)言文本。
代碼填充
這是代碼模型才能完成的專門任務(wù)。該模型經(jīng)過訓(xùn)練后,可以生成與給定上下文最匹配的代碼 (包括注釋)。這是代碼助理的典型使用場(chǎng)景: 要求它們根據(jù)上下文填充當(dāng)前光標(biāo)處的代碼。
此任務(wù)需要使用 7B 和 13B 的 基礎(chǔ) 或 指令 模型。任何 34B 或 Python 版模型不能用于此任務(wù)。
填充類任務(wù)需要在生成時(shí)使用與訓(xùn)練時(shí)相同格式的輸入文本,因?yàn)橛?xùn)練時(shí)會(huì)使用特殊的分隔符來(lái)區(qū)分提示的不同部分。幸運(yùn)的是, transformers
的 CodeLlamaTokenizer
已經(jīng)幫你把這事做了,如下所示:?
在底層,分詞器會(huì) 自動(dòng)按 <fill_me>
分割 并生成一個(gè)格式化的輸入字符串,其格式與 訓(xùn)練時(shí)的格式 相同。這樣做既避免了用戶自己格式化的很多麻煩,也避免了一些很難調(diào)試的陷阱,例如詞元粘合 (token glueing)。
對(duì)話式指令
如上所述,基礎(chǔ)模型可用于補(bǔ)全和填充。Code Llama 還包含一個(gè)適用于對(duì)話場(chǎng)景的指令微調(diào)模型。
為此類任務(wù)準(zhǔn)備輸入時(shí),我們需要一個(gè)提示模板。一個(gè)例子是我們?cè)?Llama 2 博文 中描述的模板,如下:?
請(qǐng)注意,系統(tǒng)提示 ( system prompt
) 是可選的 - 沒有它模型也能工作,但你可以用它來(lái)進(jìn)一步指定模型的行為或風(fēng)格。例如,如果你希望獲得 JavaScript 的答案,即可在此聲明。在系統(tǒng)提示之后,你需要提供對(duì)話交互歷史: 用戶問了什么以及模型回答了什么。與填充場(chǎng)景一樣,你需要注意分隔符的使用。輸入的最后必須是新的用戶指令,這對(duì)模型而言是讓其提供答案的信號(hào)。
以下代碼片段演示了如何在實(shí)際工作中使用該模板。
首次用戶輸入,無(wú)系統(tǒng)提示
2. 首次用戶查詢,有系統(tǒng)提示
3. 含對(duì)話歷史的多輪對(duì)話
該過程與 Llama 2 中的過程相同。為了最清楚起見,我們沒有使用循環(huán)或泛化此示例代碼:?
4 比特加載
將 Code Llama 集成到 Transformers 中意味著我們可以立即獲得 4 比特加載等高級(jí)功能的支持。這使得用戶可以在英偉達(dá) 3090 卡等消費(fèi)類 GPU 上運(yùn)行大型的 32B 參數(shù)量模型!
以下是在 4 比特模式下運(yùn)行推理的方法:?
使用 TGI 和推理終端
TGI 是 Hugging Face 開發(fā)的生產(chǎn)級(jí)推理容器,可用于輕松部署大語(yǔ)言模型。它包含連續(xù)批處理、流式輸出、基于張量并行的多 GPU 快速推理以及生產(chǎn)級(jí)的日志記錄和跟蹤等功能。
你可以在自己的基礎(chǔ)設(shè)施上使用 TGI,也可以使用 Hugging Face 的 推理終端。要部署 Codellama 2 模型,請(qǐng)登陸其 模型頁(yè)面,然后單擊 Deploy -> Inference Endpoints 按鈕。
推理 7B 模型,我們建議選擇“GPU [medium] - 1x Nvidia A10G”。
推理 13B 模型,我們建議選擇“GPU [xlarge] - 1x Nvidia A100”。
推理 34B 模型,我們建議啟用
bitsandbytes
量化并選擇“GPU [1xlarge] - 1x Nvidia A100”或“GPU [2xlarge] - 2x Nvidia A100”
注意: 你可能需要發(fā)郵件給 api-enterprise@huggingface.co 申請(qǐng)配額升級(jí)才能訪問 A100
你可以在我們的博文中詳細(xì)了解如何 使用 Hugging Face 推理終端部署 LLM,該 博文 還包含了有關(guān)其支持的超參以及如何使用 Python 和 Javascript API 流式生成文本的相關(guān)知識(shí)。
評(píng)估
代碼語(yǔ)言模型通常在 HumanEval 等數(shù)據(jù)集上進(jìn)行基準(zhǔn)測(cè)試,其包含了一系列編程題,我們將函數(shù)簽名和文檔字符串輸入給模型,模型需要完成函數(shù)體代碼的編寫。接著是運(yùn)行一組預(yù)定義的單元測(cè)試來(lái)驗(yàn)證所提出的解答。最后是報(bào)告通過率,即有多少解答通過了所有測(cè)試。pass@1 度量了模型一次生成即通過的頻率,而 pass@10 描述了模型生成 10 個(gè)候選解答其中至少有一個(gè)解答通過的頻率。
雖然 HumanEval 是一個(gè) Python 基準(zhǔn)測(cè)試,但社區(qū)付出了巨大努力將其轉(zhuǎn)成更多編程語(yǔ)言,從而實(shí)現(xiàn)更全面的評(píng)估。其中一種方法是 MultiPL-E,它將 HumanEval 翻譯成十多種編程語(yǔ)言。我們正在基于其制作一個(gè) 多語(yǔ)言代碼排行榜,這樣社區(qū)就可以用它來(lái)比較不同模型在各種編程語(yǔ)言上的表現(xiàn),以評(píng)估哪個(gè)模型最適合他們的需求。

注意: 上表中的分?jǐn)?shù)來(lái)自我們的代碼排行榜,所有模型均使用相同的設(shè)置。欲了解更多詳情,請(qǐng)參閱 排行榜。
其他資源
Hub 上的模型
論文
Meta 官宣博文
負(fù)責(zé)任使用指南
演示 (代碼補(bǔ)全,流式生成)
演示 (指令微調(diào)、自含、可復(fù)制到自己的空間并修改)
英文原文: https://hf.co/blog/codellama
原文作者: Philipp Schmid,Omar Sanseviero,Pedro Cuenca,Lewis Tunstall,Leandro von Werra,Loubna Ben Allal,Arthur Zucker,Joao Gante
譯者: Matrix Yao (姚偉峰),英特爾深度學(xué)習(xí)工程師,工作方向?yàn)?transformer-family 模型在各模態(tài)數(shù)據(jù)上的應(yīng)用及大規(guī)模模型的訓(xùn)練推理。
審校/排版: zhongdongy (阿東)