Transformers 文档
CodeLlama
并获得增强的文档体验
开始使用
该模型于 2023 年 8 月 24 日在 HF 论文中发布,并于 2023 年 8 月 25 日贡献给 Hugging Face Transformers。
CodeLlama
Code Llama 是一个专门用于编程任务的大型语言模型系列,基于 Llama 2 构建。它有多种版本——通用代码版、Python 专用版和指令微调版——均提供 7B、13B、34B 和 70B 参数规模。Code Llama 模型可以生成、解释甚至补全你代码中缺失的部分(称为“填充”,infilling)。尽管它是在 16K token 的序列上训练的,但它也能处理非常长的上下文,并实现高达 100k token 的稳定生成。
你可以在 Code Llama 合集中找到所有原始的 Code Llama 检查点。
点击右侧侧边栏中的 Code Llama 模型,查看更多关于如何将 Code Llama 应用于不同编程任务的示例。
下面的示例演示了如何使用 Pipeline 或 AutoModel 以及命令行来生成代码。
from transformers import pipeline
pipe = pipeline(
"text-generation",
model="meta-llama/CodeLlama-7b-hf",
device_map=0
)
# basic code generation
result = pipe("# Function to calculate the factorial of a number\ndef factorial(n):", max_new_tokens=256)
print(result[0]['generated_text'])
# infilling
infill_result = pipe("def remove_non_ascii(s: str) -> str:\n \"\"\" <FILL_ME>\n return result", max_new_tokens=200)
print(infill_result[0]['generated_text'])量化通过以较低精度表示权重来减少大型模型的内存负担。有关更多可用量化后端,请参阅量化概述。
以下示例使用 bitsandbytes 仅将权重量化为 4 位。
# pip install bitsandbytes
import torch
from transformers import AutoModelForCausalLM, BitsAndBytesConfig, CodeLlamaTokenizer
bnb_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_quant_type="nf4", bnb_4bit_use_double_quant=True)
tokenizer = CodeLlamaTokenizer.from_pretrained("meta-llama/CodeLlama-34b-hf")
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/CodeLlama-34b-hf",
device_map="auto",
quantization_config=bnb_config
)
prompt = "# Write a Python function to check if a string is a palindrome\ndef is_palindrome(s):"
input_ids = tokenizer(prompt, return_tensors="pt").to(model.device)
output = model.generate(**input_ids, max_new_tokens=200, cache_implementation="static")
print(tokenizer.decode(output[0], skip_special_tokens=True))使用 AttentionMaskVisualizer 可以更好地了解模型可以关注哪些 token,不能关注哪些 token。
from transformers.utils.attention_visualizer import AttentionMaskVisualizer
visualizer = AttentionMaskVisualizer("meta-llama/CodeLlama-7b-hf")
visualizer("""def func(a, b):
return a + b""")
注意事项
填充(Infilling)功能仅适用于 7B 和 13B 基础模型,不适用于 Python、Instruct、34B 或 70B 模型。
在你想要填充输入的地方使用
<FILL_ME>token。分词器(Tokenizer)会分割此 token 以创建遵循原始训练模式的格式化输入字符串。这比你自己准备模式要稳健得多。from transformers import LlamaForCausalLM, CodeLlamaTokenizer tokenizer = CodeLlamaTokenizer.from_pretrained("meta-llama/CodeLlama-7b-hf") model = LlamaForCausalLM.from_pretrained("meta-llama/CodeLlama-7b-hf", device_map="auto") PROMPT = '''def remove_non_ascii(s: str) -> str: """ <FILL_ME> return result ''' input_ids = tokenizer(PROMPT, return_tensors="pt").to(model.device)["input_ids"] generated_ids = model.generate(input_ids, max_new_tokens=128) filling = tokenizer.batch_decode(generated_ids[:, input_ids.shape[1]:], skip_special_tokens = True)[0] print(PROMPT.replace("<FILL_ME>", filling))使用
bfloat16进行进一步的训练或微调,使用float16进行推理。BOS字符在编码前缀或后缀时不会用于填充,仅在每个提示词的开头使用。tokenizer 是基于 SentencePiece 的字节对编码模型。在解码过程中,如果第一个 token 是单词的开头(例如,“Banana”),tokenizer 不会在字符串前面加上前缀空格。
CodeLlamaTokenizer
class transformers.CodeLlamaTokenizer
< 源码 >( vocab: str | dict[str, int] | None = None merges: str | list[str] | None = None clean_up_tokenization_spaces = False unk_token = '<unk>' bos_token = '<s>' eos_token = '</s>' prefix_token = '▁<PRE>' middle_token = '▁<MID>' suffix_token = '▁<SUF>' eot_token = '▁<EOT>' fill_token = '<FILL_ME>' additional_special_tokens = None use_default_system_prompt: bool = False add_prefix_space: bool | None = True add_bos_token: bool = True **kwargs )
参数
- clean_up_tokenization_spaces (
str, 可选, 默认为False) — 解码后是否清理空格,清理操作包括去除多余空格等伪影。 - unk_token (
str, 可选, 默认为"<unk>") — 未知 token。词汇表中不存在的 token 无法转换为 ID,会被设置为此 token。 - bos_token (
str, 可选, 默认为"<s>") — 预训练期间使用的序列开始 token。可用作序列分类器 token。 - eos_token (
str, 可选, 默认为"</s>") — 序列结束 token。 - prefix_token (
str, 可选, 默认为"▁<PRE>") — 用于填充的前缀 token。 - middle_token (
str, 可选, 默认为"▁<MID>") — 用于填充的中间 token。 - suffix_token (
str, 可选, 默认为"▁<SUF>") — 用于填充的后缀 token。 - eot_token (
str, 可选, 默认为"▁<EOT>") — 用于填充的文本结束 token。 - fill_token (
str, 可选, 默认为"<FILL_ME>") — 用于在前缀和后缀之间分割输入的 token。 - additional_special_tokens (
list[str], 可选) — 分词器使用的其他特殊 token。 - add_bos_token (
bool, 可选, 默认为True) — 是否在序列开头添加序列开始 token。 - add_eos_token (
bool, 可选, 默认为False) — 是否在序列末尾添加序列结束 token。 - use_default_system_prompt (
bool, 可选, 默认为False) — 是否使用 Llama 的默认系统提示词。 - add_prefix_space (
bool, 可选) — 是否在输入中添加初始空格。这允许将首个单词像其他单词一样处理。 - vocab (
str,dict或list, 可选) — 自定义词汇表字典。如果不提供,将从 vocab_file 加载词汇表。 - merges (
str或list, 可选) — 自定义合并列表。如果不提供,将从 merges_file 加载合并列表。 - vocab_file (
str, 可选) — 包含实例化分词器所需词汇表的 SentencePiece 文件(通常具有 .model 扩展名)。
构建 Llama 分词器。基于字节级字节对编码。
这主要使用 ByteFallback 且不进行规范化。
>>> from transformers import CodeLlamaTokenizer
>>> tokenizer = CodeLlamaTokenizer.from_pretrained("hf-internal-testing/llama-tokenizer")
>>> tokenizer.encode("Hello this is a test")
[1, 15043, 445, 338, 263, 1243]如果您想更改 bos_token 或 eos_token,请确保在初始化模型时指定它们,或调用 tokenizer.update_post_processor() 以确保后处理正确完成(否则编码序列的第一个token和最后一个token的值将不正确)。有关更多详细信息,请查看 [post-processors] (https://huggingface.co/docs/tokenizers/api/post-processors) 文档。
此分词器继承自包含大多数主要方法的 PreTrainedTokenizerFast。用户应参考该超类以了解有关这些方法的更多信息。默认配置与 meta-llama/CodeLlama-7b-Instruct-hf 相匹配,该配置支持提示词填充。
get_special_tokens_mask
< 源码 >( token_ids_0: list[int] token_ids_1: list[int] | None = None already_has_special_tokens: bool = False ) → 一个介于 0 和 1 之间的整数列表
Retrieve sequence ids from a token list that has no special tokens added.
For fast tokenizers, data collators call this with already_has_special_tokens=True to build a mask over an already-formatted sequence. In that case, we compute the mask by checking membership in all_special_ids.
CodeLlamaTokenizerFast
class transformers.CodeLlamaTokenizer
< 源码 >( vocab: str | dict[str, int] | None = None merges: str | list[str] | None = None clean_up_tokenization_spaces = False unk_token = '<unk>' bos_token = '<s>' eos_token = '</s>' prefix_token = '▁<PRE>' middle_token = '▁<MID>' suffix_token = '▁<SUF>' eot_token = '▁<EOT>' fill_token = '<FILL_ME>' additional_special_tokens = None use_default_system_prompt: bool = False add_prefix_space: bool | None = True add_bos_token: bool = True **kwargs )
参数
- clean_up_tokenization_spaces (
str, 可选, 默认为False) — 解码后是否清理空格,清理操作包括去除多余空格等伪影。 - unk_token (
str, 可选, 默认为"<unk>") — 未知 token。词汇表中不存在的 token 无法转换为 ID,会被设置为此 token。 - bos_token (
str, 可选, 默认为"<s>") — 预训练期间使用的序列开始 token。可用作序列分类器 token。 - eos_token (
str, 可选, 默认为"</s>") — 序列结束 token。 - prefix_token (
str, 可选, 默认为"▁<PRE>") — 用于填充的前缀 token。 - middle_token (
str, 可选, 默认为"▁<MID>") — 用于填充的中间 token。 - suffix_token (
str, 可选, 默认为"▁<SUF>") — 用于填充的后缀 token。 - eot_token (
str, 可选, 默认为"▁<EOT>") — 用于填充的文本结束 token。 - fill_token (
str, 可选, 默认为"<FILL_ME>") — 用于在前缀和后缀之间分割输入的 token。 - additional_special_tokens (
list[str], 可选) — 分词器使用的其他特殊 token。 - add_bos_token (
bool, 可选, 默认为True) — 是否在序列开头添加序列开始 token。 - add_eos_token (
bool, 可选, 默认为False) — 是否在序列末尾添加序列结束 token。 - use_default_system_prompt (
bool, 可选, 默认为False) — 是否使用 Llama 的默认系统提示词。 - add_prefix_space (
bool, 可选) — 是否在输入中添加初始空格。这允许将首个单词像其他单词一样处理。 - vocab (
str,dict或list, 可选) — 自定义词汇表字典。如果不提供,将从 vocab_file 加载词汇表。 - merges (
str或list, 可选) — 自定义合并列表。如果不提供,将从 merges_file 加载合并列表。 - vocab_file (
str, 可选) — 包含实例化分词器所需词汇表的 SentencePiece 文件(通常具有 .model 扩展名)。
构建 Llama 分词器。基于字节级字节对编码。
这主要使用 ByteFallback 且不进行规范化。
>>> from transformers import CodeLlamaTokenizer
>>> tokenizer = CodeLlamaTokenizer.from_pretrained("hf-internal-testing/llama-tokenizer")
>>> tokenizer.encode("Hello this is a test")
[1, 15043, 445, 338, 263, 1243]如果您想更改 bos_token 或 eos_token,请确保在初始化模型时指定它们,或调用 tokenizer.update_post_processor() 以确保后处理正确完成(否则编码序列的第一个token和最后一个token的值将不正确)。有关更多详细信息,请查看 [post-processors] (https://huggingface.co/docs/tokenizers/api/post-processors) 文档。
此分词器继承自包含大多数主要方法的 PreTrainedTokenizerFast。用户应参考该超类以了解有关这些方法的更多信息。默认配置与 meta-llama/CodeLlama-7b-Instruct-hf 相匹配,该配置支持提示词填充。
get_special_tokens_mask
< 源码 >( token_ids_0: list[int] token_ids_1: list[int] | None = None already_has_special_tokens: bool = False ) → 一个介于 0 和 1 之间的整数列表
Retrieve sequence ids from a token list that has no special tokens added.
For fast tokenizers, data collators call this with already_has_special_tokens=True to build a mask over an already-formatted sequence. In that case, we compute the mask by checking membership in all_special_ids.
使用当前的 bos_token 和 eos_token 更新底层后处理器。