模型简介
模型特点
模型能力
使用案例
🚀 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仓库。



