Transformers 文档

OLMo

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

OLMo

PyTorch FlashAttention SDPA

概述

OLMo模型由Dirk Groeneveld、Iz Beltagy、Pete Walsh、Akshita Bhagia、Rodney Kinney、Oyvind Tafjord、Ananya Harsh Jha、Hamish Ivison、Ian Magnusson、Yizhong Wang、Shane Arora、David Atkinson、Russell Authur、Khyathi Raghavi Chandu、Arman Cohan、Jennifer Dumas、Yanai Elazar、Yuling Gu、Jack Hessel、Tushar Khot、William Merrill、Jacob Morrison、Niklas Muennighoff、Aakanksha Naik、Crystal Nam、Matthew E. Peters、Valentina Pyatkin、Abhilasha Ravichander、Dustin Schwenk、Saurabh Shah、Will Smith、Emma Strubell、Nishant Subramani、Mitchell Wortsman、Pradeep Dasigi、Nathan Lambert、Kyle Richardson、Luke Zettlemoyer、Jesse Dodge、Kyle Lo、Luca Soldaini、Noah A. Smith和Hannaneh Hajishirzi在论文《OLMo: Accelerating the Science of Language Models》中提出。

OLMo是一系列型 (Open Language Models),旨在推动语言模型的科学研究。OLMo模型在Dolma数据集上进行训练。我们发布了训练这些模型所涉及的所有代码、检查点、日志(即将推出)和细节。

论文摘要如下:

语言模型(LMs)在自然语言处理研究和商业产品中已无处不在。随着其商业重要性的激增,最强大的模型变得封闭,被专有接口所限制,其训练数据、架构和开发的关键细节均未公开。鉴于这些细节对于科学研究这些模型(包括其偏见和潜在风险)至关重要,我们认为研究社区能够接触到强大的、真正开放的语言模型是必不可少的。为此,本技术报告详细介绍了OLMo的首次发布,这是一个先进的、真正开放的语言模型及其框架,用于构建和研究语言建模的科学。与以往大多数只发布模型权重和推理代码的工作不同,我们发布了OLMo及其整个框架,包括训练数据以及训练和评估代码。我们希望这次发布能够赋能并加强开放研究社区,并激发新一轮的创新浪潮。

该模型由shanearora贡献。原始代码可以在这里找到。

OlmoConfig

class transformers.OlmoConfig

< >

( vocab_size = 50304 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 use_cache = True pad_token_id = 1 bos_token_id = None eos_token_id = 50279 tie_word_embeddings = False rope_theta = 10000.0 rope_scaling = None attention_bias = False attention_dropout = 0.0 clip_qkv = None **kwargs )

参数

  • vocab_size (int, 可选, 默认为 50304) — OLMo 模型的词汇表大小。定义了在调用 OlmoModel 时,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, 可选) — 这是用于实现分组查询注意力(Grouped Query Attention)的键值头数量。如果 `num_key_value_heads=num_attention_heads`,模型将使用多头注意力(MHA);如果 `num_key_value_heads=1`,模型将使用多查询注意力(MQA);否则使用GQA。当将多头检查点转换为GQA检查点时,每个分组的键和值头应通过对该组内所有原始头进行均值池化来构建。更多细节,请查看这篇论文。如果未指定,将默认为 `num_attention_heads`。
  • hidden_act (strfunction, 可选, 默认为 "silu") — 解码器中的非线性激活函数(函数或字符串)。
  • max_position_embeddings (int, 可选, 默认为 2048) — 该模型可能使用的最大序列长度。
  • initializer_range (float, 可选, 默认为 0.02) — 用于初始化所有权重矩阵的截断正态初始化器的标准差。
  • use_cache (bool, 可选, 默认为 True) — 模型是否应返回最后一个键/值注意力(并非所有模型都使用)。仅在 `config.is_decoder=True` 时相关。
  • pad_token_id (int, 可选, 默认为 1) — 填充词元 ID。
  • bos_token_id (int, 可选) — 序列开始词元 ID。
  • eos_token_id (int, 可选, 默认为 50279) — 序列结束词元 ID。
  • tie_word_embeddings (bool, 可选, 默认为 False) — 是否绑定词嵌入权重。
  • rope_theta (float, 可选, 默认为 10000.0) — RoPE 嵌入的基础周期。
  • rope_scaling (Dict, 可选) — 包含 RoPE 嵌入缩放配置的字典。目前支持两种缩放策略:线性和动态。它们的缩放因子必须是大于1的浮点数。预期格式为 `{"type": 策略名称, "factor": 缩放因子}`。使用此标志时,不要将 `max_position_embeddings` 更新为预期的新最大值。有关这些缩放策略行为的更多信息,请参阅以下讨论串:https://www.reddit.com/r/LocalLLaMA/comments/14mrgpr/dynamically_scaled_rope_further_increases/。这是一个实验性功能,未来版本中可能会有破坏性的 API 更改。
  • attention_bias (bool, 默认为 False, 可选, 默认为 False) — 是否在自注意力过程中的查询、键、值和输出投影层中使用偏置。
  • attention_dropout (float, 可选, 默认为 0.0) — 注意力概率的 dropout 比率。
  • clip_qkv (float, 可选) — 如果不为 `None`,查询、键和值注意力状态的元素将被裁剪,使其绝对值不超过此值。

这是用于存储 OlmoModel 配置的配置类。它用于根据指定的参数实例化 OLMo 模型,定义模型架构。使用默认值实例化配置将产生与 allenai/OLMo-7B-hf 类似的配置。

配置对象继承自 PretrainedConfig,可用于控制模型输出。有关更多信息,请阅读 PretrainedConfig 的文档。

>>> from transformers import OlmoModel, OlmoConfig

>>> # Initializing a OLMo 7B style configuration
>>> configuration = OlmoConfig()

>>> # Initializing a model from the OLMo 7B style configuration
>>> model = OlmoModel(configuration)

>>> # Accessing the model configuration
>>> configuration = model.config

OlmoModel

class transformers.OlmoModel

< >

( config: OlmoConfig )

参数

  • config (OlmoConfig) — 包含模型所有参数的模型配置类。使用配置文件进行初始化不会加载与模型关联的权重,只会加载配置。请查看 from_pretrained() 方法来加载模型权重。

裸的 Olmo 模型,输出原始的隐藏状态,没有任何特定的头部。

该模型继承自 PreTrainedModel。请查看超类文档以了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头部等)。

该模型也是一个 PyTorch torch.nn.Module 子类。可以像常规 PyTorch 模块一样使用它,并参考 PyTorch 文档了解所有与通用用法和行为相关的事项。

forward

< >

( 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.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 cache_position: typing.Optional[torch.LongTensor] = None **flash_attn_kwargs: typing_extensions.Unpack[transformers.modeling_flash_attention_utils.FlashAttentionKwargs] ) transformers.modeling_outputs.BaseModelOutputWithPasttuple(torch.FloatTensor)

参数

  • input_ids (torch.LongTensor,形状为 (batch_size, sequence_length), 可选) — 词汇表中输入序列词元的索引。默认情况下,填充将被忽略。

    可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode()PreTrainedTokenizer.call()

    什么是输入 ID?

  • attention_mask (torch.Tensor,形状为 (batch_size, sequence_length), 可选) — 用于避免对填充词元索引执行注意力的掩码。掩码值选自 [0, 1]

    • 1 表示词元未被屏蔽
    • 0 表示词元被屏蔽

    什么是注意力掩码?

  • position_ids (torch.LongTensor,形状为 (batch_size, sequence_length), 可选) — 每个输入序列词元在位置嵌入中的位置索引。选自范围 [0, config.n_positions - 1]

    什么是位置 ID?

  • past_key_values (~cache_utils.Cache, 可选) — 预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速序列解码。这通常由模型在解码的先前阶段返回的 past_key_values 组成,此时 use_cache=Trueconfig.use_cache=True

    允许两种格式:

    • Cache 实例,请参阅我们的 kv 缓存指南
    • 长度为 config.n_layerstuple(torch.FloatTensor) 元组,其中每个元组包含 2 个形状为 (batch_size, num_heads, sequence_length, embed_size_per_head) 的张量。这也称为旧版缓存格式。

    模型将输出与输入相同的缓存格式。如果未传递 past_key_values,将返回旧版缓存格式。

    如果使用 past_key_values,用户可以选择只输入形状为 (batch_size, 1) 的最后一个 input_ids(即那些没有将其过去键值状态提供给此模型的输入),而不是形状为 (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
  • cache_position (torch.LongTensor,形状为 (sequence_length)可选) — 描述输入序列词元在序列中位置的索引。与 position_ids 相反,此张量不受填充影响。它用于在正确的位置更新缓存并推断完整的序列长度。

返回

transformers.modeling_outputs.BaseModelOutputWithPasttuple(torch.FloatTensor)

一个 transformers.modeling_outputs.BaseModelOutputWithPast 或一个 torch.FloatTensor 元组(如果传递了 return_dict=Falseconfig.return_dict=False),根据配置 (OlmoConfig) 和输入包含各种元素。

  • last_hidden_state (torch.FloatTensor, 形状为 (batch_size, sequence_length, hidden_size)) — 模型最后一层输出的隐藏状态序列。

    如果使用了 past_key_values,则只输出形状为 (batch_size, 1, hidden_size) 的序列的最后一个隐藏状态。

  • past_key_values (Cache, 可选, 当传递 use_cache=Trueconfig.use_cache=True 时返回) — 这是一个 Cache 实例。有关更多详细信息,请参阅我们的 kv 缓存指南

    包含预计算的隐藏状态(自注意力块中的键和值,如果 config.is_encoder_decoder=True,则还包括交叉注意力块中的键和值),可用于(参见 past_key_values 输入)加速序列解码。

  • hidden_states (tuple(torch.FloatTensor), 可选, 当传递 output_hidden_states=Trueconfig.output_hidden_states=True 时返回) — 形状为 (batch_size, sequence_length, hidden_size)torch.FloatTensor 元组(一个用于嵌入层的输出,如果模型有嵌入层,+ 一个用于每层输出)。

    模型在每个层输出的隐藏状态以及可选的初始嵌入输出。

  • attentions (tuple(torch.FloatTensor), 可选, 当传递 output_attentions=Trueconfig.output_attentions=True 时返回) — 形状为 (batch_size, num_heads, sequence_length, sequence_length)torch.FloatTensor 元组(每层一个)。

    注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。

OlmoModel 的 forward 方法,重写了 __call__ 特殊方法。

尽管前向传播的流程需要在此函数内定义,但之后应该调用 Module 实例而不是此函数,因为前者会处理运行前处理和后处理步骤,而后者会静默地忽略它们。

OlmoForCausalLM

class transformers.OlmoForCausalLM

< >

( config )

参数

  • config (OlmoForCausalLM) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载与模型关联的权重,只会加载配置。请查看 from_pretrained() 方法来加载模型权重。

用于因果语言建模的 Olmo 模型。

该模型继承自 PreTrainedModel。请查看超类文档以了解该库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、修剪头部等)。

该模型也是一个 PyTorch torch.nn.Module 子类。可以像常规 PyTorch 模块一样使用它,并参考 PyTorch 文档了解所有与通用用法和行为相关的事项。

forward

< >

( 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.Optional[transformers.cache_utils.Cache] = 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 cache_position: typing.Optional[torch.LongTensor] = None logits_to_keep: typing.Union[int, torch.Tensor] = 0 **kwargs: typing_extensions.Unpack[transformers.models.olmo.modeling_olmo.KwargsForCausalLM] ) transformers.modeling_outputs.CausalLMOutputWithPasttuple(torch.FloatTensor)

参数

  • input_ids (torch.LongTensor,形状为 (batch_size, sequence_length)可选) — 词汇表中输入序列词元的索引。默认情况下将忽略填充。

    可以使用 AutoTokenizer 获取索引。有关详细信息,请参阅 PreTrainedTokenizer.encode()PreTrainedTokenizer.call()

    什么是输入 ID?

  • attention_mask (torch.Tensor,形状为 (batch_size, sequence_length)可选) — 用于避免在填充词元索引上执行注意力的掩码。掩码值选自 [0, 1]

    • 1 表示未被屏蔽的词元,
    • 0 表示被屏蔽的词元。

    什么是注意力掩码?

  • position_ids (torch.LongTensor,形状为 (batch_size, sequence_length)可选) — 位置嵌入中每个输入序列词元的位置索引。选自范围 [0, config.n_positions - 1]

    什么是位置 ID?

  • past_key_values (~cache_utils.Cache, 可选) — 预计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速序列解码。这通常由模型在解码的先前阶段返回的 past_key_values 组成,此时 use_cache=Trueconfig.use_cache=True

    允许两种格式:

    • Cache 实例,请参阅我们的 kv 缓存指南
    • 长度为 config.n_layerstuple(torch.FloatTensor) 元组,其中每个元组包含 2 个形状为 (batch_size, num_heads, sequence_length, embed_size_per_head) 的张量。这也称为旧版缓存格式。

    模型将输出与输入相同的缓存格式。如果未传递 past_key_values,将返回旧版缓存格式。

    如果使用 past_key_values,用户可以选择只输入形状为 (batch_size, 1) 的最后一个 input_ids(即那些没有将其过去键值状态提供给此模型的输入),而不是形状为 (batch_size, sequence_length) 的所有 input_ids

  • inputs_embeds (torch.FloatTensor,形状为 (batch_size, sequence_length, hidden_size)可选) — 可选地,你可以不传递 input_ids,而是直接传递嵌入表示。如果你想比模型内部的嵌入查找矩阵更好地控制如何将 input_ids 索引转换为关联向量,这会很有用。
  • labels (torch.LongTensor,形状为 (batch_size, sequence_length)可选) — 用于计算掩码语言建模损失的标签。索引应在 [0, ..., config.vocab_size] 或 -100 之间(参见 input_ids 文档字符串)。索引设置为 -100 的词元将被忽略(屏蔽),损失仅对标签在 [0, ..., config.vocab_size] 内的词元计算。
  • use_cache (bool, 可选) — 如果设置为 True,将返回 past_key_values 键值状态,并可用于加速解码(请参阅 past_key_values)。
  • output_attentions (bool, 可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参阅返回张量下的 attentions
  • output_hidden_states (bool, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参阅返回张量下的 hidden_states
  • cache_position (torch.LongTensor,形状为 (sequence_length)可选) — 描述输入序列词元在序列中位置的索引。与 position_ids 相反,此张量不受填充影响。它用于在正确的位置更新缓存并推断完整的序列长度。
  • logits_to_keep (Union[int, torch.Tensor], 默认为 0) — 如果是 int,则为最后的 logits_to_keep 个词元计算 logits。如果是 0,则为所有 input_ids 计算 logits(特殊情况)。生成时只需要最后一个词元的 logits,仅为此词元计算可以节省内存,这对于长序列或大词汇表来说非常重要。如果是 torch.Tensor,则必须是一维的,对应于序列长度维度中要保留的索引。这在使用打包张量格式(批次和序列长度使用单一维度)时很有用。

返回

transformers.modeling_outputs.CausalLMOutputWithPasttuple(torch.FloatTensor)

一个 transformers.modeling_outputs.CausalLMOutputWithPast 或一个 torch.FloatTensor 元组(如果传递了 return_dict=Falseconfig.return_dict=False),根据配置 (OlmoConfig) 和输入包含各种元素。

  • loss (torch.FloatTensor 形状为 (1,)可选,当提供 labels 时返回) — 语言建模损失(用于下一个 token 预测)。

  • logits (形状为 (batch_size, sequence_length, config.vocab_size)torch.FloatTensor) — 语言建模头部的预测分数(SoftMax 之前的每个词汇标记的分数)。

  • past_key_values (Cache, 可选, 当传递 use_cache=Trueconfig.use_cache=True 时返回) — 这是一个 Cache 实例。有关更多详细信息,请参阅我们的 kv 缓存指南

    包含预计算的隐藏状态(自注意力块中的键和值),可用于(参见 past_key_values 输入)加速顺序解码。

  • hidden_states (tuple(torch.FloatTensor), 可选, 当传递 output_hidden_states=Trueconfig.output_hidden_states=True 时返回) — 形状为 (batch_size, sequence_length, hidden_size)torch.FloatTensor 元组(一个用于嵌入层的输出,如果模型有嵌入层,+ 一个用于每层输出)。

    模型在每个层输出的隐藏状态以及可选的初始嵌入输出。

  • attentions (tuple(torch.FloatTensor), 可选, 当传递 output_attentions=Trueconfig.output_attentions=True 时返回) — 形状为 (batch_size, num_heads, sequence_length, sequence_length)torch.FloatTensor 元组(每层一个)。

    注意力 softmax 后的注意力权重,用于计算自注意力头中的加权平均值。

OlmoForCausalLM 的 forward 方法,重写了 __call__ 特殊方法。

尽管前向传播的流程需要在此函数内定义,但之后应该调用 Module 实例而不是此函数,因为前者会处理运行前处理和后处理步骤,而后者会静默地忽略它们。

示例

>>> from transformers import AutoTokenizer, OlmoForCausalLM

>>> model = OlmoForCausalLM.from_pretrained("meta-olmo/Olmo-2-7b-hf")
>>> tokenizer = AutoTokenizer.from_pretrained("meta-olmo/Olmo-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."
< > 在 GitHub 上更新