Transformers 文档
Llama2
并获取增强的文档体验
开始使用
Llama2
概述
Llama2 模型由 Hugo Touvron、Louis Martin、Kevin Stone、Peter Albert、Amjad Almahairi、Yasmine Babaei、Nikolay Bashlykov、Soumya Batra、Prajjwal Bhargava、Shruti Bhosale、Dan Bikel、Lukas Blecher、Cristian Canton Ferrer、Moya Chen、Guillem Cucurull、David Esiobu、Jude Fernandes、Jeremy Fu、Wenyin Fu、Brian Fuller、Cynthia Gao、Vedanuj Goswami、Naman Goyal、Anthony Hartshorn、Saghar Hosseini、Rui Hou、Hakan Inan、Marcin Kardas、Viktor Kerkez Madian Khabsa、Isabel Kloumann、Artem Korenev、Punit Singh Koura、Marie-Anne Lachaux、Thibaut Lavril、Jenya Lee、Diana Liskovich、Yinghai Lu、Yuning Mao、Xavier Martinet、Todor Mihaylov、Pushka rMishra、Igor Molybog、Yixin Nie、Andrew Poulton、Jeremy Reizenstein、Rashi Rungta、Kalyan Saladi、Alan Schelten、Ruan Silva、Eric Michael Smith、Ranjan Subramanian、Xiaoqing EllenTan、Binh Tang、Ross Taylor、Adina Williams、Jian Xiang Kuan、Puxin Xu、Zheng Yan、Iliyan Zarov、Yuchen Zhang、Angela Fan、Melanie Kambadur、Sharan Narang、Aurelien Rodriguez、Robert Stojnic、Sergey Edunov 和 Thomas Scialom 在 LLaMA: Open Foundation and Fine-Tuned Chat Models 中提出。它是一系列参数范围从 7B 到 70B 的基础语言模型集合,并针对聊天应用微调了检查点!
论文摘要如下:
在这项工作中,我们开发并发布了 Llama 2,这是一系列预训练和微调的大型语言模型 (LLM),规模从 70 亿到 700 亿参数不等。我们微调的 LLM,称为 Llama 2-Chat,针对对话用例进行了优化。我们的模型在我们测试的大多数基准测试中都优于开源聊天模型,并且根据我们对 helpfulness 和 safety 的人工评估,可能是闭源模型的合适替代品。我们详细描述了 Llama 2-Chat 的微调和安全改进方法,以便社区能够在我们工作的基础上再接再厉,为 LLM 的负责任开发做出贡献。
查看所有 Llama2 模型检查点此处。此模型由 Arthur Zucker 贡献,并由 Lysandre Debut 做出贡献。Hugging Face 中实现的代碼基于 GPT-NeoX 此处。作者的原始代碼可以在此处找到。
使用提示
Llama2
模型使用 bfloat16
训练,但原始推理使用 float16
。 Hub 上上传的检查点使用 torch_dtype = 'float16'
,AutoModel
API 将使用它将检查点从 torch.float32
转换为 torch.float16
。
在线权重的 dtype
大部分情况下是不相关的,除非您在使用 torch_dtype="auto"
初始化模型,例如使用 model = AutoModelForCausalLM.from_pretrained("path", torch_dtype = "auto")
。原因是模型会首先被下载(使用在线检查点的 dtype
),然后它将被转换为 torch
的默认 dtype
(变为 torch.float32
),最后,如果配置中提供了 torch_dtype
,则会使用它。
不建议在 float16
中训练模型,已知会产生 nan
值;因此,模型应在 bfloat16
中训练。
提示
- Llama2 模型的权重可以通过填写此表格获取
- 该架构与第一个 Llama 非常相似,增加了 Grouped Query Attention (GQA),遵循这篇论文
- 将
config.pretraining_tp
设置为非 1 的值将激活更准确但更慢的线性层计算,这应该更好地匹配原始 logits。 - 原始模型使用
pad_id = -1
,这意味着没有 padding token。我们不能使用相同的逻辑,请务必使用tokenizer.add_special_tokens({"pad_token":"<pad>"})
添加 padding token 并相应地调整 token embedding 的大小。您还应该设置model.config.pad_token_id
。模型的embed_tokens
层使用self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.config.padding_idx)
初始化,这确保了编码 padding token 将输出零,因此建议在初始化时传递它。 - 在填写表格并获得模型检查点的访问权限后,您应该能够使用已转换的检查点。否则,如果您要转换自己的模型,请随时使用转换脚本。可以使用以下(示例)命令调用该脚本
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
- 转换后,可以通过以下方式加载模型和 tokenizer
from transformers import LlamaForCausalLM, LlamaTokenizer
tokenizer = LlamaTokenizer.from_pretrained("/output/path")
model = LlamaForCausalLM.from_pretrained("/output/path")
请注意,执行脚本需要足够的 CPU RAM 来容纳 float16 精度下的整个模型(即使最大的版本有多个检查点,它们每个都包含模型每个权重的一部分,因此我们需要将它们全部加载到 RAM 中)。对于 75B 模型,因此需要 145GB 的 RAM。
LLaMA tokenizer 是一个基于 sentencepiece 的 BPE 模型。sentencepiece 的一个怪癖是,当解码序列时,如果第一个 token 是单词的开头(例如 “Banana”),则 tokenizer 不会在字符串前面添加前缀空格。
当通过
attn_implementation="flash_attention_2"
使用 Flash Attention 2 时,不要将torch_dtype
传递给from_pretrained
类方法,并使用自动混合精度训练。当使用Trainer
时,只需将fp16
或bf16
指定为True
。否则,请确保您正在使用torch.autocast
。这是必需的,因为 Flash Attention 仅支持fp16
和bf16
数据类型。
资源
官方 Hugging Face 和社区 (🌎 表示) 资源的列表,可帮助您开始使用 LLaMA2。如果您有兴趣提交资源以包含在此处,请随时打开 Pull Request,我们将对其进行审核!该资源最好能展示一些新的东西,而不是重复现有的资源。
- Llama 2 发布 - 在 Hugging Face 上获取,一篇关于 Llama 2 以及如何将其与 🤗 Transformers 和 🤗 PEFT 一起使用的博客文章。
- LLaMA 2 - 您需要的每个资源,一个相关的资源汇编,用于了解 LLaMA 2 以及如何快速入门。
- 关于如何在 Google Colab 中使用 QLoRA 和 4 位精度微调 Llama 2 的notebook。 🌎
- 关于如何使用 4 位 QLoRA 微调 “Llama-v2-7b-guanaco” 模型并从 PDF 生成问答数据集的notebook。 🌎
- 关于如何使用 QLoRa、TRL 和韩语文本分类数据集微调 Llama 2 模型的notebook。 🌎🇰🇷
⚗️ 优化
- 使用 DPO 微调 Llama 2,一个关于使用 TRL 库的 DPO 方法在特定数据集上微调 Llama 2 的指南。
- 扩展指南:指令调优 Llama 2,一个关于训练 Llama 2 从输入生成指令的指南,将模型从指令遵循转换为指令给出。
- 关于如何在个人计算机上使用 QLoRa 和 TRL 微调 Llama 2 模型的notebook。 🌎
⚡️ 推理
- 关于如何使用 AutoGPTQ 库中的 GPTQ 量化 Llama 2 模型的notebook。 🌎
- 关于如何在本地计算机或 Google Colab 上使用 4 位量化运行 Llama 2 Chat 模型的notebook。 🌎
🚀 部署
- 在 Amazon SageMaker 上微调 LLaMA 2 (7-70B),一个从设置到 QLoRA 微调和在 Amazon SageMaker 上部署的完整指南。
- 在 Amazon SageMaker 上部署 Llama 2 7B/13B/70B,一个关于使用 Hugging Face 的 LLM DLC 容器进行安全且可扩展部署的指南。
LlamaConfig
class transformers.LlamaConfig
< source >( vocab_size = 32000 hidden_size = 4096 intermediate_size = 11008 num_hidden_layers = 32 num_attention_heads = 32 num_key_value_heads = None hidden_act = 'silu' max_position_embeddings = 2048 initializer_range = 0.02 rms_norm_eps = 1e-06 use_cache = True pad_token_id = None bos_token_id = 1 eos_token_id = 2 pretraining_tp = 1 tie_word_embeddings = False rope_theta = 10000.0 rope_scaling = None attention_bias = False attention_dropout = 0.0 mlp_bias = False head_dim = None **kwargs )
参数
- vocab_size (
int
, optional, defaults to 32000) — LLaMA 模型的词汇表大小。定义了在调用 LlamaModel 时传递的inputs_ids
可以表示的不同 token 的数量 - hidden_size (
int
, optional, defaults to 4096) — 隐藏层表示的维度。 - intermediate_size (
int
, optional, defaults to 11008) — MLP 表示的维度。 - num_hidden_layers (
int
, optional, defaults to 32) — Transformer 解码器中隐藏层的数量。 - num_attention_heads (
int
, optional, defaults to 32) — Transformer 解码器中每个注意力层的注意力头的数量。 - num_key_value_heads (
int
, optional) — 这是应用于实现分组查询注意力 (Grouped Query Attention) 的 key_value 头的数量。如果num_key_value_heads=num_attention_heads
,模型将使用多头注意力 (MHA),如果num_key_value_heads=1
,模型将使用多查询注意力 (MQA),否则将使用 GQA。当将多头检查点转换为 GQA 检查点时,每个组的 key 和 value 头应通过对该组内的所有原始头进行均值池化来构建。有关更多详细信息,请查看这篇论文。如果未指定,则默认为num_attention_heads
。 - hidden_act (
str
或function
, optional, defaults to"silu"
) — 解码器中的非线性激活函数(函数或字符串)。 - max_position_embeddings (
int
, optional, defaults to 2048) — 此模型可能使用的最大序列长度。 Llama 1 支持最多 2048 个 token,Llama 2 支持最多 4096 个,CodeLlama 支持最多 16384 个。 - initializer_range (
float
, optional, defaults to 0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - rms_norm_eps (
float
, optional, defaults to 1e-06) — rms 归一化层使用的 epsilon 值。 - use_cache (
bool
, optional, defaults toTrue
) — 模型是否应返回上次的 key/values 注意力(并非所有模型都使用)。仅当config.is_decoder=True
时相关。 - pad_token_id (
int
, optional) — Padding token id. - bos_token_id (
int
, optional, defaults to 1) — 流开始 token id。 - eos_token_id (
int
, optional, defaults to 2) — 流结束 token id。 - pretraining_tp (
int
, optional, defaults to 1) — 实验性功能。预训练期间使用的张量并行等级。请参阅本文档以了解更多信息。此值对于确保预训练结果的精确可重复性是必要的。请参阅此 issue。 - tie_word_embeddings (
bool
, optional, defaults toFalse
) — 是否绑定权重 embedding - rope_theta (
float
, 可选, 默认为 10000.0) — RoPE 嵌入的基周期。 - rope_scaling (
Dict
, 可选) — 包含 RoPE 嵌入缩放配置的字典。注意:如果您应用新的 rope 类型并期望模型在更长的max_position_embeddings
上工作,我们建议您相应地更新此值。预期内容:rope_type
(str
):要使用的 RoPE 的子变体。可以是 [‘default’, ‘linear’, ‘dynamic’, ‘yarn’, ‘longrope’, ‘llama3’] 之一,其中 ‘default’ 是原始 RoPE 实现。factor
(float
, 可选):与除 ‘default’ 之外的所有 rope 类型一起使用。应用于 RoPE 嵌入的缩放因子。在大多数缩放类型中,因子 x 将使模型能够处理长度为 x * 原始最大预训练长度的序列。original_max_position_embeddings
(int
, 可选):与 ‘dynamic’、‘longrope’ 和 ‘llama3’ 一起使用。预训练期间使用的原始最大位置嵌入。attention_factor
(float
, 可选):与 ‘yarn’ 和 ‘longrope’ 一起使用。应用于注意力计算的缩放因子。如果未指定,则默认为实现建议的值,使用factor
字段推断建议值。beta_fast
(float
, 可选):仅与 ‘yarn’ 一起使用。用于设置线性斜坡函数中外推(仅)边界的参数。如果未指定,则默认为 32。beta_slow
(float
, 可选):仅与 ‘yarn’ 一起使用。用于设置线性斜坡函数中插值(仅)边界的参数。如果未指定,则默认为 1。short_factor
(List[float]
, 可选):仅与 ‘longrope’ 一起使用。应用于短上下文(<original_max_position_embeddings
)的缩放因子。必须是与隐藏层大小除以注意力头数再除以 2 相同的长度的数字列表。long_factor
(List[float]
, 可选):仅与 ‘longrope’ 一起使用。应用于长上下文(<original_max_position_embeddings
)的缩放因子。必须是与隐藏层大小除以注意力头数再除以 2 相同的长度的数字列表。low_freq_factor
(float
, 可选):仅与 ‘llama3’ 一起使用。应用于 RoPE 低频分量的缩放因子。high_freq_factor
(float
, 可选):仅与 ‘llama3’ 一起使用。应用于 RoPE 高频分量的缩放因子 - attention_bias (
bool
, 可选, 默认为False
) — 是否在自注意力期间在 query、key、value 和 output 投影层中使用偏置。 - attention_dropout (
float
, 可选, 默认为 0.0) — 注意力概率的 dropout 比率。 - mlp_bias (
bool
, 可选, 默认为False
) — 是否在 MLP 层中的 up_proj、down_proj 和 gate_proj 层中使用偏置。 - head_dim (
int
, 可选) — 注意力头的维度。如果为 None,则默认为 hidden_size // num_attention_heads
这是用于存储 LlamaModel 配置的配置类。它用于根据指定的参数实例化 LLaMA 模型,定义模型架构。使用默认值实例化配置将产生与 LLaMA-7B 类似的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。有关更多信息,请阅读 PretrainedConfig 的文档。
>>> from transformers import LlamaModel, LlamaConfig
>>> # Initializing a LLaMA llama-7b style configuration
>>> configuration = LlamaConfig()
>>> # Initializing a model from the llama-7b style configuration
>>> model = LlamaModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
LlamaTokenizer
class transformers.LlamaTokenizer
< source >( vocab_file unk_token = '<unk>' bos_token = '<s>' eos_token = '</s>' pad_token = None sp_model_kwargs: typing.Optional[typing.Dict[str, typing.Any]] = None add_bos_token = True add_eos_token = False clean_up_tokenization_spaces = False use_default_system_prompt = False spaces_between_special_tokens = False legacy = None add_prefix_space = True **kwargs )
参数
- vocab_file (
str
) — 词汇表文件的路径。 - unk_token (
str
或tokenizers.AddedToken
, 可选, 默认为"<unk>"
) — 未知 token。词汇表中不存在的 token 无法转换为 ID,而是设置为此 token。 - bos_token (
str
或tokenizers.AddedToken
, 可选, 默认为"<s>"
) — 预训练期间使用的序列开始 token。可用作序列分类器 token。 - eos_token (
str
或tokenizers.AddedToken
, 可选, 默认为"</s>"
) — 序列结束 token。 - pad_token (
str
或tokenizers.AddedToken
, 可选) — 用于使 token 数组大小相同的特殊 token,以便进行批处理。然后将被注意力机制或损失计算忽略。 - sp_model_kwargs (
Dict[str, Any]
,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
, 可选, 默认为True
) — 是否在序列的开头添加bos_token
。 - add_eos_token (
bool
, 可选, 默认为False
) — 是否在序列的末尾添加eos_token
。 - clean_up_tokenization_spaces (
bool
, 可选, 默认为False
) — 是否在解码后清理空格,清理包括删除潜在的伪像,如额外的空格。 - use_default_system_prompt (
bool
, 可选, 默认为False
) — 是否应使用 Llama 的默认系统提示。 - spaces_between_special_tokens (
bool
, 可选, 默认为False
) — 是否在特殊 token 之间添加空格。 - legacy (
bool
, 可选) — 是否应使用 tokenizer 的legacy
行为。Legacy 是在合并 #24622 和 #25224 之前,其中包括修复程序以正确处理出现在特殊 token 之后的 token。确保还将from_slow
设置为True
。一个简单的例子:legacy=True
:
构建 Llama tokenizer。基于字节级 Byte-Pair-Encoding。默认的 padding token 未设置,因为原始模型中没有 padding token。
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]
从传递的两个序列创建 mask,用于序列对分类任务。ALBERT
如果 token_ids_1 为 None,则仅返回 mask 的第一部分 (0s)。
save_vocabulary
< source >( save_directory filename_prefix: typing.Optional[str] = None ) → Tuple(str)
将词汇表和特殊 token 文件保存到目录中。
LlamaTokenizerFast
class transformers.LlamaTokenizerFast
< source >( vocab_file = None tokenizer_file = None clean_up_tokenization_spaces = False unk_token = '<unk>' bos_token = '<s>' eos_token = '</s>' add_bos_token = True add_eos_token = False use_default_system_prompt = False legacy = None add_prefix_space = None **kwargs )
参数
- vocab_file (
str
, optional) — SentencePiece 文件(通常具有 .model 扩展名),其中包含实例化 tokenizer 所需的词汇表。 - tokenizer_file (
str
, optional) — tokenizers 文件(通常具有 .json 扩展名),其中包含加载 tokenizer 所需的一切。 - clean_up_tokenization_spaces (
bool
, optional, defaults toFalse
) — 是否在解码后清理空格,清理包括删除潜在的伪像,如额外的空格。 - unk_token (
str
ortokenizers.AddedToken
, optional, defaults to"<unk>"
) — 未知 token。词汇表中不存在的 token 无法转换为 ID,而是设置为此 token。 - bos_token (
str
ortokenizers.AddedToken
, optional, defaults to"<s>"
) — 序列开始 token,在预训练期间使用。可以用作序列分类器 token。 - eos_token (
str
ortokenizers.AddedToken
, optional, defaults to"</s>"
) — 序列结束 token。 - add_bos_token (
bool
, optional, defaults toTrue
) — 是否在序列的开头添加bos_token
。 - add_eos_token (
bool
, optional, defaults toFalse
) — 是否在序列的末尾添加eos_token
。 - use_default_system_prompt (
bool
, optional, defaults toFalse
) — 是否应使用 Llama 的默认系统提示 - legacy (
bool
, optional) — 是否应使用 tokenizer 的legacy
行为。Legacy 是指在合并 #24622 和 #25224 之前的版本,其中包含对特殊 token 后出现的 token 的正确处理的修复。请确保同时将from_slow
设置为True
。一个简单的例子:legacy=True
:
构建 Llama tokenizer。基于字节级字节对编码 (Byte-Pair-Encoding)。
这主要使用 ByteFallback 且不进行规范化 (normalization)。
>>> from transformers import LlamaTokenizerFast
>>> tokenizer = LlamaTokenizerFast.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,其中包含大多数主要方法。用户应参考此超类以获取有关这些方法的更多信息。
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?
如果模型有构建这些 token 类型 ID 的特殊方法,则应在子类中重写此方法。
使用当前的 bos_token
和 eos_token
更新底层的后处理器。
LlamaModel
class transformers.LlamaModel
< 源代码 >( config: LlamaConfig )
参数
- config (LlamaConfig) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载与模型关联的权重,仅加载配置。查看 from_pretrained() 方法来加载模型权重。
- config — LlamaConfig
裸 LLaMA 模型,输出原始的 hidden-states,顶部没有任何特定的 head。 此模型继承自 PreTrainedModel。 查看超类文档以了解库为其所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝 head 等)。
此模型也是 PyTorch torch.nn.Module 的子类。 可以将其用作常规 PyTorch Module,并参考 PyTorch 文档以了解与一般用法和行为相关的所有事项。
Transformer 解码器,由 config.num_hidden_layers 层组成。 每层都是一个 LlamaDecoderLayer
forward
< 源代码 >( input_ids: LongTensor = None attention_mask: typing.Optional[torch.Tensor] = None position_ids: typing.Optional[torch.LongTensor] = None past_key_values: typing.Optional[transformers.cache_utils.Cache] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None use_cache: typing.Optional[bool] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None cache_position: typing.Optional[torch.LongTensor] = None **flash_attn_kwargs: typing_extensions.Unpack[transformers.modeling_flash_attention_utils.FlashAttentionKwargs] )
参数
- input_ids (
torch.LongTensor
,形状为(batch_size, sequence_length)
) — 词汇表中输入序列 token 的索引。 默认情况下,如果您提供 padding,则会忽略 padding。可以使用 AutoTokenizer 获取索引。 有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor
,形状为(batch_size, sequence_length)
,可选) — 用于避免对 padding token 索引执行 attention 的 Mask。 在[0, 1]
中选择的 Mask 值:- 1 表示 未被 Mask 的 token,
- 0 表示 被 Mask 的 token。
可以使用 AutoTokenizer 获取索引。 有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
如果使用了
past_key_values
,则可以选择仅输入最后一个input_ids
(请参阅past_key_values
)。如果您想更改 padding 行为,则应阅读
modeling_opt._prepare_decoder_attention_mask
并根据您的需求进行修改。 有关默认策略的更多信息,请参阅 论文 中的图 1。- 1 表示 head 未被 Mask,
- 0 表示 head 被 Mask。
- position_ids (
torch.LongTensor
,形状为(batch_size, sequence_length)
,可选) — 每个输入序列 token 在位置嵌入中的位置索引。 在范围[0, config.n_positions - 1]
中选择。 - past_key_values (
Cache
或tuple(tuple(torch.FloatTensor))
,可选) — 预先计算的 hidden-states(self-attention 块和 cross-attention 块中的 key 和 value),可用于加速顺序解码。 这通常由模型在先前解码阶段返回的past_key_values
组成,当use_cache=True
或config.use_cache=True
时。允许两种格式:
- Cache 实例,请参阅我们的 kv cache 指南;
- 长度为
config.n_layers
的tuple(torch.FloatTensor)
元组,每个元组具有 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量。 这也称为旧版 cache 格式。
模型将输出与作为输入馈送的 cache 格式相同的格式。 如果没有传递
past_key_values
,则将返回旧版 cache 格式。如果使用了
past_key_values
,用户可以选择仅输入最后一个input_ids
(那些没有将其 past key value 状态提供给此模型的input_ids
),形状为(batch_size, 1)
,而不是所有形状为(batch_size, sequence_length)
的input_ids
。 - inputs_embeds (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
,可选) — 可选地,您可以选择直接传递嵌入表示,而不是传递input_ids
。 如果您希望比模型的内部嵌入查找矩阵更精细地控制如何将input_ids
索引转换为关联的向量,这将非常有用。 - use_cache (
bool
,可选) — 如果设置为True
,则返回past_key_values
key value 状态,并且可以用于加速解码(请参阅past_key_values
)。 - output_attentions (
bool
,可选) — 是否返回所有 attention 层的 attention 张量。 有关更多详细信息,请参阅返回张量下的attentions
。 - output_hidden_states (
bool
,可选) — 是否返回所有层的 hidden states。 有关更多详细信息,请参阅返回张量下的hidden_states
。 - return_dict (
bool
,可选) — 是否返回 ModelOutput 而不是普通元组。 - cache_position (
torch.LongTensor
,形状为(sequence_length)
,可选) — 描述输入序列 token 在序列中位置的索引。 与position_ids
相反,此张量不受 padding 的影响。 它用于在正确的位置更新 cache 并推断完整的序列长度。
LlamaModel
的 forward 方法,重写了 __call__
特殊方法。
虽然 forward pass 的配方需要在该函数内定义,但之后应该调用 Module
实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。
LlamaForCausalLM
forward
< 源代码 >( input_ids: LongTensor = None attention_mask: typing.Optional[torch.Tensor] = None position_ids: typing.Optional[torch.LongTensor] = None past_key_values: typing.Union[transformers.cache_utils.Cache, typing.List[torch.FloatTensor], NoneType] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None labels: typing.Optional[torch.LongTensor] = None use_cache: typing.Optional[bool] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None cache_position: typing.Optional[torch.LongTensor] = None logits_to_keep: typing.Union[int, torch.Tensor] = 0 **kwargs: typing_extensions.Unpack[transformers.models.llama.modeling_llama.KwargsForCausalLM] ) → transformers.modeling_outputs.CausalLMOutputWithPast 或 tuple(torch.FloatTensor)
参数
- input_ids (
torch.LongTensor
,形状为(batch_size, sequence_length)
) — 词汇表中输入序列 tokens 的索引。如果您提供 padding,默认情况下将被忽略。可以使用 AutoTokenizer 获取索引。 有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor
,形状为(batch_size, sequence_length)
,可选) — 掩码,用于避免在 padding token 索引上执行 attention。Mask values selected in[0, 1]
:- 1 表示 未被掩码 的 tokens,
- 0 表示 被掩码 的 tokens。
可以使用 AutoTokenizer 获取索引。 有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
如果使用了
past_key_values
,则可以选择仅输入最后的input_ids
(请参阅past_key_values
)。如果您想更改 padding 行为,您应该阅读
modeling_opt._prepare_decoder_attention_mask
并根据您的需要进行修改。 有关默认策略的更多信息,请参见 论文 中的图 1。- 1 表示 head 是 未被掩码 的,
- 0 表示 head 是 被掩码 的。
- position_ids (
torch.LongTensor
,形状为(batch_size, sequence_length)
,可选) — 每个输入序列 tokens 在 position embeddings 中的位置索引。在范围[0, config.n_positions - 1]
中选择。 - past_key_values (
Cache
或tuple(tuple(torch.FloatTensor))
,可选) — 预先计算的 hidden-states (self-attention 块和 cross-attention 块中的 key 和 values),可以用来加速顺序解码。 这通常包括模型在先前解码阶段返回的past_key_values
,当use_cache=True
或config.use_cache=True
时。允许两种格式:
- Cache 实例,请参阅我们的 kv cache 指南;
- 长度为
config.n_layers
的tuple(torch.FloatTensor)
元组,其中每个元组有 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的 tensors。 这也称为 legacy cache 格式。
模型将输出与作为输入馈送的 cache 格式相同的格式。 如果没有传递
past_key_values
,将返回 legacy cache 格式。如果使用
past_key_values
,用户可以选择仅输入最后的input_ids
(那些没有将其 past key value states 提供给此模型的),形状为(batch_size, 1)
而不是所有形状为(batch_size, sequence_length)
的input_ids
。 - inputs_embeds (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
,可选) — 可选地,您可以选择直接传递嵌入表示,而不是传递input_ids
。 如果您希望比模型的内部 embedding lookup matrix 更能控制如何将input_ids
索引转换为关联的向量,这将非常有用。 - use_cache (
bool
,可选) — 如果设置为True
,则返回past_key_values
key value states,并且可以用于加速解码(请参阅past_key_values
)。 - output_attentions (
bool
,可选) — 是否返回所有 attention 层的 attentions tensors。 有关更多详细信息,请参阅返回的 tensors 下的attentions
。 - output_hidden_states (
bool
,可选) — 是否返回所有层的 hidden states。 有关更多详细信息,请参阅返回的 tensors 下的hidden_states
。 - return_dict (
bool
,可选) — 是否返回 ModelOutput 而不是普通元组。 - cache_position (
torch.LongTensor
,形状为(sequence_length)
,可选) — 描述输入序列 tokens 在序列中位置的索引。 与position_ids
相反,此 tensor 不受 padding 的影响。 它用于更新 cache 中的正确位置并推断完整序列长度。 - labels (
torch.LongTensor
,形状为(batch_size, sequence_length)
,可选) — 用于计算 masked language modeling loss 的标签。 索引应为[0, ..., config.vocab_size]
或 -100 (请参阅input_ids
docstring)。 索引设置为-100
的 tokens 将被忽略(掩码),loss 仅针对标签在[0, ..., config.vocab_size]
中的 tokens 计算。 - logits_to_keep (
int
或torch.Tensor
,可选) — 如果是int
,则计算最后logits_to_keep
个 tokens 的 logits。 如果为0
,则计算所有input_ids
的 logits(特殊情况)。 仅生成最后一个 token logits 是必要的,并且仅针对该 token 计算它们可以节省内存,这对于长序列或大词汇表大小而言变得非常重要。 如果是torch.Tensor
,则必须是 1D,对应于要在序列长度维度中保留的索引。 这在使用 packed tensor 格式(批处理和序列长度的单个维度)时很有用。
返回值
transformers.modeling_outputs.CausalLMOutputWithPast 或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.CausalLMOutputWithPast 或 torch.FloatTensor
的元组 (如果传递了 return_dict=False
或当 config.return_dict=False
时),包括各种元素,具体取决于配置 (LlamaConfig) 和输入。
-
loss (
torch.FloatTensor
,形状为(1,)
,可选,当提供labels
时返回) — 语言建模损失(用于下一个 token 预测)。 -
logits (
torch.FloatTensor
,形状为(batch_size, sequence_length, config.vocab_size)
) — 语言建模 head 的预测分数(SoftMax 之前每个词汇表 token 的分数)。 -
past_key_values (
tuple(tuple(torch.FloatTensor))
,可选,当传递了use_cache=True
或当config.use_cache=True
时返回) — 长度为config.n_layers
的tuple(torch.FloatTensor)
元组,其中每个元组有 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
) 的 tensors包含预先计算的 hidden-states(self-attention 块中的 key 和 values),可以用于(请参阅
past_key_values
输入)加速顺序解码。 -
hidden_states (
tuple(torch.FloatTensor)
,可选,当传递了output_hidden_states=True
或当config.output_hidden_states=True
时返回) —torch.FloatTensor
元组(对于 embeddings 的输出,如果模型具有 embedding 层,则为一个,+ 对于每个层的输出,则为一个),形状为(batch_size, sequence_length, hidden_size)
。每个层输出的模型 Hidden-states 加上可选的初始 embedding 输出。
-
attentions (
tuple(torch.FloatTensor)
,可选,当传递了output_attentions=True
或当config.output_attentions=True
时返回) —torch.FloatTensor
元组(每层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。attention softmax 之后的 Attentions weights,用于计算 self-attention heads 中的加权平均值。
LlamaForCausalLM forward 方法,覆盖了 __call__
特殊方法。
虽然 forward pass 的配方需要在该函数内定义,但之后应该调用 Module
实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。
示例
>>> from transformers import AutoTokenizer, LlamaForCausalLM
>>> model = LlamaForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
>>> tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
>>> prompt = "Hey, are you conscious? Can you talk to me?"
>>> inputs = tokenizer(prompt, return_tensors="pt")
>>> # Generate
>>> generate_ids = model.generate(inputs.input_ids, max_length=30)
>>> tokenizer.batch_decode(generate_ids, skip_special_tokens=True, clean_up_tokenization_spaces=False)[0]
"Hey, are you conscious? Can you talk to me?\nI'm not conscious, but I can talk to you."
LlamaForSequenceClassification
class transformers.LlamaForSequenceClassification
< source >( config )
参数
- config (LlamaConfig) — 带有模型所有参数的模型配置类。 使用配置文件初始化不会加载与模型关联的权重,仅加载配置。 查看 from_pretrained() 方法来加载模型权重。
带有序列分类 head (线性层) 的 LLaMa 模型 transformer。
LlamaForSequenceClassification 使用最后一个 token 来进行分类,就像其他因果模型 (例如 GPT-2) 所做的那样。
由于它对最后一个 token 进行分类,因此需要知道最后一个 token 的位置。 如果在配置中定义了 pad_token_id
,它会找到每行中不是 padding token 的最后一个 token。 如果未定义 pad_token_id
,它只会获取批次中每行的最后一个值。 由于当传递 inputs_embeds
而不是 input_ids
时它无法猜测 padding tokens,因此它会执行相同的操作(获取批次中每行的最后一个值)。
此模型继承自 PreTrainedModel。 查看超类文档以获取库为其所有模型实现的通用方法(例如下载或保存、调整输入 embeddings 大小、修剪 head 等)
此模型也是 PyTorch torch.nn.Module 的子类。 可以将其用作常规 PyTorch Module,并参考 PyTorch 文档以了解与一般用法和行为相关的所有事项。
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.Tensor] = None position_ids: typing.Optional[torch.LongTensor] = None past_key_values: typing.Union[transformers.cache_utils.Cache, typing.List[torch.FloatTensor], NoneType] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None labels: typing.Optional[torch.LongTensor] = None use_cache: typing.Optional[bool] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None )
参数
- input_ids (
torch.LongTensor
,形状为(batch_size, sequence_length)
) — 词汇表中输入序列 tokens 的索引。如果您提供 padding,默认情况下将被忽略。可以使用 AutoTokenizer 获取索引。 有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor
,形状为(batch_size, sequence_length)
,可选) — 掩码,用于避免在 padding token 索引上执行 attention。Mask values selected in[0, 1]
:- 1 表示 未被掩码 的 tokens,
- 0 表示 被掩码 的 tokens。
可以使用 AutoTokenizer 获取索引。 有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
如果使用了
past_key_values
,则可以选择仅输入最后的input_ids
(请参阅past_key_values
)。如果您想更改 padding 行为,您应该阅读
modeling_opt._prepare_decoder_attention_mask
并根据您的需要进行修改。 有关默认策略的更多信息,请参见 论文 中的图 1。- 1 表示 head 是 未被掩码 的,
- 0 表示 head 是 被掩码 的。
- position_ids (
torch.LongTensor
,形状为(batch_size, sequence_length)
,可选) — 位置嵌入中每个输入序列 tokens 的位置索引。在范围[0, config.n_positions - 1]
中选择。 - past_key_values (
Cache
或tuple(tuple(torch.FloatTensor))
,可选) — 预先计算的隐藏状态(自注意力模块和交叉注意力模块中的键和值),可以用于加速顺序解码。这通常包括在先前解码阶段由模型返回的past_key_values
,当use_cache=True
或config.use_cache=True
时。允许两种格式:
- Cache 实例,请参阅我们的 kv 缓存指南;
- 长度为
config.n_layers
的tuple(torch.FloatTensor)
元组,每个元组包含 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量。 这也称为旧版缓存格式。
模型将输出与作为输入馈送的缓存格式相同的格式。 如果没有传递
past_key_values
,则将返回旧版缓存格式。如果使用
past_key_values
,用户可以选择仅输入最后一次的input_ids
(那些没有将其过去的键值状态提供给此模型的输入),形状为(batch_size, 1)
,而不是所有形状为(batch_size, sequence_length)
的input_ids
。 - inputs_embeds (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
,可选) — (可选)您可以选择直接传递嵌入表示,而不是传递input_ids
。如果您希望比模型的内部嵌入查找矩阵更精细地控制如何将input_ids
索引转换为关联向量,这将非常有用。 - use_cache (
bool
,可选) — 如果设置为True
,则返回past_key_values
键值状态,并且可以用于加速解码(请参阅past_key_values
)。 - output_attentions (
bool
,可选) — 是否返回所有注意力层的注意力张量。 有关更多详细信息,请参见返回张量下的attentions
。 - output_hidden_states (
bool
,可选) — 是否返回所有层的隐藏状态。 有关更多详细信息,请参见返回张量下的hidden_states
。 - return_dict (
bool
,可选) — 是否返回 ModelOutput 而不是普通元组。 - cache_position (
torch.LongTensor
,形状为(sequence_length)
,可选) — 描述输入序列 tokens 在序列中位置的索引。与position_ids
相反,此张量不受 padding 的影响。它用于在正确的位置更新缓存并推断完整的序列长度。 - labels (
torch.LongTensor
,形状为(batch_size,)
,可选) — 用于计算序列分类/回归损失的标签。索引应在[0, ..., config.num_labels - 1]
中。 如果config.num_labels == 1
,则计算回归损失(均方误差损失)。如果config.num_labels > 1
,则计算分类损失(交叉熵损失)。
LlamaForSequenceClassification
的 forward 方法覆盖了 __call__
特殊方法。
虽然 forward pass 的配方需要在该函数内定义,但之后应该调用 Module
实例而不是此函数,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。