Transformers 文档

CodeLlama

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

此模型于 2023-08-24 发布,并于 2023-08-25 添加到 Hugging Face Transformers。

PyTorch

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 应用于不同代码任务的示例。

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

流水线
自动模型
Transformers CLI
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

< >

( 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 to False) — 是否在解码后清理空格,清理包括移除可能存在的额外空格。
  • 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 to True) — 是否在序列开头添加序列起始 token。
  • add_eos_token (bool, optional, defaults to False) — 是否在序列末尾添加序列结束 token。
  • use_default_system_prompt (bool, optional, defaults to False) — 是否使用 Llama 的默认系统提示。
  • add_prefix_space (bool, optional) — 是否添加前导空格。这允许将前导词视为与其他词一样。
  • vocab (str, dict or list, optional) — 自定义词汇表字典。如果未提供,则从 vocab_file 加载词汇表。
  • merges (str or list, 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_tokeneos_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 = None already_has_special_tokens: bool = False ) 一个介于 0 和 1 之间的整数列表

参数

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

返回

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

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

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.

save_vocabulary

< >

( save_directory: str filename_prefix: str | None = None )

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, optional, defaults to False) — 是否在解码后清理空格,清理包括移除可能存在的额外空格。
  • 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 to True) — 是否在序列开头添加序列起始 token。
  • add_eos_token (bool, optional, defaults to False) — 是否在序列末尾添加序列结束 token。
  • use_default_system_prompt (bool, optional, defaults to False) — 是否使用 Llama 的默认系统提示。
  • add_prefix_space (bool, optional) — 是否添加前导空格。这允许将前导词视为与其他词一样。
  • vocab (str, dict or list, optional) — 自定义词汇表字典。如果未提供,则从 vocab_file 加载词汇表。
  • merges (str or list, 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_tokeneos_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 = None already_has_special_tokens: bool = False ) 一个介于 0 和 1 之间的整数列表

参数

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

返回

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

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

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.

update_post_processor

< >

( )

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

save_vocabulary

< >

( save_directory: str filename_prefix: str | None = None )

在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.