Transformers 文档

CodeLlama

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

PyTorch Flax

CodeLlama

Code Llama 是一个基于 Llama 2 的大型语言模型家族,专门用于编码任务。它有不同的变体——通用代码、Python 专用和指令遵循变体——所有这些都提供 7B、13B、34B 和 70B 参数。Code Llama 模型可以生成、解释,甚至填充代码中缺失的部分(称为“填充”)。它还可以处理非常长的上下文,在 16K 令牌序列上进行训练,但仍可稳定生成多达 100k 令牌。

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

单击右侧边栏中的 Code Llama 模型,获取更多如何将 Code Llama 应用于不同编码任务的示例。

下面的示例演示如何使用 PipelineAutoModel,以及从命令行生成代码。

流水线
自动模型
Transformers CLI
import torch
from transformers import pipeline

pipe = pipeline(
    "text-generation",
    model="meta-llama/CodeLlama-7b-hf",
    torch_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",
   torch_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("cuda")

output = model.generate(**input_ids, max_new_tokens=200, cache_implementation="static")
print(tokenizer.decode(output[0], skip_special_tokens=True))

使用 AttentionMaskVisualizer 更好地理解模型可以和不能关注的令牌。

from transformers.utils.attention_visualizer import AttentionMaskVisualizer

visualizer = AttentionMaskVisualizer("meta-llama/CodeLlama-7b-hf")
visualizer("""def func(a, b):
  return a + b""")

注意事项

  • 填充功能仅适用于 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")
    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 字符,仅在每个提示的开头使用。

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

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: typing.Optional[dict[str, typing.Any]] = 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: Unigram 采样参数。对于 BPE-Dropout 无效。

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

  • add_bos_token (bool, 可选, 默认为 True) — 是否在序列开头添加序列开始令牌。
  • 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: typing.Optional[list[int]] = 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 token_ids_1: typing.Optional[list[int]] = None ) list[int]

参数

  • token_ids_0 (list[int]) — ID 列表。
  • token_ids_1 (list[int], optional) — 可选的第二组 ID 列表,用于序列对。

返回

list[int]

根据给定序列的 token type IDs 列表。

根据传入的两个序列创建掩码,用于序列对分类任务。一个 ALBERT

如果 token_ids_1None,则此方法仅返回掩码的第一部分(0s)。

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,则只返回掩码的第一部分(0s)。

save_vocabulary

< >

( save_directory filename_prefix: typing.Optional[str] = None ) Tuple(str)

参数

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

返回

Tuple(str)

保存的文件路径。

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

CodeLlamaTokenizerFast

class 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, optional) — SentencePiece 文件(通常具有 .model 扩展名),其中包含实例化分词器所需的词汇表。
  • tokenizer_file (str, optional) — tokenizers 文件(通常具有 .json 扩展名),其中包含加载分词器所需的一切。
  • clean_up_tokenization_spaces (str, optional, 默认为 False) — 解码后是否清理空格,清理包括移除额外的空格等潜在的“伪迹”。
  • unk_token (str, optional, 默认为 "<unk>") — 未知标记。不在词汇表中的标记无法转换为 ID,将设置为此标记。
  • bos_token (str, optional, 默认为 "<s>") — 预训练期间使用的序列开始标记。可用作序列分类器标记。
  • eos_token (str, optional, 默认为 "</s>") — 序列结束标记。
  • prefix_token (str, optional, 默认为 " <PRE>") — 用于填充的前缀标记。
  • middle_token (str, optional, 默认为 " <MID>") — 用于填充的中间标记。
  • suffix_token (str, optional, 默认为 " <SUF>") — 用于填充的后缀标记。
  • eot_token (str, optional, 默认为 " <EOT>") — 用于填充的文本结束标记。
  • fill_token (str, optional, 默认为 "<FILL_ME>") — 用于分隔前缀和后缀之间输入的标记。
  • additional_special_tokens (list[str], optional) — 分词器使用的附加特殊标记。
  • add_bos_token (bool, optional, 默认为 True) — 是否在序列开头添加序列开始标记。
  • add_eos_token (bool, optional, 默认为 False) — 是否在序列末尾添加序列结束标记。
  • use_default_system_prompt (bool, optional, 默认为 False) — 是否使用 Llama 的默认系统提示。

构建 Llama 分词器。基于字节级字节对编码。

这主要使用 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: list token_ids_1: typing.Optional[list[int]] = None ) list[int]

参数

  • token_ids_0 (list[int]) — 将添加特殊标记的 ID 列表。
  • token_ids_1 (list[int], optional) — 可选的第二组 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: typing.Optional[list[int]] = None already_has_special_tokens: bool = False ) 一个包含整数范围 [0, 1] 的列表

参数

  • token_ids_0 (list[int]) — 第一个序列的 ID 列表。
  • token_ids_1 (list[int], optional) — 第二个序列的 ID 列表。
  • already_has_special_tokens (bool, optional, 默认为 False) — 标记列表是否已按模型特殊标记格式化。

返回

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

特殊令牌为 1,序列令牌为 0。

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

create_token_type_ids_from_sequences

< >

( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None ) list[int]

参数

  • token_ids_0 (list[int]) — 第一个分词序列。
  • token_ids_1 (list[int], optional) — 第二个分词序列。

返回

list[int]

标记类型 ID。

创建与传入序列对应的标记类型 ID。什么是标记类型 ID?

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

update_post_processor

< >

( )

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

save_vocabulary

< >

( save_directory: str filename_prefix: typing.Optional[str] = None )

< > 在 GitHub 上更新