柚子快報邀請碼778899分享:Code Llama使用手冊
柚子快報邀請碼778899分享:Code Llama使用手冊
Code Llama 是 Llama 2 的一系列最先進(jìn)的開放訪問版本,專門用于代碼任務(wù),我們很高興發(fā)布與 Hugging Face 生態(tài)系統(tǒng)的集成! Code Llama 已使用與 Llama 2 相同的寬松社區(qū)許可證發(fā)布,并且可用于商業(yè)用途。
今天,我們很高興發(fā)布:
Hub 上的模型及其模型卡和許可證Transformer集成與文本生成推理集成,以實現(xiàn)快速高效的生產(chǎn)就緒推理與推理端點集成代碼基準(zhǔn)測試
代碼大模型對軟件工程師來說是一項令人興奮的發(fā)展,因為他們可以通過 IDE 中的代碼完成來提高生產(chǎn)力,處理重復(fù)或煩人的任務(wù),例如編寫文檔字符串或創(chuàng)建單元測試。
1、什么是Code Llama?
Code Llama 版本引入了一系列包含 7、13 和 340 億個參數(shù)的模型。 基礎(chǔ)模型從 Llama 2 初始化,然后在 5000 億個代碼數(shù)據(jù)上進(jìn)行訓(xùn)練。 Meta 對這些基本模型進(jìn)行了兩種不同風(fēng)格的微調(diào):Python 專家(1000 億個額外令牌)和指令微調(diào)版本,可以理解自然語言指令。
這些模型在 Python、C++、Java、PHP、C#、TypeScript 和 Bash 中展示了最先進(jìn)的性能。 7B 和 13B 基本和指令變體支持基于周圍內(nèi)容的填充,使它們非常適合用作代碼助手。
Code Llama 在 16k 上下文窗口上進(jìn)行訓(xùn)練。 此外,這三個模型變體還進(jìn)行了額外的長上下文微調(diào),使它們能夠管理最多 100,000 個令牌的上下文窗口。
由于 RoPE 擴(kuò)展的最新發(fā)展,將 Llama 2 的 4k 上下文窗口增加到 Code Llama 的 16k(可以推斷到 100k)是可能的。 社區(qū)發(fā)現(xiàn) Llama 的位置嵌入可以線性插值或在頻域中插值,這可以通過微調(diào)輕松過渡到更大的上下文窗口。 在 Code Llama 的情況下,頻域縮放是通過松弛完成的:微調(diào)長度是縮放的預(yù)訓(xùn)練長度的一小部分,從而使模型具有強(qiáng)大的外推能力。
所有模型最初都是在公開可用代碼的近乎重復(fù)數(shù)據(jù)刪除的數(shù)據(jù)集上使用 5000 億個令牌進(jìn)行訓(xùn)練。 該數(shù)據(jù)集還包含一些自然語言數(shù)據(jù)集,例如有關(guān)代碼和代碼片段的討論。 不幸的是,沒有有關(guān)該數(shù)據(jù)集的更多信息。
對于指令模型,他們使用了兩個數(shù)據(jù)集:為 Llama 2 Chat 收集的指令調(diào)整數(shù)據(jù)集和自指令數(shù)據(jù)集。 自指導(dǎo)數(shù)據(jù)集是通過使用 Llama 2 創(chuàng)建面試編程問題,然后使用 Code Llama 生成單元測試和解決方案,然后通過執(zhí)行測試來評估的。
2、如何使用Code Llama?
從 Transformers 4.33 版本開始,Code Llama 已在 Hugging Face 生態(tài)系統(tǒng)中可用。 在 Transformers 4.33 發(fā)布之前,請從主分支安裝它。
可以在此空間輕松嘗試 Code Llama 模型(130 億個參數(shù)?。?/p>
3、Transformers
隨著即將發(fā)布的 Transformers 4.33,你可以使用 Code Llama 并利用 HF 生態(tài)系統(tǒng)中的所有工具,例如:
訓(xùn)練和推理腳本和示例安全文件格式(safetensors)與bitsandbytes(4位量化)和PEFT(參數(shù)高效微調(diào))等工具集成使用模型運行生成的實用程序和助手導(dǎo)出模型以進(jìn)行部署的機(jī)制
在 Transformers 4.33 發(fā)布之前,請從主分支安裝它。
!pip install git+https://github.com/huggingface/transformers.git@main accelerate
解釋
4、代碼完成
7B 和 13B 模型可用于文本/代碼補(bǔ)全或填充。 以下代碼片段使用管道接口來演示文本完成。 只要你選擇 GPU 運行時,它就可以在 Colab 的免費層上運行。
from transformers import AutoTokenizer import transformers import torch tokenizer = AutoTokenizer.from_pretrained("codellama/CodeLlama-7b-hf") pipeline = transformers.pipeline( "text-generation", model="codellama/CodeLlama-7b-hf", torch_dtype=torch.float16, device_map="auto", ) sequences = pipeline( 'def fibonacci(', do_sample=True, temperature=0.2, top_p=0.9, num_return_sequences=1, eos_token_id=tokenizer.eos_token_id, max_length=100, ) for seq in sequences: print(f"Result: {seq['generated_text']}")
解釋
這可能會產(chǎn)生如下輸出:
Result: def fibonacci(n): if n == 0: return 0 elif n == 1: return 1 else: return fibonacci(n-1) + fibonacci(n-2) def fibonacci_memo(n, memo={}): if n == 0: return 0 elif n == 1: return
解釋
Code Llama 專門研究代碼理解,但它本身就是一種語言模型。 你可以使用相同的生成策略來自動完成注釋或一般文本。
5、代碼填充
這是特定于代碼模型的專門任務(wù)。 該模型經(jīng)過訓(xùn)練,可以生成與現(xiàn)有前綴和后綴最匹配的代碼(包括注釋)。 這是代碼助理通常使用的策略:要求他們填充當(dāng)前光標(biāo)位置,并考慮其前后出現(xiàn)的內(nèi)容。
此任務(wù)在 7B 和 13B 型號的基本版本和指令版本中可用。 它不適用于任何 34B 型號或 Python 版本。
要成功使用此功能,你需要密切注意用于訓(xùn)練此任務(wù)模型的格式,因為它使用特殊的分隔符來識別提示的不同部分。 讓我們看一個例子:
from transformers import AutoTokenizer, AutoModelForCausalLM import transformers import torch model_id = "codellama/CodeLlama-7b-hf" tokenizer = AutoTokenizer.from_pretrained(model_id) model = AutoModelForCausalLM.from_pretrained( model_id, torch_dtype=torch.float16 ).to("cuda") prefix = 'def remove_non_ascii(s: str) -> str:\n """ ' suffix = "\n return result\n" prompt = f"
{prefix}{suffix} " inputs = tokenizer(prompt, return_tensors="pt").to("cuda") output = model.generate( inputs["input_ids"], max_new_tokens=200, do_sample=False, ) output = output[0].to("cpu") print(tokenizer.decode(output)) 解釋
def remove_non_ascii(s: str) -> str: """return result Remove non-ASCII characters from a string. :param s: The string to remove non-ASCII characters from. :return: The string with non-ASCII characters removed. """ result = "" for c in s: if ord(c) < 128: result += c 解釋
為了使用補(bǔ)全功能,你需要處理輸出以剪切?
??和? ?標(biāo)記之間的文本 - 這就是我們提供的前綴和后綴之間的內(nèi)容。 6、對話指令
如上所述,基礎(chǔ)模型可用于完成和填充。 Code Llama 版本還包括一個可在對話界面中使用的指令微調(diào)模型。
為了準(zhǔn)備此任務(wù)的輸入,我們必須使用一個提示模板,就像我們的 Llama 2 博客文章中描述的那樣,我們在這里再次復(fù)制該模板:
[INST] <> {{ system_prompt }} < > {{ user_msg_1 }} [/INST] {{ model_answer_1 }}[INST] {{ user_msg_2 }} [/INST]解釋
請注意,系統(tǒng)提示是可選的 - 模型在沒有它的情況下也可以工作,但可以使用它來進(jìn)一步配置其行為或樣式。 例如,如果你總是希望獲得 JavaScript 中的答案,可以在此處聲明。 系統(tǒng)提示后,你需要提供對話中之前的所有交互:用戶詢問什么以及模型回答什么。 與填充情況一樣,需要注意使用的分隔符。 輸入的最終組成部分必須始終是新的用戶指令,這將是模型提供答案的信號。
以下代碼片段演示了該模板在實踐中的工作原理。
首次用戶查詢,系統(tǒng)無提示
user = 'In Bash, how do I list all text files in the current directory (excluding subdirectories) that have been modified in the last month?' prompt = f"
[INST] {user.strip()} [/INST]" inputs = tokenizer(prompt, return_tensors="pt", add_special_tokens=False).to("cuda")解釋
系統(tǒng)提示的首次用戶查詢:
system = "Provide answers in JavaScript" user = "Write a function that computes the set of sums of all contiguous sublists of a given list." prompt = f"
<>\\n{system}\\n< >\\n\\n{user}" inputs = tokenizer(prompt, return_tensors="pt", add_special_tokens=False).to("cuda")解釋
與先前答案的持續(xù)對話
該過程與 Llama 2 中的過程相同。為了最大程度地清晰起見,我們沒有使用循環(huán)或概括此示例代碼:
system = "System prompt" user_1 = "user_prompt_1" answer_1 = "answer_1" user_2 = "user_prompt_2" answer_2 = "answer_2" user_3 = "user_prompt_3" prompt = f"<
>\\n{system}\\n< >\\n\\n{user_1}" prompt = f"[INST] {prompt.strip()} [/INST] {answer_1.strip()}" prompt += f"[INST] {user_2.strip()} [/INST] {answer_2.strip()}" prompt += f"[INST] {user_3.strip()} [/INST]" inputs = tokenizer(prompt, return_tensors="pt", add_special_tokens=False).to("cuda")解釋
7、4位加載
將 Code Llama 集成到 Transformers 中意味著你可以立即獲得對 4 位加載等高級功能的支持。 這使你可以在 nvidia 3090 卡等消費類 GPU 上運行大型 32B 參數(shù)模型!
以下是在 4 位模式下運行推理的方法:
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig import torch model_id = "codellama/CodeLlama-34b-hf" quantization_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_compute_dtype=torch.float16 ) tokenizer = AutoTokenizer.from_pretrained(model_id) model = AutoModelForCausalLM.from_pretrained( model_id, quantization_config=quantization_config, device_map="auto", ) prompt = 'def remove_non_ascii(s: str) -> str:\n """ ' inputs = tokenizer(prompt, return_tensors="pt").to("cuda") output = model.generate( inputs["input_ids"], max_new_tokens=200, do_sample=True, top_p=0.9, temperature=0.1, ) output = output[0].to("cpu") print(tokenizer.decode(output))
解釋
8、使用文本生成推理和推理端點
文本生成推理是 Hugging Face 開發(fā)的生產(chǎn)就緒推理容器,可輕松部署大型語言模型。 它具有連續(xù)批處理、令牌流、用于在多個 GPU 上快速推理的張量并行性以及生產(chǎn)就緒的日志記錄和跟蹤等功能。
你可以在自己的基礎(chǔ)設(shè)施上嘗試文本生成推理,也可以使用 Hugging Face 的推理端點。 要部署 Code llama 2 模型,請轉(zhuǎn)到模型頁面并單擊部署 -> 推理端點小部件。
對于 7B 模型,我們建議你選擇“GPU [中] - 1x Nvidia A10G”。對于 13B 模型,我們建議你選擇“GPU [xlarge] - 1x Nvidia A100”。對于 34B 模型,我們建議你選擇啟用了位和字節(jié)量化的“GPU [1xlarge] - 1x Nvidia A100”或“GPU [2xlarge] - 2x Nvidia A100”
注意:你可能需要通過電子郵件請求配額升級才能訪問 A100
你可以在我們的博客中了解有關(guān)如何使用 Hugging Face Inference Endpoints 部署 LLM 的更多信息。 該博客包含有關(guān)支持的超參數(shù)以及如何使用 Python 和 Javascript 流式傳輸響應(yīng)的信息。
9、評估
代碼語言模型通常在 HumanEval 等數(shù)據(jù)集上進(jìn)行基準(zhǔn)測試。 它由編程挑戰(zhàn)組成,其中模型帶有函數(shù)簽名和文檔字符串,并負(fù)責(zé)完成函數(shù)體。 然后通過運行一組預(yù)定義的單元測試來驗證所提出的解決方案。 最后,報告通過率,描述有多少解決方案通過了所有測試。 pass@1 率描述了模型在一次嘗試時生成通過解決方案的頻率,而 pass@10 描述了從 10 個提議的候選方案中至少有一個解決方案通過的頻率。
雖然 HumanEval 是一個 Python 基準(zhǔn)測試,但我們已經(jīng)付出了巨大努力將其轉(zhuǎn)換為更多編程語言,從而實現(xiàn)更全面的評估。 其中一種方法是 MultiPL-E,它將 HumanEval 翻譯成十多種語言。 我們正在基于它托管一個多語言代碼排行榜,以便社區(qū)可以比較不同語言的模型,以評估哪種模型最適合他們的用例。
模型許可數(shù)據(jù)集已知商業(yè)用途?預(yù)訓(xùn)練長度 [tokens]PythonJavaScript排行榜平均分?jǐn)?shù)CodeLlaMa-34BLlama 2許可證??2,500B45.1141.6633.89CodeLlaMa-13BLlama 2許可證??2,500B35.0738.2628.35CodeLlaMa-7BLlama 2許可證??2,500B29.9831.824.36CodeLlaMa-34B-PythonLlama 2許可證??2,620B53.2944.7233.87CodeLlaMa-13B-PythonLlama 2許可證??2,620B42.8940.6628.67CodeLlaMa-7B-PythonLlama 2許可證??2,620B40.4836.3423.5CodeLlaMa-34B-InstructLlama 2許可證??2,620B50.7945.8535.09CodeLlaMa-13B-InstructLlama 2許可證??2,620B50.640.9131.29CodeLlaMa-7B-InstructLlama 2許可證??2,620B45.6533.1126.45StarCoder-15BBigCode-OpenRail-M??1,035B33.5730.7922.74StarCoderBase-15BBigCode-OpenRail-M??1,000B30.3531.722.4WizardCoder-15BBigCode-OpenRail-M??1,035B58.1241.9132.07OctoCoder-15BBigCode-OpenRail-M??1,000B45.332.824.01CodeGeeX-2-6BCodeGeeX許可證??2,000B33.4929.921.23CodeGen-2.5-7B-MonoApache-2.0??1400B45.6523.2212.1CodeGen-2.5-7B-MultiApache-2.0??1400B28.726.2720.04
注意:上表中顯示的分?jǐn)?shù)來自我們的代碼排行榜,我們在其中評估具有相同設(shè)置的所有模型。 更多詳情請參閱排行榜。
柚子快報邀請碼778899分享:Code Llama使用手冊
精彩文章
評論可見,查看隱藏內(nèi)容
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。