Llama2
概述
Llama 2 模型在 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, Pushkar Mishra, Igor Molybog, Yixin Nie, Andrew Poulton, Jeremy Reizenstein, Rashi Rungta, Kalyan Saladi, Alan Schelten, Ruan Silva, Eric Michael Smith, Ranjan Subramanian, Xiaoqing Ellen Tan, 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 中提出。它是一系列基础语言模型的集合,参数量从 70 亿到 700 亿不等,并且包含针对聊天应用微调的检查点!
论文摘要如下:
在这项工作中,我们开发并发布了 Llama 2,这是一个预训练和微调的大型语言模型 (LLM) 集合,其规模从 70 亿到 700 亿个参数不等。我们微调的 LLM,称为 Llama 2-Chat,针对对话用例进行了优化。在大多数我们测试的基准测试中,我们的模型优于开源聊天模型,并且根据我们对有用性和安全性的评估,它可能是闭源模型的合适替代品。为了使社区能够在我们的工作基础上进行构建并为 LLM 的负责任开发做出贡献,我们提供了关于 Llama 2-Chat 的微调和安全改进方法的详细描述。
您可以 此处 查看所有 Llama 2 模型检查点。此模型由 Arthur Zucker 贡献,并得到 Lysandre Debut 的帮助。Hugging Face 中的实现代码基于 GPT-NeoX,此处 为其代码库。作者的原始代码可在此处找到 此处。
使用技巧
Llama2
模型使用 bfloat16
进行训练,但原始推理使用 float16
。上传到 Hub 的检查点使用 torch_dtype = 'float16'
,AutoModel
API 将使用此参数将检查点从 torch.float32
转换为 torch.float16
。
在线权重的 dtype
大多无关紧要,除非您在使用 AutoModelForCausalLM.from_pretrained("path", torch_dtype = "auto")
初始化模型时使用 torch_dtype="auto"
。原因是模型将首先下载(使用在线检查点的 dtype
),然后将其转换为 torch
的默认 dtype
(变为 torch.float32
),最后,如果在配置中提供了 torch_dtype
,则将使用它。
不建议使用 float16
训练模型,因为已知会产生 nan
;因此,模型应使用 bfloat16
进行训练。
提示
- 可以通过填写 此表单 获取 Llama 2 模型的权重。
- 该架构与第一个 Llama 非常相似,增加了 Grouped Query Attention (GQA),遵循 这篇论文。
- 将
config.pretraining_tp
设置为 1 以外的值将激活更准确但速度较慢的线性层计算,这应该更好地匹配原始 logits。 - 原始模型使用
pad_id = -1
,这意味着没有填充标记。我们不能使用相同的逻辑,请确保使用tokenizer.add_special_tokens({"pad_token":"<pad>"})
添加填充标记并相应地调整标记嵌入的大小。您还应该设置model.config.pad_token_id
。模型的embed_tokens
层使用self.embed_tokens = nn.Embedding(config.vocab_size, config.hidden_size, self.config.padding_idx)
初始化,这确保了对填充标记进行编码将输出零,因此建议在初始化时传递它。 - 填写表单并获得对模型检查点的访问权限后,您应该能够使用已转换的检查点。否则,如果您要转换自己的模型,请随时使用 转换脚本。可以使用以下(示例)命令调用该脚本
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
- 转换后,可以通过以下方式加载模型和标记器:
from transformers import LlamaForCausalLM, LlamaTokenizer
tokenizer = LlamaTokenizer.from_pretrained("/output/path")
model = LlamaForCausalLM.from_pretrained("/output/path")
请注意,执行脚本需要足够的 CPU RAM 以 float16 精度承载整个模型(即使最大的版本包含多个检查点,但每个检查点都包含模型每个权重的一部分,因此我们需要将它们全部加载到 RAM 中)。对于 750 亿模型,因此需要 145GB 的 RAM。
LLaMA 标记器是基于 sentencepiece 的 BPE 模型。sentencepiece 的一个特性是,在解码序列时,如果第一个标记是单词的开头(例如“Banana”),则标记器不会在字符串前面添加前缀空格。
当通过
attn_implementation="flash_attention_2"
使用 Flash Attention 2 时,不要将torch_dtype
传递给from_pretrained
类方法,并使用自动混合精度训练。当使用Trainer
时,只需将fp16
或bf16
指定为True
。否则,请确保您正在使用torch.autocast
。这是必需的,因为 Flash Attention 仅支持fp16
和bf16
数据类型。
资源
一系列官方 Hugging Face 和社区(由 🌎 表示)资源,可帮助您开始使用 LLaMA 2。如果您有兴趣提交要包含在此处的资源,请随时打开一个 Pull Request,我们会进行审核!理想情况下,该资源应展示一些新内容,而不是重复现有资源。
- Llama 2 来了 - 在 Hugging Face 上获取它,一篇关于 Llama 2 以及如何使用 🤗 Transformers 和 🤗 PEFT 的博文。
- LLaMA 2 - 您需要的所有资源,一个了解 LLaMA 2 以及如何快速入门的重要资源的汇编。
- 一个关于如何在 Google Colab 中使用 QLoRA 和 4 位精度微调 Llama 2 的 笔记本。🌎
- 一个关于如何使用 4 位 QLoRA 微调“Llama-v2-7b-guanaco”模型并从 PDF 生成问答数据集的 笔记本。🌎
- 一个关于如何使用 QLoRA、TRL 和韩语文本分类数据集微调 Llama 2 模型的 笔记本。🌎🇰🇷
⚗️ 优化
- 使用 DPO 微调 Llama 2,一个关于如何使用 TRL 库的 DPO 方法在特定数据集上微调 Llama 2 的指南。
- 扩展指南:指令微调 Llama 2,一个关于训练 Llama 2 从输入生成指令,将模型从指令遵循转变为指令生成的指南。
- 一个关于如何在个人电脑上使用 QLoRA 和 TRL 微调 Llama 2 模型的 笔记本。🌎
⚡️ 推理
- 一个关于如何使用 AutoGPTQ 库中的 GPTQ 量化 Llama 2 模型的 笔记本。🌎
- 一个关于如何在本地计算机或 Google Colab 上运行使用 4 位量化的 Llama 2 聊天模型的 笔记本。🌎
🚀 部署
- 在 Amazon SageMaker 上微调 LLaMA 2(70 亿 - 700 亿),一个从设置到 QLoRA 微调和在 Amazon SageMaker 上部署的完整指南。
- 在 Amazon SageMaker 上部署 Llama 2 70 亿/130 亿/700 亿,一个关于使用 Hugging Face 的 LLM DLC 容器进行安全且可扩展部署的指南。
LlamaConfig
类 transformers.LlamaConfig
< 源代码 >( 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
, 可选, 默认为 32000) — LLaMA 模型的词汇量大小。定义了调用 LlamaModel 时传递的inputs_ids
可以表示的不同标记的数量。 - hidden_size (
int
, 可选, 默认为 4096) — 隐藏表示的维度。 - intermediate_size (
int
, 可选, 默认为 11008) — MLP 表示的维度。 - num_hidden_layers (
int
, 可选, 默认为 32) — Transformer 解码器中隐藏层的数量。 - num_attention_heads (
int
, 可选, 默认为 32) — Transformer 解码器中每个注意力层的注意力头的数量。 - num_key_value_heads (
int
, 可选) — 这是应该用于实现分组查询注意力的键值头的数量。如果num_key_value_heads=num_attention_heads
,则模型将使用多头注意力 (MHA),如果num_key_value_heads=1
,则模型将使用多查询注意力 (MQA),否则将使用 GQA。在将多头检查点转换为 GQA 检查点时,每个组键和值头应通过对该组中所有原始头进行平均池化来构建。有关更多详细信息,请查看 这篇论文。如果未指定,将默认为num_attention_heads
。 - hidden_act (
str
或function
, 可选, 默认为"silu"
) — 解码器中的非线性激活函数(函数或字符串)。 - max_position_embeddings (
int
,可选,默认为 2048) — 模型可能使用的最大序列长度。Llama 1 支持最多 2048 个 token,Llama 2 支持最多 4096 个,CodeLlama 支持最多 16384 个。 - initializer_range (
float
,可选,默认为 0.02) — 初始化所有权重矩阵的截断正态分布初始化器的标准差。 - rms_norm_eps (
float
,可选,默认为 1e-06) — RMS 归一化层使用的 epsilon。 - use_cache (
bool
,可选,默认为True
) — 模型是否应该返回最后的键/值注意力(并非所有模型都使用)。仅当config.is_decoder=True
时才相关。 - pad_token_id (
int
,可选) — 填充 token id。 - bos_token_id (
int
,可选,默认为 1) — 流的开始 token id。 - eos_token_id (
int
,可选,默认为 2) — 流的结束 token id。 - pretraining_tp (
int
,可选,默认为 1) — 实验特性。预训练期间使用的张量并行等级。请参阅此文档以了解更多信息。此值对于确保预训练结果的精确可重复性是必要的。请参阅此问题。 - tie_word_embeddings (
bool
,可选,默认为False
) — 是否绑定权重嵌入 - 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 嵌入的缩放因子。在大多数缩放类型中,factor
为 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
) — 是否在自注意力期间的查询、键、值和输出投影层中使用偏置。 - attention_dropout (
float
,可选,默认为 0.0) — 注意力概率的 dropout 比率。 - mlp_bias (
bool
,可选,默认为False
) — 是否在 MLP 层中的 up_proj、down_proj 和 gate_proj 层中使用偏置。 - head_dim (
int
,可选) — 注意力头维度。如果为 None,则默认为 hidden_size // num_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
类 transformers.LlamaTokenizer
< 源代码 >( vocab_file unk_token = '<unk>' bos_token = '<s>' eos_token = '</s>' pad_token = None sp_model_kwargs: Optional = 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 )
参数
- 词汇表文件路径 (
str
) — 词汇表文件的路径。 - 未知词标记 (
str
或tokenizers.AddedToken
, 可选,默认为"<unk>"
) — 未知词标记。词汇表中不存在的标记无法转换为ID,而是设置为此标记。 - 序列开始标记 (
str
或tokenizers.AddedToken
, 可选,默认为"<s>"
) — 预训练期间使用的序列开始标记。可用作序列分类器标记。 - 序列结束标记 (
str
或tokenizers.AddedToken
, 可选,默认为"</s>"
) — 序列结束标记。 - 填充标记 (
str
或tokenizers.AddedToken
, 可选) — 用于使标记数组大小相同以进行批处理的特殊标记。然后注意力机制或损失计算将忽略它。 - SentencePiece 模型参数 (
Dict[str, Any]
,可选
, 可选) — 将传递给SentencePieceProcessor.__init__()
方法。 SentencePiece 的 Python 包装器 可用于设置以下内容:-
enable_sampling
: 启用子词正则化。 -
nbest_size
: 一元采样的采样参数。对于 BPE-Dropout 无效。nbest_size = {0,1}
: 不执行采样。nbest_size > 1
: 从 nbest_size 个结果中采样。nbest_size < 0
: 假设 nbest_size 为无限大,并使用前向过滤和后向采样算法从所有假设(格)中采样。
-
alpha
: 一元采样的平滑参数,以及 BPE-dropout 的合并操作的丢弃概率。
-
- 是否添加序列开始标记 (
bool
, 可选,默认为True
) — 是否在序列开头添加bos_token
。 - 是否添加序列结束标记 (
bool
, 可选,默认为False
) — 是否在序列末尾添加eos_token
。 - 是否清理标记化空格 (
bool
, 可选,默认为False
) — 是否在解码后清理空格,清理包括删除潜在的伪影,如多余的空格。 - 是否使用默认系统提示 (
bool
, 可选,默认为False
) — 是否应使用 Llama 的默认系统提示。
构建 Llama 分词器。基于字节级字节对编码 (Byte-Pair-Encoding)。默认填充标记未设置,因为原始模型中没有填充标记。
get_special_tokens_mask
< 源代码 > ( token_ids_0: List token_ids_1: Optional = 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: Optional = None ) → List[int]
创建一个掩码,用于在序列对分类任务中使用两个传递的序列。ALBERT
如果 token_ids_1 为 None,则仅返回掩码的第一部分(0)。
save_vocabulary
< 源代码 > ( save_directory filename_prefix: Optional = None ) → Tuple(str)
将词表和特殊标记文件保存到目录中。
LlamaTokenizerFast
类 transformers.LlamaTokenizerFast
< 源代码 >( 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
, 可选) — 包含实例化分词器所需的词汇表的 SentencePiece 文件(通常具有 .model 扩展名)。 - tokenizer_file (
str
, 可选) — 包含加载分词器所需的所有内容的 tokenizers 文件(通常具有 .json 扩展名)。 - clean_up_tokenization_spaces (
bool
, 可选,默认为False
) — 解码后是否清理空格,清理包括删除潜在的伪影,如多余的空格。 - unk_token (
str
或tokenizers.AddedToken
, 可选,默认为"<unk>"
) — 未知标记。词汇表中不存在的标记无法转换为 ID,而是设置为此标记。 - bos_token (
str
或tokenizers.AddedToken
, 可选,默认为"<s>"
) — 在预训练期间使用的序列开始标记。可用作序列分类器标记。 - add_bos_token (
bool
,可选,默认为True
) — 是否在序列开头添加bos_token
。 - add_eos_token (
bool
,可选,默认为False
) — 是否在序列末尾添加eos_token
。 - use_default_system_prompt (
bool
,可选,默认为False
) — 是否使用 Llama 的默认系统提示 - legacy (
bool
,可选) — 是否使用分词器的legacy
行为。Legacy 指的是 #24622 和 #25224 合并之前的版本,其中包含了正确处理特殊标记后出现的标记的修复。确保还将from_slow
设置为True
。一个简单的例子:legacy=True
:
构建 Llama 分词器。基于字节级字节对编码。
此分词器使用 ByteFallback 和不进行标准化。
>>> 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()
以确保后处理正确完成(否则编码序列的第一个标记和最后一个标记的值将不正确)。有关更多详细信息,请查看 [后处理器] (https://huggingface.co/docs/tokenizers/api/post-processors) 文档。
此分词器继承自 PreTrainedTokenizerFast,其中包含大多数主要方法。用户应参考此超类以获取有关这些方法的更多信息。
get_special_tokens_mask
< 源代码 > ( token_ids_0: List token_ids_1: Optional = None already_has_special_tokens: bool = False ) → 一个范围在 [0, 1] 内的整数列表
从没有添加特殊标记的标记列表中检索序列 ID。当使用分词器的 prepare_for_model
或 encode_plus
方法添加特殊标记时,会调用此方法。
create_token_type_ids_from_sequences
< 源代码 > ( token_ids_0: List token_ids_1: Optional = None ) → List[int]
创建与传递的序列相对应的分词类型 ID。 什么是分词类型 ID?
如果模型有特殊的方式构建这些 ID,则应在子类中重写。
使用当前的 bos_token
和 eos_token
更新底层的后处理程序。
LlamaModel
类 transformers.LlamaModel
< 源代码 >( config: LlamaConfig )
参数
- config (LlamaConfig) — 模型配置类,包含模型的所有参数。使用配置文件进行初始化不会加载与模型关联的权重,仅加载配置。查看 from_pretrained() 方法来加载模型权重。 config — LlamaConfig
不带任何特定头部,输出原始隐藏状态的基本 LLaMA 模型。此模型继承自 PreTrainedModel。查看超类文档以了解库为其所有模型实现的通用方法(例如下载或保存、调整输入嵌入的大小、修剪头部等)。
此模型也是 PyTorch torch.nn.Module 的子类。将其用作常规 PyTorch 模块,并参考 PyTorch 文档以了解与一般用法和行为相关的所有事项。
包含 config.num_hidden_layers 层的 Transformer 解码器。每一层都是一个 LlamaDecoderLayer
。
forward
< 源代码 > ( input_ids: LongTensor = None attention_mask: Optional = None position_ids: Optional = None past_key_values: Union = None inputs_embeds: Optional = None use_cache: Optional = None output_attentions: Optional = None output_hidden_states: Optional = None return_dict: Optional = None cache_position: Optional = None )
参数
- input_ids (
torch.LongTensor
形状为(batch_size, sequence_length)
) — 词汇表中输入序列标记的索引。默认情况下,如果您提供填充,则会忽略填充。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor
形状为(batch_size, sequence_length)
, 可选) — 用于避免对填充标记索引执行注意力的掩码。在[0, 1]
中选择掩码值:- 1 表示未掩盖的标记,
- 0 表示掩盖的标记。
可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
如果使用
past_key_values
,则可以选择仅输入最后的input_ids
(参见past_key_values
)。如果要更改填充行为,则应阅读
modeling_opt._prepare_decoder_attention_mask
并根据需要进行修改。有关默认策略的更多信息,请参阅 论文 中的图 1。- 1 表示头部未掩盖,
- 0 表示头部掩盖。
- position_ids (
torch.LongTensor
形状为(batch_size, sequence_length)
, 可选) — 位置嵌入中每个输入序列标记的位置索引。在[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)
元组,每个元组具有两个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
的张量。这也被称为旧版缓存格式。
模型将输出与输入相同的缓存格式。如果未传递
past_key_values
,则将返回旧版缓存格式。如果使用
past_key_values
,则用户可以选择仅输入最后的input_ids
(形状为(batch_size, 1)
),而不是所有input_ids
(形状为(batch_size, sequence_length)
)。 - 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)
, 可选) — 指示输入序列标记在序列中的位置的索引。与position_ids
相反,此张量不受填充的影响。它用于在正确的位置更新缓存并推断完整的序列长度。
LlamaModel 的 forward 方法覆盖了__call__
特殊方法。
虽然前向传递的配方需要在此函数内定义,但此后应调用Module
实例,而不是此函数,因为前者负责运行预处理和后处理步骤,而后者则默默地忽略它们。
LlamaForCausalLM
forward
< 源代码 > ( input_ids: LongTensor = None attention_mask: Optional = None position_ids: Optional = None past_key_values: Union = None inputs_embeds: Optional = None labels: Optional = None use_cache: Optional = None output_attentions: Optional = None output_hidden_states: Optional = None return_dict: Optional = None cache_position: Optional = None num_logits_to_keep: int = 0 ) → transformers.modeling_outputs.CausalLMOutputWithPast 或 tuple(torch.FloatTensor)
参数
- input_ids (
torch.LongTensor
形状为(batch_size, sequence_length)
) — 词汇表中输入序列标记的索引。如果您提供填充,则默认情况下会忽略填充。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor
形状为(batch_size, sequence_length)
, 可选) — 用于避免对填充标记索引执行注意力的掩码。掩码值选择在[0, 1]
中:- 1 表示未被掩码的标记,
- 0 表示被掩码的标记。
可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
如果使用
past_key_values
,则可以选择仅输入最后一个input_ids
(请参阅past_key_values
)。如果要更改填充行为,则应阅读
modeling_opt._prepare_decoder_attention_mask
并根据您的需要进行修改。有关默认策略的更多信息,请参阅论文中的图 1。- 1 表示头部未被掩码,
- 0 表示头部被掩码。
- position_ids (
torch.LongTensor
形状为(batch_size, sequence_length)
,可选) — 输入序列中每个 token 在位置嵌入中的位置索引。选择范围为[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)
,而不是所有input_ids
形状为(batch_size, sequence_length)
。 - 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)
,可选) — 描述输入序列中 token 位置的索引。与position_ids
不同,此张量不受填充的影响。它用于在正确的位置更新缓存并推断完整的序列长度。参数 — labels (
torch.LongTensor
形状为(batch_size, sequence_length)
,可选):用于计算掩码语言建模损失的标签。索引应在[0, ..., config.vocab_size]
或 -100 中(请参阅input_ids
文档字符串)。索引设置为-100
的 token 将被忽略(掩码),损失仅针对标签在[0, ..., config.vocab_size]
中的 token 计算。num_logits_to_keep (
int
,可选):计算最后num_logits_to_keep
个 token 的 logits。如果为0
,则计算所有input_ids
的 logits(特殊情况)。生成只需要最后一个 token 的 logits,并且仅针对该 token 计算它们可以节省内存,对于长序列或大型词汇量来说,这变得非常重要。
返回值
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)
) — 语言建模头的预测分数(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)
的张量。包含预计算的隐藏状态(自注意力块中的键和值),可用于(请参阅
past_key_values
输入)加速顺序解码。 -
hidden_states (
tuple(torch.FloatTensor)
,可选,当传递output_hidden_states=True
或config.output_hidden_states=True
时返回) —torch.FloatTensor
的元组(如果模型具有嵌入层,则一个用于嵌入层的输出,以及每个层的输出)形状为(batch_size, sequence_length, hidden_size)
。模型在每一层输出处的隐藏状态,加上可选的初始嵌入输出。
-
attentions (
tuple(torch.FloatTensor)
,可选,当传递output_attentions=True
或config.output_attentions=True
时返回) —torch.FloatTensor
的元组(每一层一个),形状为(batch_size, num_heads, sequence_length, sequence_length)
。注意力 softmax 之后的注意力权重,用于计算自注意力头中的加权平均值。
LlamaForCausalLM 的前向方法,覆盖了 __call__
特殊方法。
虽然前向传递的配方需要在此函数内定义,但此后应调用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
类 transformers.LlamaForSequenceClassification
< 源代码 >( config )
参数
- config (LlamaConfig) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型关联的权重,仅加载配置。查看 from_pretrained() 方法以加载模型权重。
LLaMa 模型转换器,在其顶部具有一个序列分类头(线性层)。
LlamaForSequenceClassification 使用最后一个 token 进行分类,就像其他因果模型(例如 GPT-2)一样。
由于它对最后一个 token 进行分类,因此需要知道最后一个 token 的位置。如果在配置中定义了 pad_token_id
,它会找到每一行中不是填充 token 的最后一个 token。如果未定义 pad_token_id
,它只需获取批次中每一行的最后一个值。由于它无法在传递 inputs_embeds
而不是 input_ids
时猜测填充 token,因此它执行相同的操作(获取批次中每一行的最后一个值)。
此模型继承自 PreTrainedModel。查看超类文档以了解库为其所有模型实现的通用方法(例如下载或保存、调整输入嵌入的大小、修剪 head 等)。
此模型也是 PyTorch torch.nn.Module 的子类。将其用作常规 PyTorch 模块,并参考 PyTorch 文档以了解与一般用法和行为相关的所有事项。
forward
< 源代码 > ( input_ids: Optional = None attention_mask: Optional = None position_ids: Optional = None past_key_values: Union = None inputs_embeds: Optional = None labels: Optional = None use_cache: Optional = None output_attentions: Optional = None output_hidden_states: Optional = None return_dict: Optional = None )
参数
- input_ids (
torch.LongTensor
形状为(batch_size, sequence_length)
) — 词汇表中输入序列 token 的索引。如果您提供填充,默认情况下将忽略填充。可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
- attention_mask (
torch.Tensor
形状为(batch_size, sequence_length)
,可选) — 用于避免对填充 token 索引执行注意力的掩码。掩码值选择在[0, 1]
中:- 1 表示未屏蔽的 token,
- 0 表示屏蔽的 token。
可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
如果使用
past_key_values
,则可以选择仅输入最后一个input_ids
(请参阅past_key_values
)。如果要更改填充行为,则应阅读
modeling_opt._prepare_decoder_attention_mask
并修改为您的需要。有关默认策略的更多信息,请参阅 论文 中的图 1。- 1 表示 head未屏蔽,
- 0 表示 head屏蔽。
- position_ids (
torch.LongTensor
形状为(batch_size, sequence_length)
,可选) — 位置嵌入中每个输入序列 token 的位置索引。选择范围在[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
(那些没有向此模型提供其过去键值状态的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)
, 可选) — 描述输入序列标记在序列中的位置的索引。与position_ids
相反,此张量不受填充的影响。它用于在正确的位置更新缓存并推断完整的序列长度。 - labels (
torch.LongTensor
形状为(batch_size,)
, 可选) — 用于计算序列分类/回归损失的标签。索引应在[0, ..., config.num_labels - 1]
中。如果config.num_labels == 1
,则计算回归损失(均方误差损失),如果config.num_labels > 1
,则计算分类损失(交叉熵损失)。
The LlamaForSequenceClassification 前向方法覆盖了 __call__
特殊方法。
虽然前向传递的配方需要在此函数内定义,但此后应调用Module
实例,而不是此函数,因为前者负责运行预处理和后处理步骤,而后者则默默地忽略它们。