Transformers documentation

CodeLlama

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

该模型于 2023-08-24 在 HF papers 上发布,并于 2023-08-25 贡献至 Hugging Face Transformers。

CodeLlama

Code Llama 是一个基于 Llama 2 构建的、专为编码任务设计的大语言模型系列。它提供多种变体——通用代码、Python 专用以及指令跟随版本——均提供 7B、13B、34B 和 70B 参数规模。Code Llama 模型能够生成、解释代码,甚至补全代码中缺失的部分(即“infilling”)。尽管其训练序列长度为 16K tokens,它仍能处理超长上下文,并稳定生成多达 100k tokens 的内容。

您可以在 Code Llama 集合中找到所有原始的 Code Llama 检查点。

点击右侧边栏中的 Code Llama 模型,以查看更多将 Code Llama 应用于不同编码任务的示例。

下面的示例演示了如何使用 Pipeline、AutoModel 或命令行来生成代码。

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。

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> 标记。分词器会将该标记拆分,以生成遵循 原始训练模式 的格式化输入字符串。这比自行准备模式更加稳健。

    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 字符不用于填充,仅在每个提示的开头使用。

  • 分词器是一个基于 SentencePiece 的字节对编码模型。在解码过程中,如果第一个 token 是单词的开头(例如,“Banana”),分词器不会在字符串前添加前缀空格。

CodeLlamaTokenizer

类 transformers.CodeLlamaTokenizer

< >

( vocab: str | dict[str, int] | None = Nonemerges: str | list[str] | None = Noneclean_up_tokenization_spaces = Falseunk_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 = Noneuse_default_system_prompt: bool = Falseadd_prefix_space: bool | None = Trueadd_bos_token: bool = True**kwargs )

参数

  • clean_up_tokenization_spaces (str,可选,默认为 False) — 是否在解码后清理空格。清理操作包括移除多余空格等潜在伪影。
  • unk_token (str,可选,默认为 "<unk>") — 未知标记。不在词汇表中的标记无法转换为 ID,因此会被设置为该标记。
  • bos_token (str,可选,默认为 "<s>") — 预训练期间使用的序列起始标记。可用作序列分类器标记。
  • eos_token (str,可选,默认为 "</s>") — 序列结束标记。
  • prefix_token (str,可选,默认为 "▁<PRE>") — 用于填充(infilling)的前缀标记。
  • middle_token (str,可选,默认为 "▁<MID>") — 用于填充的中间标记。
  • suffix_token (str,可选,默认为 "▁<SUF>") — 用于填充(infilling)的后缀标记。
  • eot_token (str,可选,默认为 "▁<EOT>") — 用于文本填充的文本结束标记。
  • fill_token (str,可选,默认为 "<FILL_ME>") — 用于将输入拆分为前缀和后缀的标记。
  • additional_special_tokens (list[str],可选) — 分词器使用的额外特殊标记。
  • add_bos_token (bool,可选,默认为 True) — 是否在序列开头添加序列起始(beginning of sequence)标记。
  • add_eos_token (bool,可选,默认为 False) — 是否在序列末尾添加序列结束(end of sequence)标记。
  • use_default_system_prompt (bool,可选,默认为 False) — 是否使用 Llama 的默认系统提示词。
  • add_prefix_space (bool, 可选) — 是否要在输入前添加一个初始空格。这可以将开头的单词视为与其他单词相同。
  • vocab (str、dict 或 list,可选) — 自定义词汇表。如果未提供,则从 vocab_file 加载词汇表。
  • merges(str 或 list,可选)— 自定义 merges 列表。如果未提供,则从 merges_file 加载 merges。
  • vocab_file (str, 可选) — 包含实例化分词器所需词汇表的 SentencePiece 文件(通常具有 .model 扩展名)。

构建一个 Llama 分词器。基于字节级 Byte-Pair-Encoding。

此处显著使用了 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

< >

( token_ids_0: list[int]token_ids_1: list[int] | None = Nonealready_has_special_tokens: bool = False ) → A list of integers in the range [0, 1]

参数

  • token_ids_0 — (可能已格式化的)序列的 ID 列表。
  • token_ids_1 — 当 already_has_special_tokens=True 时未使用。在这种情况下,该值必须为 None。
  • already_has_special_tokens — 序列是否已使用特殊标记进行格式化。

返回值

一个取值范围为 [0, 1] 的整数列表

1 表示特殊标记,0 表示序列标记。

从未添加特殊标记的标记列表中检索序列 ID。

对于快速分词器,数据整理器会传入 already_has_special_tokens=True 来调用此方法,以在已格式化的序列上构建掩码。在这种情况下,我们通过检查元素是否属于 all_special_ids 来计算掩码。

update_post_processor

< >

( )

使用当前的 bos_token 和 eos_token 更新底层的后处理器。

save_vocabulary

< >

( save_directory: strfilename_prefix: str | None = None )

CodeLlamaTokenizerFast

类 transformers.CodeLlamaTokenizer

< >

( vocab: str | dict[str, int] | None = Nonemerges: str | list[str] | None = Noneclean_up_tokenization_spaces = Falseunk_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 = Noneuse_default_system_prompt: bool = Falseadd_prefix_space: bool | None = Trueadd_bos_token: bool = True**kwargs )

参数

  • clean_up_tokenization_spaces (str,可选,默认为 False) — 是否在解码后清理空格。清理操作包括移除多余空格等潜在伪影。
  • unk_token (str,可选,默认为 "<unk>") — 未知标记。不在词汇表中的标记无法转换为 ID,因此会被设置为该标记。
  • bos_token (str,可选,默认为 "<s>") — 预训练期间使用的序列起始标记。可用作序列分类器标记。
  • eos_token (str,可选,默认为 "</s>") — 序列结束标记。
  • prefix_token (str,可选,默认为 "▁<PRE>") — 用于填充(infilling)的前缀标记。
  • middle_token (str,可选,默认为 "▁<MID>") — 用于填充的中间标记。
  • suffix_token (str,可选,默认为 "▁<SUF>") — 用于填充(infilling)的后缀标记。
  • eot_token (str,可选,默认为 "▁<EOT>") — 用于文本填充的文本结束标记。
  • fill_token (str,可选,默认为 "<FILL_ME>") — 用于在输入中分隔前缀和后缀的标记。
  • additional_special_tokens (list[str],可选) — 分词器使用的额外特殊标记。
  • add_bos_token (bool,可选,默认为 True) — 是否在序列开头添加序列起始(beginning of sequence)标记。
  • add_eos_token (bool,可选,默认为 False) — 是否在序列末尾添加序列结束(end of sequence)标记。
  • use_default_system_prompt (bool,可选,默认为 False) — 是否使用 Llama 的默认系统提示词。
  • add_prefix_space (bool, 可选) — 是否要在输入前添加一个初始空格。这可以将开头的单词视为与其他单词相同。
  • vocab (str、dict 或 list,可选) — 自定义词汇表。如果未提供,则从 vocab_file 加载词汇表。
  • merges(str 或 list,可选)— 自定义 merges 列表。如果未提供,则从 merges_file 加载 merges。
  • vocab_file (str, 可选) — 包含实例化分词器所需词汇表的 SentencePiece 文件(通常具有 .model 扩展名)。

构建一个 Llama 分词器。基于字节级 Byte-Pair-Encoding。

此处显著使用了 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)。

set_infilling_processor

< >

( resetsuffix_first = Falseadd_special_tokens = True )

更新 normalizer,以确保 infilling 的提示格式得到遵守。infilling 的格式如下:如果 suffix_first ” <PRE> <SUF>{suf} <MID> {pre}” 否则: ” <PRE> {pre} <SUF>{suf} <MID>”

如果 reset 设置为 True,normalizer 和 post_processor 将恢复为“正常”行为,即 normalizer 会添加前导空格,而 post_processor 会在输入文本中添加 bos_token。

Update on GitHub