Transformers 文档
CodeLlama
并获得增强的文档体验
开始使用
CodeLlama
Code Llama 是一个基于 Llama 2 的大型语言模型家族,专门用于编码任务。它有不同的变体——通用代码、Python 专用和指令遵循变体——所有这些都提供 7B、13B、34B 和 70B 参数。Code Llama 模型可以生成、解释,甚至填充代码中缺失的部分(称为“填充”)。它还可以处理非常长的上下文,在 16K 令牌序列上进行训练,但仍可稳定生成多达 100k 令牌。
您可以在 Code Llama 集合下找到所有原始 Code Llama 检查点。
单击右侧边栏中的 Code Llama 模型,获取更多如何将 Code Llama 应用于不同编码任务的示例。
下面的示例演示如何使用 Pipeline 或 AutoModel,以及从命令行生成代码。
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 相同,后者支持提示填充。
get_special_tokens_mask
< 来源 >( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None already_has_special_tokens: bool = False ) → list[int]
从没有添加特殊标记的标记列表中检索序列ID。此方法在使用分词器prepare_for_model
方法添加特殊标记时调用。
create_token_type_ids_from_sequences
< 来源 >( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None ) → list[int]
根据传入的两个序列创建掩码,用于序列对分类任务。一个 ALBERT
如果 token_ids_1
为 None
,则此方法仅返回掩码的第一部分(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
< source >( save_directory filename_prefix: typing.Optional[str] = None ) → Tuple(str)
将词汇表和特殊标记文件保存到目录。
CodeLlamaTokenizerFast
class transformers.CodeLlamaTokenizerFast
< source >( 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_token
或 eos_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
< source >( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None ) → list[int]
通过连接和添加特殊标记来构建序列或序列对的模型输入,用于序列分类任务。特殊标记取决于调用 set_lang。
NLLB 序列的格式如下,其中 X
表示序列
input_ids
(用于编码器)X [eos, src_lang_code]
decoder_input_ids
:(用于解码器)X [eos, tgt_lang_code]
从不使用 BOS。序列对不是预期的用例,但它们将在没有分隔符的情况下处理。
get_special_tokens_mask
< source >( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None already_has_special_tokens: bool = False ) → 一个包含整数范围 [0, 1] 的列表
从未添加特殊令牌的令牌列表中检索序列 ID。使用分词器 prepare_for_model
或 encode_plus
方法添加特殊令牌时会调用此方法。
create_token_type_ids_from_sequences
< source >( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None ) → list[int]
创建与传入序列对应的标记类型 ID。什么是标记类型 ID?
如果模型有特殊的构建方式,应在子类中重写此方法。
使用当前的 bos_token
和 eos_token
更新底层后处理器。