柚子快報(bào)邀請(qǐng)碼778899分享:Code Llama使用手冊(cè)
柚子快報(bào)邀請(qǐng)碼778899分享:Code Llama使用手冊(cè)
Code Llama 是 Llama 2 的一系列最先進(jìn)的開(kāi)放訪問(wèn)版本,專門用于代碼任務(wù),我們很高興發(fā)布與 Hugging Face 生態(tài)系統(tǒng)的集成! Code Llama 已使用與 Llama 2 相同的寬松社區(qū)許可證發(fā)布,并且可用于商業(yè)用途。
今天,我們很高興發(fā)布:
Hub 上的模型及其模型卡和許可證Transformer集成與文本生成推理集成,以實(shí)現(xiàn)快速高效的生產(chǎn)就緒推理與推理端點(diǎn)集成代碼基準(zhǔn)測(cè)試
代碼大模型對(duì)軟件工程師來(lái)說(shuō)是一項(xiàng)令人興奮的發(fā)展,因?yàn)樗麄兛梢酝ㄟ^(guò) IDE 中的代碼完成來(lái)提高生產(chǎn)力,處理重復(fù)或煩人的任務(wù),例如編寫文檔字符串或創(chuàng)建單元測(cè)試。
1、什么是Code Llama?
Code Llama 版本引入了一系列包含 7、13 和 340 億個(gè)參數(shù)的模型。 基礎(chǔ)模型從 Llama 2 初始化,然后在 5000 億個(gè)代碼數(shù)據(jù)上進(jìn)行訓(xùn)練。 Meta 對(duì)這些基本模型進(jìn)行了兩種不同風(fēng)格的微調(diào):Python 專家(1000 億個(gè)額外令牌)和指令微調(diào)版本,可以理解自然語(yǔ)言指令。
這些模型在 Python、C++、Java、PHP、C#、TypeScript 和 Bash 中展示了最先進(jìn)的性能。 7B 和 13B 基本和指令變體支持基于周圍內(nèi)容的填充,使它們非常適合用作代碼助手。
Code Llama 在 16k 上下文窗口上進(jìn)行訓(xùn)練。 此外,這三個(gè)模型變體還進(jìn)行了額外的長(zhǎng)上下文微調(diào),使它們能夠管理最多 100,000 個(gè)令牌的上下文窗口。
由于 RoPE 擴(kuò)展的最新發(fā)展,將 Llama 2 的 4k 上下文窗口增加到 Code Llama 的 16k(可以推斷到 100k)是可能的。 社區(qū)發(fā)現(xiàn) Llama 的位置嵌入可以線性插值或在頻域中插值,這可以通過(guò)微調(diào)輕松過(guò)渡到更大的上下文窗口。 在 Code Llama 的情況下,頻域縮放是通過(guò)松弛完成的:微調(diào)長(zhǎng)度是縮放的預(yù)訓(xùn)練長(zhǎng)度的一小部分,從而使模型具有強(qiáng)大的外推能力。
所有模型最初都是在公開(kāi)可用代碼的近乎重復(fù)數(shù)據(jù)刪除的數(shù)據(jù)集上使用 5000 億個(gè)令牌進(jìn)行訓(xùn)練。 該數(shù)據(jù)集還包含一些自然語(yǔ)言數(shù)據(jù)集,例如有關(guān)代碼和代碼片段的討論。 不幸的是,沒(méi)有有關(guān)該數(shù)據(jù)集的更多信息。
對(duì)于指令模型,他們使用了兩個(gè)數(shù)據(jù)集:為 Llama 2 Chat 收集的指令調(diào)整數(shù)據(jù)集和自指令數(shù)據(jù)集。 自指導(dǎo)數(shù)據(jù)集是通過(guò)使用 Llama 2 創(chuàng)建面試編程問(wèn)題,然后使用 Code Llama 生成單元測(cè)試和解決方案,然后通過(guò)執(zhí)行測(cè)試來(lái)評(píng)估的。
2、如何使用Code Llama?
從 Transformers 4.33 版本開(kāi)始,Code Llama 已在 Hugging Face 生態(tài)系統(tǒng)中可用。 在 Transformers 4.33 發(fā)布之前,請(qǐng)從主分支安裝它。
可以在此空間輕松嘗試 Code Llama 模型(130 億個(gè)參數(shù)?。?/p>
3、Transformers
隨著即將發(fā)布的 Transformers 4.33,你可以使用 Code Llama 并利用 HF 生態(tài)系統(tǒng)中的所有工具,例如:
訓(xùn)練和推理腳本和示例安全文件格式(safetensors)與bitsandbytes(4位量化)和PEFT(參數(shù)高效微調(diào))等工具集成使用模型運(yùn)行生成的實(shí)用程序和助手導(dǎo)出模型以進(jìn)行部署的機(jī)制
在 Transformers 4.33 發(fā)布之前,請(qǐng)從主分支安裝它。
!pip install git+https://github.com/huggingface/transformers.git@main accelerate
解釋
4、代碼完成
7B 和 13B 模型可用于文本/代碼補(bǔ)全或填充。 以下代碼片段使用管道接口來(lái)演示文本完成。 只要你選擇 GPU 運(yùn)行時(shí),它就可以在 Colab 的免費(fèi)層上運(yùn)行。
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']}")
解釋
這可能會(huì)產(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 專門研究代碼理解,但它本身就是一種語(yǔ)言模型。 你可以使用相同的生成策略來(lái)自動(dòng)完成注釋或一般文本。
5、代碼填充
這是特定于代碼模型的專門任務(wù)。 該模型經(jīng)過(guò)訓(xùn)練,可以生成與現(xiàn)有前綴和后綴最匹配的代碼(包括注釋)。 這是代碼助理通常使用的策略:要求他們填充當(dāng)前光標(biāo)位置,并考慮其前后出現(xiàn)的內(nèi)容。
此任務(wù)在 7B 和 13B 型號(hào)的基本版本和指令版本中可用。 它不適用于任何 34B 型號(hào)或 Python 版本。
要成功使用此功能,你需要密切注意用于訓(xùn)練此任務(wù)模型的格式,因?yàn)樗褂锰厥獾姆指舴麃?lái)識(shí)別提示的不同部分。 讓我們看一個(gè)例子:
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、對(duì)話指令
如上所述,基礎(chǔ)模型可用于完成和填充。 Code Llama 版本還包括一個(gè)可在對(duì)話界面中使用的指令微調(diào)模型。
為了準(zhǔn)備此任務(wù)的輸入,我們必須使用一個(gè)提示模板,就像我們的 Llama 2 博客文章中描述的那樣,我們?cè)谶@里再次復(fù)制該模板:
[INST] <> {{ system_prompt }} < > {{ user_msg_1 }} [/INST] {{ model_answer_1 }}[INST] {{ user_msg_2 }} [/INST]解釋
請(qǐng)注意,系統(tǒng)提示是可選的 - 模型在沒(méi)有它的情況下也可以工作,但可以使用它來(lái)進(jìn)一步配置其行為或樣式。 例如,如果你總是希望獲得 JavaScript 中的答案,可以在此處聲明。 系統(tǒng)提示后,你需要提供對(duì)話中之前的所有交互:用戶詢問(wèn)什么以及模型回答什么。 與填充情況一樣,需要注意使用的分隔符。 輸入的最終組成部分必須始終是新的用戶指令,這將是模型提供答案的信號(hào)。
以下代碼片段演示了該模板在實(shí)踐中的工作原理。
首次用戶查詢,系統(tǒng)無(wú)提示
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ù)對(duì)話
該過(guò)程與 Llama 2 中的過(guò)程相同。為了最大程度地清晰起見(jiàn),我們沒(méi)有使用循環(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 中意味著你可以立即獲得對(duì) 4 位加載等高級(jí)功能的支持。 這使你可以在 nvidia 3090 卡等消費(fèi)類 GPU 上運(yùn)行大型 32B 參數(shù)模型!
以下是在 4 位模式下運(yùn)行推理的方法:
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、使用文本生成推理和推理端點(diǎn)
文本生成推理是 Hugging Face 開(kāi)發(fā)的生產(chǎn)就緒推理容器,可輕松部署大型語(yǔ)言模型。 它具有連續(xù)批處理、令牌流、用于在多個(gè) GPU 上快速推理的張量并行性以及生產(chǎn)就緒的日志記錄和跟蹤等功能。
你可以在自己的基礎(chǔ)設(shè)施上嘗試文本生成推理,也可以使用 Hugging Face 的推理端點(diǎn)。 要部署 Code llama 2 模型,請(qǐng)轉(zhuǎn)到模型頁(yè)面并單擊部署 -> 推理端點(diǎn)小部件。
對(duì)于 7B 模型,我們建議你選擇“GPU [中] - 1x Nvidia A10G”。對(duì)于 13B 模型,我們建議你選擇“GPU [xlarge] - 1x Nvidia A100”。對(duì)于 34B 模型,我們建議你選擇啟用了位和字節(jié)量化的“GPU [1xlarge] - 1x Nvidia A100”或“GPU [2xlarge] - 2x Nvidia A100”
注意:你可能需要通過(guò)電子郵件請(qǐng)求配額升級(jí)才能訪問(wèn) A100
你可以在我們的博客中了解有關(guān)如何使用 Hugging Face Inference Endpoints 部署 LLM 的更多信息。 該博客包含有關(guān)支持的超參數(shù)以及如何使用 Python 和 Javascript 流式傳輸響應(yīng)的信息。
9、評(píng)估
代碼語(yǔ)言模型通常在 HumanEval 等數(shù)據(jù)集上進(jìn)行基準(zhǔn)測(cè)試。 它由編程挑戰(zhàn)組成,其中模型帶有函數(shù)簽名和文檔字符串,并負(fù)責(zé)完成函數(shù)體。 然后通過(guò)運(yùn)行一組預(yù)定義的單元測(cè)試來(lái)驗(yàn)證所提出的解決方案。 最后,報(bào)告通過(guò)率,描述有多少解決方案通過(guò)了所有測(cè)試。 pass@1 率描述了模型在一次嘗試時(shí)生成通過(guò)解決方案的頻率,而 pass@10 描述了從 10 個(gè)提議的候選方案中至少有一個(gè)解決方案通過(guò)的頻率。
雖然 HumanEval 是一個(gè) Python 基準(zhǔn)測(cè)試,但我們已經(jīng)付出了巨大努力將其轉(zhuǎn)換為更多編程語(yǔ)言,從而實(shí)現(xiàn)更全面的評(píng)估。 其中一種方法是 MultiPL-E,它將 HumanEval 翻譯成十多種語(yǔ)言。 我們正在基于它托管一個(gè)多語(yǔ)言代碼排行榜,以便社區(qū)可以比較不同語(yǔ)言的模型,以評(píng)估哪種模型最適合他們的用例。
模型許可數(shù)據(jù)集已知商業(yè)用途?預(yù)訓(xùn)練長(zhǎng)度 [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ù)來(lái)自我們的代碼排行榜,我們?cè)谄渲性u(píng)估具有相同設(shè)置的所有模型。 更多詳情請(qǐng)參閱排行榜。
柚子快報(bào)邀請(qǐng)碼778899分享:Code Llama使用手冊(cè)
精彩文章
評(píng)論可見(jiàn),查看隱藏內(nèi)容
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。