Transformers 文档
CodeLlama
并获得增强的文档体验
开始使用
CodeLlama
概述
Code Llama 模型由 Code Llama: Open Foundation Models for Code 中 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,这是一个基于 Llama 2 的大型语言模型系列,用于代码生成,在开放模型中提供最先进的性能、代码补全能力、对大型输入上下文的支持以及用于编程任务的零样本指令跟随能力。我们提供了多种版本以涵盖广泛的应用:基础模型 (Code Llama)、Python 专业化模型 (Code Llama - Python) 和指令跟随模型 (Code Llama - Instruct),每个模型分别具有 7B、13B 和 34B 参数。所有模型都在 16k tokens 的序列上进行训练,并在高达 100k tokens 的输入上表现出性能提升。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 关于模型初始化的约定是以float32
加载模型,无论模型权重以何种dtype
存储。transformers
也遵循此约定以与 PyTorch 保持一致。这将是默认选择。如果您希望AutoModel
API 使用存储权重类型加载检查点,则必须指定torch_dtype="auto"
,例如model = AutoModelForCausalLM.from_pretrained("path", torch_dtype = "auto")
。bfloat16
:Code Llama 使用此精度进行训练,因此我们建议将其用于进一步的训练或微调。float16
:我们建议使用此精度运行推理,因为它通常比bfloat16
更快,并且评估指标显示相对于bfloat16
没有明显的性能下降。您也可以使用bfloat16
运行推理,我们建议您在微调后同时检查float16
和bfloat16
的推理结果。
如上所述,除非您在使用 torch_dtype="auto"
初始化模型时,存储权重的 dtype
在大多数情况下是无关紧要的。原因是模型将首先被下载(使用在线检查点的 dtype
),然后将被转换为 torch
的默认 dtype
(变为 torch.float32
)。如果指定了 torch_dtype
,则将使用指定的 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 内存以 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>
分割,以创建遵循 原始训练模式 的格式化输入字符串。这比您自己准备模式更稳健:它可以避免诸如 token 粘连等难以调试的陷阱。要查看此模型或其他模型需要多少 CPU 和 GPU 内存,请尝试使用此计算器,它可以帮助您确定该值。
LLaMA 分词器是基于 sentencepiece 的 BPE 模型。sentencepiece 的一个特性是,当解码序列时,如果第一个 token 是单词的开头(例如“Banana”),则分词器不会在字符串前面添加前缀空格。
Code Llama 具有与 Llama2
模型相同的架构,有关 API 参考,请参阅 Llama2 的文档页面。在下面查找 Code Llama 分词器的参考文档。
CodeLlamaTokenizer
class transformers.CodeLlamaTokenizer
< source >( 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[typing.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
, 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。当使用特殊 token 构建序列时,这不是用于序列结束的 token。使用的 token 是
sep_token
。 - prefix_token (
str
, optional, defaults to" <PRE>"
) — 用于填充的前缀 token。 - middle_token (
str
, optional, defaults to" <MID>"
) — 用于填充的中间 token。 - suffix_token (
str
, optional, defaults to" <SUF>"
) — 用于填充的后缀 token。 - eot_token (
str
, optional, defaults to" <EOT>"
) — 用于填充的文本结束 token。 - fill_token (
str
, optional, defaults to"<FILL_ME>"
) — 用于在前缀和后缀之间分割输入的 token。 - suffix_first (
bool
, optional, defaults toFalse
) — 输入提示和后缀是否应首先使用后缀进行格式化。 - sp_model_kwargs (
dict
, optional) — 将传递给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 是无限的,并使用前向过滤和后向抽样算法从所有假设(lattice)中抽样。
-
alpha
: Unigram 抽样的平滑参数,以及 BPE-dropout 的合并操作的 dropout 概率。
-
- add_bos_token (
bool
, optional, defaults toTrue
) — 是否在序列的开头添加序列开始 token。 - add_eos_token (
bool
, optional, defaults toFalse
) — 是否在序列的末尾添加序列结束 token。 - clean_up_tokenization_spaces (
bool
, optional, defaults toFalse
) — 是否清理分词空格。 - additional_special_tokens (
List[str]
, optional) — 分词器使用的其他特殊 token。 - use_default_system_prompt (
bool
, optional, defaults toFalse
) — 是否应使用 Llama 的默认系统提示。
构建 CodeLlama 分词器。基于字节级 Byte-Pair-Encoding。默认填充 token 未设置,因为原始模型中没有填充 token。
默认配置与支持提示填充的 codellama/CodeLlama-7b-Instruct-hf 的配置匹配。
get_special_tokens_mask
< source >( token_ids_0: typing.List[int] token_ids_1: typing.Optional[typing.List[int]] = None already_has_special_tokens: bool = False ) → List[int]
从没有添加特殊 token 的 token 列表中检索序列 ID。当使用 tokenizer 的 prepare_for_model
方法添加特殊 token 时,会调用此方法。
create_token_type_ids_from_sequences
< source >( token_ids_0: typing.List[int] token_ids_1: typing.Optional[typing.List[int]] = None ) → List[int]
从传递的两个序列创建一个掩码,用于序列对分类任务。ALBERT
如果 token_ids_1 为 None,则仅返回掩码的第一部分 (0s)。
save_vocabulary
< source >( save_directory filename_prefix: typing.Optional[str] = None ) → Tuple(str)
将词汇表和特殊 token 文件保存到目录中。
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 所需的词汇表。 - tokenizer_file (
str
, optional) — tokenizers 文件(通常带有 .json 扩展名),其中包含加载 tokenizer 所需的一切。 - clean_up_tokenization_spaces (
str
, optional, defaults toFalse
) — 字符串,可选,默认为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>"
) — 用于填充的前缀 token。 - middle_token (
str
, optional, defaults to" <MID>"
) — 用于填充的中间 token。 - suffix_token (
str
, optional, defaults to" <SUF>"
) — 用于填充的后缀 token。 - eot_token (
str
, optional, defaults to" <EOT>"
) — 用于填充的文本结束 token。 - fill_token (
str
, optional, defaults to"<FILL_ME>"
) — 用于在 prefix 和 suffix 之间分割输入的 token。 - additional_special_tokens (
List[str]
, optional) — tokenizer 使用的其他特殊 token。 - add_bos_token (
bool
, optional, defaults toTrue
) — 是否在序列的开头添加序列开始 token。 - add_eos_token (
bool
, optional, defaults toFalse
) — 是否在序列的末尾添加序列结束 token。 - use_default_system_prompt (
bool
, optional, defaults toFalse
) — 布尔值,可选,默认为False
)— 是否应使用 Llama 的默认系统提示。
构建 Llama tokenizer。基于字节级 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_token
或 eos_token
,请确保在初始化模型时指定它们,或者调用 tokenizer.update_post_processor()
以确保正确完成后处理(否则,编码序列的第一个 token 和最后一个 token 的值将不正确)。有关更多详细信息,请查看 [后处理器] (https://huggingface.co/docs/tokenizers/api/post-processors) 文档。
此 tokenizer 继承自 PreTrainedTokenizerFast,其中包含大多数主要方法。用户应参考此超类以获取有关这些方法的更多信息。默认配置与 meta-llama/CodeLlama-7b-Instruct-hf 的配置匹配,后者支持提示填充。
build_inputs_with_special_tokens
< source >( token_ids_0: typing.List[int] token_ids_1: typing.Optional[typing.List[int]] = None ) → List[int]
通过连接并添加特殊 token,从序列或序列对构建模型输入,用于序列分类任务。特殊 token 取决于调用的 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: typing.List[int] token_ids_1: typing.Optional[typing.List[int]] = None already_has_special_tokens: bool = False ) → [0, 1] 范围内的整数列表
从没有添加特殊 token 的 token 列表中检索序列 ID。当使用 tokenizer prepare_for_model
或 encode_plus
方法添加特殊 token 时,将调用此方法。
create_token_type_ids_from_sequences
< source >( token_ids_0: typing.List[int] token_ids_1: typing.Optional[typing.List[int]] = None ) → List[int]
创建与传递的序列相对应的 token 类型 ID。 什么是 token 类型 ID?
如果模型具有构建这些 ID 的特殊方式,则应在子类中重写此方法。
使用当前的 bos_token
和 eos_token
更新底层后处理器。