Transformers 文档

CodeLlama

Hugging Face's logo
加入Hugging Face社区

并获得增强的文档体验

开始使用

CodeLlama

概述

Code Llama 模型在 Baptiste Rozière、Jonas Gehring、Fabian Gloeckle、Sten Sootla、Itai Gat、Xiaoqing Ellen Tan、Yossi Adi、Jingyu Liu、Tal Remez、Jérémy Rapin、Artyom Kozhevnikov、Ivan Evtimov、Joanna Bitton、Manish Bhatt、Cristian Canton Ferrer、Aaron Grattafiori、Wenhan Xiong、Alexandre Défossez、Jade Copet、Faisal Azhar、Hugo Touvron、Louis Martin、Nicolas Usunier、Thomas Scialom、Gabriel Synnaeve 撰写的 Code Llama: Open Foundation Models for Code 中被提出。

论文中的摘要如下:

我们发布了 Code Llama,这是一个基于 Llama 2 的用于代码的大型语言模型家族,在开放模型中提供了最先进的性能、填充功能、对大型输入上下文的支持,以及针对编程任务的零样本指令遵循能力。我们提供了多种版本以涵盖广泛的应用:基础模型(Code Llama)、Python 特化模型(Code Llama - Python)和指令遵循模型(Code Llama - Instruct),每个版本分别具有 7B、13B 和 34B 参数。所有模型都使用 16k 个标记的序列进行训练,并在最多 100k 个标记的输入上显示改进。7B 和 13B 的 Code Llama 和 Code Llama - Instruct 版本支持基于周围内容的填充。Code Llama 在多个代码基准测试中实现了开放模型中最高的性能,在 HumanEval 和 MBPP 上的分数分别高达 53% 和 55%。值得注意的是,Code Llama - Python 7B 在 HumanEval 和 MBPP 上的性能优于 Llama 2 70B,并且我们所有的模型在 MultiPL-E 上都优于任何其他公开可用的模型。我们以许可的许可证发布 Code Llama,允许用于研究和商业用途。

查看所有 Code Llama 模型检查点 此处 以及 Meta Llama 组织中官方发布的模型 此处

该模型由 ArthurZucker 贡献。作者的原始代码可以在这里找到 此处

使用技巧和示例

Code Llama 所基于的 Llama2 系列模型使用 bfloat16 进行训练,但原始推理使用 float16。让我们看看不同的精度。

  • float32:PyTorch 在模型初始化时的约定是,无论模型权重以哪种 dtype 存储,都以 float32 加载模型。transformers 也遵循此约定,以保持与 PyTorch 的一致性。这将是默认选择。如果您希望 AutoModel API 使用存储权重类型的加载检查点,则必须指定 torch_dtype="auto",例如 model = AutoModelForCausalLM.from_pretrained("path", torch_dtype = "auto")
  • bfloat16:Code Llama 使用此精度进行训练,因此我们建议将其用于进一步训练或微调。
  • float16:我们建议使用此精度运行推理,因为它通常比 bfloat16 更快,并且评估指标显示相对于 bfloat16 没有任何明显的下降。您也可以使用 bfloat16 运行推理,我们建议您在微调后检查 float16bfloat16 的推理结果。

如上所述,存储权重的 dtype 在您初始化模型时使用 torch_dtype="auto" 之前基本上是无关紧要的。原因是模型将首先被下载(使用在线检查点的 dtype),然后将被转换为 torch 的默认 dtype(变为 torch.float32)。如果指定了 torch_dtype,则将使用它。

技巧

  • 填充任务开箱即用。您应该在希望输入被填充的位置使用 tokenizer.fill_token
  • 模型转换脚本与 Llama2 系列相同。

以下是一个使用示例

python src/transformers/models/llama/convert_llama_weights_to_hf.py \
    --input_dir /path/to/downloaded/llama/weights --model_size 7B --output_dir /output/path

请注意,执行脚本需要足够的 CPU RAM 来以 float16 精度托管整个模型(即使最大的版本包含在多个检查点中,它们也分别包含模型每个权重的一部分,因此我们需要将它们全部加载到 RAM 中)。

转换后,模型和标记器可以通过以下方式加载:

>>> 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))
def remove_non_ascii(s: str) -> str:
    """ Remove non-ASCII characters from a string.
<BLANKLINE>
    Args:
        s: The string to remove non-ASCII characters from.
<BLANKLINE>
    Returns:
        The string with non-ASCII characters removed.
    """
    result = ""
    for c in s:
        if ord(c) < 128:
            result += c
    return result
<BLANKLINE>

如果您只需要填充的部分

>>> from transformers import pipeline
>>> import torch

>>> generator = pipeline("text-generation",model="meta-llama/CodeLlama-7b-hf",torch_dtype=torch.float16, device_map="auto")
>>> generator('def remove_non_ascii(s: str) -> str:\n    """ <FILL_ME>\n    return result', max_new_tokens = 128)
[{'generated_text': 'def remove_non_ascii(s: str) -> str:\n    """ <FILL_ME>\n    return resultRemove non-ASCII characters from a string. """\n    result = ""\n    for c in s:\n        if ord(c) < 128:\n            result += c'}]

在后台,标记器 自动以 <FILL_ME> 分割 以创建遵循 原始训练模式 的格式化输入字符串。这比自己准备模式更稳健:它避免了很难调试的陷阱,例如标记粘贴。要查看此模型或其他模型需要多少 CPU 和 GPU 内存,请尝试使用 此计算器,它可以帮助确定该值。

LLaMA 标记器是基于 sentencepiece 的 BPE 模型。sentencepiece 的一个特性是,在解码序列时,如果第一个标记是单词的开头(例如“Banana”),则标记器不会在字符串前面添加前缀空格。

Code Llama 与 Llama2 模型具有相同的架构,有关 API 参考,请参阅 Llama2 的文档页面。在下面找到 Code Llama 标记器参考。

CodeLlamaTokenizer

class transformers.CodeLlamaTokenizer

< >

( vocab_file 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>' suffix_first = False sp_model_kwargs: Optional = None add_bos_token = True add_eos_token = False clean_up_tokenization_spaces = False additional_special_tokens = None use_default_system_prompt = False **kwargs )

参数

  • vocab_file (str) — 词汇文件路径。
  • unk_token (str可选,默认为 "<unk>") — 未知标记。不在词汇表中的标记无法转换为 ID,而是设置为此标记。
  • bos_token (str可选,默认为 "<s>") — 预训练期间使用的序列开始标记。可用作序列分类标记。
  • eos_token (str可选,默认为 "</s>") — 序列结束标记。

    当使用特殊标记构建序列时,这不是用于序列结束的标记。使用的标记是sep_token

  • prefix_token (str可选,默认为 " <PRE>") — 用于填充的前缀标记。
  • middle_token (str可选,默认为 " <MID>") — 用于填充的中间标记。
  • suffix_token (str可选,默认为 " <SUF>") — 用于填充的后缀标记。
  • eot_token (str可选,默认为 " <EOT>") — 用于填充的文本结束标记。
  • fill_token (str可选,默认为 "<FILL_ME>") — 用于将输入在前后缀之间分割的标记。
  • suffix_first (bool可选,默认为 False) — 输入提示和后缀是否应以后缀优先的格式显示。
  • sp_model_kwargs (dict可选) — 将传递给SentencePieceProcessor.__init__()方法。 SentencePiece 的 Python 包装器 可用于(除其他事项外)设置:

    • enable_sampling:启用子词正则化。

    • nbest_size:一元组的采样参数。对于 BPE-Dropout 无效。

      • nbest_size = {0,1}:不执行采样。
      • nbest_size > 1:从 nbest_size 个结果中进行采样。
      • nbest_size < 0:假设 nbest_size 是无限的,并使用前向过滤和后向采样算法从所有假设(格)中进行采样。
    • alpha:一元组采样的平滑参数,以及 BPE-dropout 的合并操作的 dropout 概率。

  • add_eos_token (bool可选,默认为 False) — 是否在序列末尾添加序列结束标记。
  • clean_up_tokenization_spaces (bool可选,默认为 False) — 是否清理标记空格。
  • additional_special_tokens (List[str]可选) — 标记器使用的其他特殊标记。
  • use_default_system_prompt (bool可选,默认为 False) — 是否使用 Llama 的默认系统提示。

构建 CodeLlama 标记器。基于字节级字节对编码。默认填充标记未设置,因为原始模型中没有填充标记。

默认配置与 codellama/CodeLlama-7b-Instruct-hf 的配置匹配,该配置支持提示填充。

build_inputs_with_special_tokens

< >

( token_ids_0 token_ids_1 = None )

get_special_tokens_mask

< >

( token_ids_0: List token_ids_1: Optional = None already_has_special_tokens: bool = False ) List[int]

参数

  • token_ids_0 (List[int]) — ID 列表。
  • token_ids_1 (List[int]可选) — 序列对的可选第二个 ID 列表。
  • already_has_special_tokens (bool可选,默认为 False) — 令牌列表是否已使用模型的特殊令牌进行格式化。

返回值

List[int]

范围 [0, 1] 内的整数列表:1 表示特殊标记,0 表示序列标记。

从没有添加特殊标记的标记列表中检索序列 ID。当使用标记器 prepare_for_model 方法添加特殊标记时,会调用此方法。

create_token_type_ids_from_sequences

  • token_ids_0 (List[int]) — ID 列表。
  • token_ids_1 (List[int], 可选) — 序列对的第二个可选 ID 列表。

返回值

List[int]

根据给定序列的token 类型 ID列表。

创建从两个传递的序列生成掩码,用于序列对分类任务。ALBERT

序列对掩码具有以下格式

0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1
| first sequence    | second sequence |

如果 token_ids_1 为 None,则仅返回掩码的第一部分(0)。

保存词表

< >

( save_directory filename_prefix: 可选 = None ) 元组(str)

参数

  • save_directory (str) — 保存词表的目录。

返回值

元组(str)

保存的文件路径。

将词表和特殊标记文件保存到目录中。

CodeLlamaTokenizerFast

transformers.CodeLlamaTokenizerFast

< >

( vocab_file = None tokenizer_file = 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 add_bos_token = True add_eos_token = False use_default_system_prompt = False **kwargs )

参数

  • vocab_file (str, 可选) — 包含实例化分词器所需的词汇表的SentencePiece文件(通常具有 .model 扩展名)。
  • tokenizer_file (str, 可选) — 包含加载分词器所需的所有内容的tokenizers文件(通常具有 .json 扩展名)。
  • clean_up_tokenization_spaces (str可选,默认为 False) — 解码后是否清理空格,清理包括去除潜在的伪影,如多余的空格。
  • unk_token (str可选,默认为 "<unk>") — 未知标记。词汇表中不存在的标记无法转换为 ID,而是设置为此标记。
  • bos_token (str可选,默认为 "<s>") — 预训练期间使用的序列开始标记。可用作序列分类器标记。
  • eos_token (str可选,默认为 "</s>") — 序列结束标记。
  • prefix_token (str可选,默认为 " <PRE>") — 用于填充的前缀标记。
  • middle_token (str可选,默认为 " <MID>") — 用于填充的中间标记。
  • suffix_token (str可选,默认为 " <SUF>") — 用于填充的后缀标记。
  • eot_token (str可选,默认为 " <EOT>") — 用于填充的文本结束标记。
  • fill_token (str可选,默认为 "<FILL_ME>") — 用于在前后缀之间分割输入的标记。
  • additional_special_tokens (List[str]可选) — 分词器使用的其他特殊标记。
  • add_eos_token (bool, 可选, 默认为 False) — 是否在序列末尾添加序列结束标记。
  • use_default_system_prompt (bool, 可选, 默认为 False) — 是否使用 Llama 的默认系统提示。

构建 Llama 分词器。基于字节级字节对编码 (Byte-Pair-Encoding)。

此分词器使用 ByteFallback 且不进行规范化。

>>> from transformers import CodeLlamaTokenizerFast

>>> tokenizer = CodeLlamaTokenizerFast.from_pretrained("hf-internal-testing/llama-tokenizer")
>>> tokenizer.encode("Hello this is a test")
[1, 15043, 445, 338, 263, 1243]

如果要更改 bos_tokeneos_token,请确保在初始化模型时指定它们,或调用 tokenizer.update_post_processor() 以确保后处理正确完成(否则编码序列的第一个标记和最后一个标记的值将不正确)。有关更多详细信息,请查看 [后处理器] (https://huggingface.co/docs/tokenizers/api/post-processors) 文档。

此分词器继承自 PreTrainedTokenizerFast,其中包含大多数主要方法。用户应参考此超类以获取有关这些方法的更多信息。默认配置与 meta-llama/CodeLlama-7b-Instruct-hf 的配置匹配,该配置支持提示填充。

build_inputs_with_special_tokens

< >

( token_ids_0: 列表 token_ids_1: 可选 = None ) List[int]

参数

  • token_ids_0 (List[int]) — 将添加特殊标记的 ID 列表。
  • token_ids_1 (List[int], 可选) — 序列对的可选第二个 ID 列表。

返回值

List[int]

包含适当特殊标记的输入 ID 列表。

通过连接和添加特殊标记,从序列或一对序列构建用于序列分类任务的模型输入。特殊标记取决于调用 set_lang。

一个 NLLB 序列具有以下格式,其中 X 表示序列

  • input_ids(用于编码器)X [eos, src_lang_code]
  • decoder_input_ids:(用于解码器)X [eos, tgt_lang_code]

BOS 永远不会被使用。序列对不是预期的用例,但它们将在没有分隔符的情况下进行处理。

get_special_tokens_mask

< >

( token_ids_0: List token_ids_1: Optional = None already_has_special_tokens: bool = False ) 范围在 [0, 1] 内的整数列表

参数

  • token_ids_0 (List[int]) — 第一个序列的 ID 列表。
  • token_ids_1 (List[int], 可选) — 第二个序列的 ID 列表。
  • already_has_special_tokens (bool, 可选, 默认为 False) — 令牌列表是否已使用模型的特殊标记进行格式化。

返回值

范围在 [0, 1] 内的整数列表

特殊标记为 1,序列标记为 0。

从未添加特殊标记的标记列表中检索序列 ID。当使用分词器 prepare_for_modelencode_plus 方法添加特殊标记时,会调用此方法。

create_token_type_ids_from_sequences

< >

( token_ids_0: 列表 token_ids_1: 可选 = None ) List[int]

参数

  • token_ids_0 (List[int]) — 第一个分词后的序列。
  • token_ids_1 (List[int], 可选) — 第二个分词后的序列。

返回值

List[int]

分词类型 ID。

创建与传递的序列相对应的分词类型 ID。 什么是分词类型 ID?

如果模型有特殊的构建方式,则应在子类中重写。

update_post_processor

< >

( )

使用当前的 bos_tokeneos_token 更新底层的后处理程序。

保存词表

< >

( save_directory: str filename_prefix: Optional = None )

< > 更新 于 GitHub