模型概述
模型特點
模型能力
使用案例
🚀 Code Llama
Code Llama是一系列預訓練和微調的生成式文本模型,參數規模從70億到700億不等。本倉庫是採用Hugging Face Transformers格式的700億參數指令微調版本。該模型專為通用代碼合成和理解而設計。其他模型的鏈接可在底部索引中找到。
🚀 快速開始
安裝依賴
首先,你需要安裝transformers
庫:
pip install transformers accelerate
聊天使用示例
700億參數的指令模型與較小版本使用 不同的提示模板。若要使用transformers
庫調用該模型,建議使用內置的聊天模板:
from transformers import AutoTokenizer, AutoModelForCausalLM
import transformers
import torch
model_id = "codellama/CodeLlama-70b-Instruct-hf"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.float16,
device_map="auto",
)
chat = [
{"role": "system", "content": "You are a helpful and honest code assistant expert in JavaScript. Please, provide all answers to programming questions in JavaScript"},
{"role": "user", "content": "Write a function that computes the set of sums of all contiguous sublists of a given list."},
]
inputs = tokenizer.apply_chat_template(chat, return_tensors="pt").to("cuda")
output = model.generate(input_ids=inputs, max_new_tokens=200)
output = output[0].to("cpu")
print(tokenizer.decode(output))
文本或代碼補全示例
你還可以使用該模型進行 文本或代碼補全。以下示例使用了transformers
庫的pipeline
接口:
from transformers import AutoTokenizer
import transformers
import torch
model_id = "codellama/CodeLlama-70b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_id)
pipeline = transformers.pipeline(
"text-generation",
model=model_id,
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']}")
✨ 主要特性
- [x] 代碼補全。
- [ ] 代碼填充。
- [x] 指令/聊天。
- [ ] Python專業支持。
📚 詳細文檔
不同規模和變體模型鏈接
聊天提示模板
CodeLlama 70B Instruct與之前的Llama 2或CodeLlama模型使用不同的聊天提示格式。如前文所述,最簡單的使用方法是藉助分詞器的聊天模板。若你需要手動構建字符串或標記,可參考以下步驟。
我們使用以下虛構對話進行測試:
chat = [
{"role": "system", "content": "System prompt "},
{"role": "user", "content": "First user query"},
{"role": "assistant", "content": "Model response to first query"},
{"role": "user", "content": "Second user query"},
]
首先,讓我們看看使用聊天模板時提示的樣子:
tokenizer.apply_chat_template(chat, tokenize=False)
輸出結果:
'<s>Source: system\n\n System prompt <step> Source: user\n\n First user query <step> Source: assistant\n\n Model response to first query <step> Source: user\n\n Second user query <step> Source: assistant\nDestination: user\n\n '
可見,對話的每一回合都有一個Source
(system
、user
或assistant
),然後內容會在兩個換行符和一個空格後出現。回合之間用特殊標記<step>
分隔。在最後一回合(必須來自user
)之後,我們使用特殊語法Source: assistant\nDestination: user\n\n
邀請模型進行回覆。讓我們看看如何手動構建相同的字符串:
output = "<s>"
for m in chat:
output += f"Source: {m['role']}\n\n {m['content'].strip()}"
output += " <step> "
output += "Source: assistant\nDestination: user\n\n "
output
輸出結果:
'<s>Source: system\n\n System prompt <step> Source: user\n\n First user query <step> Source: assistant\n\n Model response to first query <step> Source: user\n\n Second user query <step> Source: assistant\nDestination: user\n\n '
為驗證我們的構建是否正確,我們將與 原始GitHub倉庫中的參考代碼 進行比較。我們使用相同的對話,並使用dialog_prompt_tokens
函數對其進行分詞,得到以下標記:
reference_tokens = [1, 7562, 29901, 1788, 13, 13, 2184, 9508, 32015, 7562, 29901, 1404, 13, 13, 3824, 1404, 2346, 32015, 7562, 29901, 20255, 13, 13, 8125, 2933, 304, 937, 2346, 32015, 7562, 29901, 1404, 13, 13, 6440, 1404, 2346, 32015, 7562, 29901, 20255, 13, 14994, 3381, 29901, 1404, 13, 13, 29871]
讓我們看看使用Python循環構建的字符串分詞後得到的結果。注意,我們不添加“特殊標記”,因為字符串已經以<s>
(句子開始標記)開頭:
tokens = tokenizer.encode(output, add_special_tokens=False)
assert reference_tokens == tokens
同樣,讓我們驗證聊天模板是否生成相同的標記序列:
assert reference_tokens == tokenizer.apply_chat_template(chat)
最後需要注意的是,如果對話不是以system
回合開始,原始代碼會插入一個內容為空的system
回合。
🔧 技術細節
模型詳情
- 模型開發者:Meta
- 變體:Code Llama有四種模型規模和三種變體:
- Code Llama:專為通用代碼合成和理解設計的基礎模型。
- Code Llama - Python:專門為Python設計。
- Code Llama - Instruct:用於遵循指令和更安全的部署。 所有變體都有70億、130億、340億和700億參數的版本。
- 本倉庫包含:700億參數指令版本的模型。
- 輸入:模型僅接受文本輸入。
- 輸出:模型僅生成文本輸出。
- 模型架構:Code Llama是一個自迴歸語言模型,採用優化的Transformer架構。它經過最多16k標記的微調,不支持長達100k標記的長上下文。
- 模型訓練時間:Code Llama及其變體於2023年1月至2024年1月期間進行訓練。
- 狀態:這是一個基於離線數據集訓練的靜態模型。隨著我們根據社區反饋改進模型安全性,未來將發佈Code Llama - Instruct的新版本。
- 許可證:可在 https://ai.meta.com/resources/models-and-libraries/llama-downloads/ 獲取自定義商業許可證。
- 研究論文:更多信息可在論文 "Code Llama: Open Foundation Models for Code" 或其 arXiv頁面 中找到。
預期用途
- 預期用例:Code Llama及其變體旨在用於英語和相關編程語言的商業和研究用途。基礎模型Code Llama可用於各種代碼合成和理解任務,Code Llama - Python專門用於處理Python編程語言,Code Llama - Instruct旨在更安全地用於代碼助手和生成應用程序。
- 非預期用途:禁止以任何違反適用法律法規(包括貿易合規法律)的方式使用。禁止使用英語以外的語言。禁止以Code Llama及其變體的可接受使用政策和許可協議所禁止的任何其他方式使用。
硬件和軟件
- 訓練因素:我們使用了自定義訓練庫。已發佈模型的訓練和微調在Meta的研究超級集群上進行。
- 碳足跡:總體而言,訓練所有12個Code Llama模型需要在A100 - 80GB類型的硬件(TDP為350 - 400W)上進行1400K GPU小時的計算。估計總排放量為228.55 tCO2eq,其中100%由Meta的可持續發展計劃抵消。
評估結果
請參閱研究論文第3節中主要模型的評估和詳細消融實驗,以及第4節中的安全評估。
倫理考慮和侷限性
Code Llama及其變體是一項新技術,使用時存在風險。到目前為止進行的測試均使用英語,且無法涵蓋所有場景。因此,與所有大語言模型一樣,Code Llama的潛在輸出無法提前預測,在某些情況下,模型可能會對用戶提示產生不準確或令人反感的響應。因此,在部署Code Llama的任何應用程序之前,開發者應針對其特定應用進行安全測試和調整。
請參閱 https://ai.meta.com/llama/responsible-use-guide 上的負責任使用指南。
📄 許可證
本模型的使用受Meta許可證的約束。自定義商業許可證可在 https://ai.meta.com/resources/models-and-libraries/llama-downloads/ 獲取。
⚠️ 重要提示
這是一個非官方的Code Llama倉庫。你可以在 Meta Llama組織 中找到官方的Meta倉庫。



