Transformers 文档

CodeLlama

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

该模型于 2023 年 8 月 24 日在 HF 论文中发布,并于 2023 年 8 月 25 日贡献给 Hugging Face Transformers。

CodeLlama

Code Llama 是一个专门用于编程任务的大型语言模型系列,基于 Llama 2 构建。它有多种版本——通用代码版、Python 专用版和指令微调版——均提供 7B、13B、34B 和 70B 参数规模。Code Llama 模型可以生成、解释甚至补全你代码中缺失的部分(称为“填充”,infilling)。尽管它是在 16K token 的序列上训练的,但它也能处理非常长的上下文,并实现高达 100k token 的稳定生成。

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

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

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

流水线
自动模型
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,不能关注哪些 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。分词器(Tokenizer)会分割此 token 以创建遵循原始训练模式的格式化输入字符串。这比你自己准备模式要稳健得多。

    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 字符在编码前缀或后缀时不会用于填充,仅在每个提示词的开头使用。

  • 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, 可选, 默认为 False) — 解码后是否清理空格,清理操作包括去除多余空格等伪影。
  • unk_token (str, 可选, 默认为 "<unk>") — 未知 token。词汇表中不存在的 token 无法转换为 ID,会被设置为此 token。
  • bos_token (str, 可选, 默认为 "<s>") — 预训练期间使用的序列开始 token。可用作序列分类器 token。
  • eos_token (str, 可选, 默认为 "</s>") — 序列结束 token。
  • prefix_token (str, 可选, 默认为 "▁<PRE>") — 用于填充的前缀 token。
  • middle_token (str, 可选, 默认为 "▁<MID>") — 用于填充的中间 token。
  • suffix_token (str, 可选, 默认为 "▁<SUF>") — 用于填充的后缀 token。
  • eot_token (str, 可选, 默认为 "▁<EOT>") — 用于填充的文本结束 token。
  • fill_token (str, 可选, 默认为 "<FILL_ME>") — 用于在前缀和后缀之间分割输入的 token。
  • additional_special_tokens (list[str], 可选) — 分词器使用的其他特殊 token。
  • add_bos_token (bool, 可选, 默认为 True) — 是否在序列开头添加序列开始 token。
  • add_eos_token (bool, 可选, 默认为 False) — 是否在序列末尾添加序列结束 token。
  • use_default_system_prompt (bool, 可选, 默认为 False) — 是否使用 Llama 的默认系统提示词。
  • add_prefix_space (bool, 可选) — 是否在输入中添加初始空格。这允许将首个单词像其他单词一样处理。
  • vocab (str, dictlist, 可选) — 自定义词汇表字典。如果不提供,将从 vocab_file 加载词汇表。
  • merges (strlist, 可选) — 自定义合并列表。如果不提供,将从 merges_file 加载合并列表。
  • vocab_file (str, 可选) — 包含实例化分词器所需词汇表的 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 相匹配,该配置支持提示词填充。

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, 可选, 默认为 False) — 解码后是否清理空格,清理操作包括去除多余空格等伪影。
  • unk_token (str, 可选, 默认为 "<unk>") — 未知 token。词汇表中不存在的 token 无法转换为 ID,会被设置为此 token。
  • bos_token (str, 可选, 默认为 "<s>") — 预训练期间使用的序列开始 token。可用作序列分类器 token。
  • eos_token (str, 可选, 默认为 "</s>") — 序列结束 token。
  • prefix_token (str, 可选, 默认为 "▁<PRE>") — 用于填充的前缀 token。
  • middle_token (str, 可选, 默认为 "▁<MID>") — 用于填充的中间 token。
  • suffix_token (str, 可选, 默认为 "▁<SUF>") — 用于填充的后缀 token。
  • eot_token (str, 可选, 默认为 "▁<EOT>") — 用于填充的文本结束 token。
  • fill_token (str, 可选, 默认为 "<FILL_ME>") — 用于在前缀和后缀之间分割输入的 token。
  • additional_special_tokens (list[str], 可选) — 分词器使用的其他特殊 token。
  • add_bos_token (bool, 可选, 默认为 True) — 是否在序列开头添加序列开始 token。
  • add_eos_token (bool, 可选, 默认为 False) — 是否在序列末尾添加序列结束 token。
  • use_default_system_prompt (bool, 可选, 默认为 False) — 是否使用 Llama 的默认系统提示词。
  • add_prefix_space (bool, 可选) — 是否在输入中添加初始空格。这允许将首个单词像其他单词一样处理。
  • vocab (str, dictlist, 可选) — 自定义词汇表字典。如果不提供,将从 vocab_file 加载词汇表。
  • merges (strlist, 可选) — 自定义合并列表。如果不提供,将从 merges_file 加载合并列表。
  • vocab_file (str, 可选) — 包含实例化分词器所需词汇表的 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 相匹配,该配置支持提示词填充。

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.