Transformers 文档
CodeLlama
并获得增强的文档体验
开始使用
此模型于 2023-08-24 发布,并于 2023-08-25 添加到 Hugging Face Transformers。
CodeLlama
Code Llama 是基于 Llama 2 的专门用于代码任务的大型语言模型系列。它有不同的版本——通用代码、Python 特定版本以及指令遵循版本——所有这些都提供 7B、13B、34B 和 70B 参数。Code Llama 模型可以生成、解释甚至填充代码中的缺失部分(称为“infilling”)。它还可以处理非常长的上下文,生成最多可达 100k token 的稳定生成,尽管它是在 16K token 的序列上训练的。
您可以在 Code Llama 集合下找到所有原始 Code Llama 检查点。
点击侧边栏右侧的 Code Llama 模型,以获取更多关于如何将 Code Llama 应用于不同代码任务的示例。
下面的示例演示了如何使用 Pipeline、AutoModel 或从命令行生成代码。
import torch
from transformers import pipeline
pipe = pipeline(
"text-generation",
model="meta-llama/CodeLlama-7b-hf",
dtype=torch.float16,
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, CodeLlamaTokenizer, BitsAndBytesConfig
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",
dtype=torch.bfloat16,
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。分词器会分割此 token 以创建一个遵循 原始训练模式的格式化输入字符串。这比自行准备模式更健壮。from transformers import LlamaForCausalLM, CodeLlamaTokenizer tokenizer = CodeLlamaTokenizer.from_pretrained("meta-llama/CodeLlama-7b-hf") model = LlamaForCausalLM.from_pretrained("meta-llama/CodeLlama-7b-hf") PROMPT = '''def remove_non_ascii(s: str) -> str: """ <FILL_ME> return result ''' input_ids = tokenizer(PROMPT, return_tensors="pt")["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
< source >( 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, optional, defaults toFalse) — 是否在解码后清理空格,清理包括移除可能存在的额外空格。 - unk_token (
str, optional, defaults to"<unk>") — 未知 token。词汇表中不存在的 token 无法转换为 ID,而是被设置为此 token。 - bos_token (
str, optional, defaults to"<s>") — 预训练期间使用的序列起始 token。可以作为序列分类器 token 使用。 - eos_token (
str, optional, defaults to"</s>") — 序列结束 token。 - prefix_token (
str, optional, defaults to"▁<PRE>") — 用于 infilling 的前缀 token。 - middle_token (
str, optional, defaults to"▁<MID>") — 用于 infilling 的中间 token。 - suffix_token (
str, optional, defaults to"▁<SUF>") — 用于 infilling 的后缀 token。 - eot_token (
str, optional, defaults to"▁<EOT>") — 用于 infilling 的文本结束 token。 - fill_token (
str, optional, defaults to"<FILL_ME>") — 用于分割输入中前缀和后缀的 token。 - additional_special_tokens (
list[str], optional) — 分词器使用的额外特殊 token。 - add_bos_token (
bool, optional, defaults toTrue) — 是否在序列开头添加序列起始 token。 - add_eos_token (
bool, optional, defaults toFalse) — 是否在序列末尾添加序列结束 token。 - use_default_system_prompt (
bool, optional, defaults toFalse) — 是否使用 Llama 的默认系统提示。 - add_prefix_space (
bool, optional) — 是否添加前导空格。这允许将前导词视为与其他词一样。 - vocab (
str,dictorlist, optional) — 自定义词汇表字典。如果未提供,则从 vocab_file 加载词汇表。 - merges (
strorlist, optional) — 自定义 merges 列表。如果未提供,则从 merges_file 加载 merges。 - vocab_file (
str, optional) — 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 的配置相匹配,后者支持 prompt infilling。
get_special_tokens_mask
< source >( 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
< source >( 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, optional, defaults toFalse) — 是否在解码后清理空格,清理包括移除可能存在的额外空格。 - unk_token (
str, optional, defaults to"<unk>") — 未知 token。词汇表中不存在的 token 无法转换为 ID,而是被设置为此 token。 - bos_token (
str, optional, defaults to"<s>") — 预训练期间使用的序列起始 token。可以作为序列分类器 token 使用。 - eos_token (
str, optional, defaults to"</s>") — 序列结束 token。 - prefix_token (
str, optional, defaults to"▁<PRE>") — 用于 infilling 的前缀 token。 - middle_token (
str, optional, defaults to"▁<MID>") — 用于 infilling 的中间 token。 - suffix_token (
str, optional, defaults to"▁<SUF>") — 用于 infilling 的后缀 token。 - eot_token (
str, optional, defaults to"▁<EOT>") — 用于 infilling 的文本结束 token。 - fill_token (
str, optional, defaults to"<FILL_ME>") — 用于分割输入中前缀和后缀的 token。 - additional_special_tokens (
list[str], optional) — 分词器使用的额外特殊 token。 - add_bos_token (
bool, optional, defaults toTrue) — 是否在序列开头添加序列起始 token。 - add_eos_token (
bool, optional, defaults toFalse) — 是否在序列末尾添加序列结束 token。 - use_default_system_prompt (
bool, optional, defaults toFalse) — 是否使用 Llama 的默认系统提示。 - add_prefix_space (
bool, optional) — 是否添加前导空格。这允许将前导词视为与其他词一样。 - vocab (
str,dictorlist, optional) — 自定义词汇表字典。如果未提供,则从 vocab_file 加载词汇表。 - merges (
strorlist, optional) — 自定义 merges 列表。如果未提供,则从 merges_file 加载 merges。 - vocab_file (
str, optional) — 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 的配置相匹配,后者支持 prompt infilling。
get_special_tokens_mask
< source >( 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 更新底层后处理器。