Transformers 文档

OLMoE

OLMoE

概述

OLMoE模型由Niklas Muennighoff、Luca Soldaini、Dirk Groeneveld、Kyle Lo、Jacob Morrison、Sewon Min、Weijia Shi、Pete Walsh、Oyvind Tafjord、Nathan Lambert、Yuling Gu、Shane Arora、Akshita Bhagia、Dustin Schwenk、David Wadden、Alexander Wettig、Binyuan Hui、Tim Dettmers、Douwe Kiela、Ali Farhadi、Noah A. Smith、Pang Wei Koh、Amanpreet Singh、Hannaneh Hajishirzi在OLMoE: Open Mixture-of-Experts Language Models中提出。

OLMoE 是一系列使用稀疏专家混合设计的开放语言模型,旨在推动语言模型科学的发展。我们发布了训练这些模型所涉及的所有代码、检查点、日志和详细信息。

论文的摘要如下:

我们介绍了OLMoE,一个完全开放、最先进的语言模型,利用稀疏专家混合(MoE)。OLMoE-1B-7B拥有70亿(B)参数,但每个输入标记仅使用1B。我们在5万亿标记上进行了预训练,并进一步适应以创建OLMoE-1B-7B-Instruct。我们的模型在具有相似活动参数的可用模型中表现优异,甚至超过了更大的模型,如Llama2-13B-Chat和DeepSeekMoE-16B。我们展示了关于MoE训练的各种实验,分析了我们模型中的路由,显示出高度专业化,并开源了我们工作的所有方面:模型权重、训练数据、代码和日志。

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

OlmoeConfig

transformers.OlmoeConfig

< >

( 词汇大小 = 50304 隐藏大小 = 2048 中间大小 = 2048 隐藏层数 = 16 注意力头数 = 16 键值头数 = 无 隐藏激活函数 = 'silu' 最大位置嵌入 = 4096 初始化范围 = 0.02 RMS归一化epsilon = 1e-05 使用缓存 = 真 填充标记ID = 1 开始标记ID = 无 结束标记ID = 50279 绑定词嵌入 = 假 rope_theta = 10000.0 rope_scaling = 无 注意力偏置 = 假 注意力丢弃率 = 0.0 clip_qkv = 无 每个标记的专家数 = 8 专家总数 = 64 输出路由器logits = 假 路由器辅助损失系数 = 0.01 归一化topk概率 = 假 **kwargs )

参数

  • vocab_size (int, 可选, 默认为 50304) — OLMoE 模型的词汇表大小。定义了可以通过调用 OlmoeModel 时传递的 inputs_ids 表示的不同标记的数量
  • hidden_size (int, optional, 默认为 2048) — 隐藏表示的维度。
  • intermediate_size (int, optional, 默认为 2048) — MLP 表示的维度。
  • num_hidden_layers (int, 可选, 默认为 16) — Transformer 解码器中的隐藏层数。
  • num_attention_heads (int, optional, defaults to 16) — 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, optional, 默认为 4096) — 此模型可能使用的最大序列长度。
  • initializer_range (float, optional, 默认为 0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。
  • rms_norm_eps (float, optional, defaults to 1e-05) — rms归一化层使用的epsilon值。
  • use_cache (bool, 可选, 默认为 True) — 模型是否应返回最后的键/值注意力(并非所有模型都使用)。仅在 config.is_decoder=True 时相关。
  • pad_token_id (int, optional, 默认为 1) — 填充标记的ID.
  • bos_token_id (int, optional) — 流的开始标记id.
  • eos_token_id (int, optional, 默认为 50279) — 流结束标记的ID.
  • tie_word_embeddings (bool, optional, defaults to False) — 是否绑定权重嵌入
  • rope_theta (float, optional, 默认为 10000.0) — RoPE 嵌入的基础周期。
  • rope_scaling (Dict, optional) — Dictionary containing the scaling configuration for the RoPE embeddings. Currently supports two scaling strategies: linear and dynamic. Their scaling factor must be a float greater than 1. The expected format is {"type": strategy name, "factor": scaling factor}. When using this flag, don’t update max_position_embeddings to the expected new maximum. See the following thread for more information on how these scaling strategies behave: https://www.reddit.com/r/LocalLLaMA/comments/14mrgpr/dynamically_scaled_rope_further_increases/. This is an experimental feature, subject to breaking API changes in future versions.
  • attention_bias (bool, 默认为 False, 可选, 默认为 False) — 是否在自注意力机制中的查询、键、值和输出投影层中使用偏置。
  • attention_dropout (float, optional, 默认为 0.0) — 注意力概率的丢弃比例。
  • clip_qkv (float, 可选) — 如果非 None,查询、键和值注意力状态的元素将被裁剪,以确保它们的绝对值不超过此值。
  • num_experts_per_tok (int, optional, 默认为 8) — 选择的专家数量.
  • num_experts (int, optional, 默认为 64) — 路由专家的数量。
  • output_router_logits (bool, 可选, 默认为 False) — 是否应由模型返回路由器logits。启用此选项还将允许模型输出辅助损失,包括负载平衡损失和路由器z损失。
  • router_aux_loss_coef (float, optional, defaults to 0.01) — 总损失的辅助损失因子。
  • norm_topk_prob (bool, optional, defaults to False) — 是否对topk概率进行归一化。

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

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

>>> from transformers import OlmoeModel, OlmoeConfig

>>> # Initializing a OLMoE 7B A1B style configuration
>>> configuration = OlmoeConfig()

>>> # Initializing a model from the OLMoE 7B A1B style configuration
>>> model = OlmoeModel(configuration)

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

OlmoeModel

transformers.OlmoeModel

< >

( config: OlmoeConfig )

参数

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

裸的Olmoe模型输出原始的隐藏状态,没有任何特定的头部。 该模型继承自PreTrainedModel。请查看超类文档以了解库为其所有模型实现的通用方法(如下载或保存、调整输入嵌入的大小、修剪头部等)。

该模型也是一个PyTorch torch.nn.Module 子类。 将其作为常规的PyTorch模块使用,并参考PyTorch文档以获取与一般使用和行为相关的所有信息。

Transformer解码器由config.num_hidden_layers层组成。每一层都是一个OlmoeDecoderLayer

前进

< >

( 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 use_cache: typing.Optional[bool] = None output_attentions: typing.Optional[bool] = None output_hidden_states: typing.Optional[bool] = None output_router_logits: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None cache_position: typing.Optional[torch.LongTensor] = None )

参数

  • input_ids (torch.LongTensor of shape (batch_size, sequence_length)) — Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide it.

    可以使用AutoTokenizer获取索引。详情请参见PreTrainedTokenizer.encode()PreTrainedTokenizer.call()

    什么是输入ID?

  • attention_mask (torch.Tensor of shape (batch_size, sequence_length), optional) — Mask to avoid performing attention on padding token indices. Mask values selected in [0, 1]:
    • 1 for tokens that are not masked,
    • 0 for tokens that are masked.

    什么是注意力掩码?

    可以使用AutoTokenizer获取索引。详情请参见PreTrainedTokenizer.encode()PreTrainedTokenizer.call()

    如果使用了past_key_values,可以选择只输入最后的input_ids(参见past_key_values)。

    如果你想改变填充行为,你应该阅读modeling_opt._prepare_decoder_attention_mask 并根据你的需求进行修改。有关默认策略的更多信息,请参见论文中的图1。

    • 1 indicates the head is not masked,
    • 0 indicates the head is masked.
  • position_ids (torch.LongTensor of shape (batch_size, sequence_length), optional) — Indices of positions of each input sequence tokens in the position embeddings. Selected in the range [0, config.n_positions - 1].

    什么是位置ID?

  • past_key_values (Cache or tuple(tuple(torch.FloatTensor)), optional) — Pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention blocks) that can be used to speed up sequential decoding. This typically consists in the past_key_values returned by the model at a previous stage of decoding, when use_cache=True or config.use_cache=True.

    允许两种格式:

    • a Cache instance;
    • Tuple of tuple(torch.FloatTensor) of length config.n_layers, with each tuple having 2 tensors of shape (batch_size, num_heads, sequence_length, embed_size_per_head)). This is also known as the legacy cache format.

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

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

  • inputs_embeds (torch.FloatTensor of shape (batch_size, sequence_length, hidden_size), optional) — 可选地,您可以选择直接传递嵌入表示,而不是传递input_ids。如果您希望对如何将input_ids索引转换为相关向量有更多控制,而不是使用模型的内部嵌入查找矩阵,这将非常有用。
  • use_cache (bool, 可选) — 如果设置为 Truepast_key_values 键值状态将被返回,并可用于加速解码(参见 past_key_values)。
  • output_attentions (bool, 可选) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参见返回张量下的attentions
  • output_hidden_states (bool, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参见返回张量下的hidden_states
  • output_router_logits (bool, optional) — 是否返回所有路由器的logits。它们对于计算路由器损失非常有用,并且在推理期间不应返回。
  • return_dict (bool, 可选) — 是否返回一个 ModelOutput 而不是一个普通的元组。
  • cache_position (torch.LongTensor of shape (sequence_length), optional) — 表示输入序列标记在序列中的位置的索引。与position_ids相反, 这个张量不受填充的影响。它用于在正确的位置更新缓存并推断 完整的序列长度。

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

尽管前向传递的配方需要在此函数内定义,但之后应该调用Module实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。

OlmoeForCausalLM

transformers.OlmoeForCausalLM

< >

( config )

前进

< >

( input_ids: LongTensor = None attention_mask: typing.Optional[torch.Tensor] = None position_ids: typing.Optional[torch.LongTensor] = None past_key_values: typing.Optional[typing.List[torch.FloatTensor]] = 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 output_router_logits: typing.Optional[bool] = None return_dict: typing.Optional[bool] = None cache_position: typing.Optional[torch.LongTensor] = None num_logits_to_keep: int = 0 **loss_kwargs ) transformers.modeling_outputs.MoeCausalLMOutputWithPasttuple(torch.FloatTensor)

参数

  • input_ids (torch.LongTensor of shape (batch_size, sequence_length)) — Indices of input sequence tokens in the vocabulary. Padding will be ignored by default should you provide it.

    可以使用AutoTokenizer获取索引。详情请参见PreTrainedTokenizer.encode()PreTrainedTokenizer.call()

    什么是输入ID?

  • attention_mask (torch.Tensor of shape (batch_size, sequence_length), optional) — Mask to avoid performing attention on padding token indices. Mask values selected in [0, 1]:
    • 1 for tokens that are not masked,
    • 0 for tokens that are masked.

    什么是注意力掩码?

    可以使用AutoTokenizer获取索引。详情请参见PreTrainedTokenizer.encode()PreTrainedTokenizer.call()

    如果使用了past_key_values,可以选择只输入最后的input_ids(参见past_key_values)。

    如果你想改变填充行为,你应该阅读modeling_opt._prepare_decoder_attention_mask 并根据你的需求进行修改。有关默认策略的更多信息,请参见论文中的图1。

    • 1 indicates the head is not masked,
    • 0 indicates the head is masked.
  • position_ids (torch.LongTensor of shape (batch_size, sequence_length), optional) — Indices of positions of each input sequence tokens in the position embeddings. Selected in the range [0, config.n_positions - 1].

    什么是位置ID?

  • past_key_values (Cache or tuple(tuple(torch.FloatTensor)), optional) — Pre-computed hidden-states (key and values in the self-attention blocks and in the cross-attention blocks) that can be used to speed up sequential decoding. This typically consists in the past_key_values returned by the model at a previous stage of decoding, when use_cache=True or config.use_cache=True.

    允许两种格式:

    • a Cache instance;
    • Tuple of tuple(torch.FloatTensor) of length config.n_layers, with each tuple having 2 tensors of shape (batch_size, num_heads, sequence_length, embed_size_per_head)). This is also known as the legacy cache format.

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

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

  • inputs_embeds (torch.FloatTensor of shape (batch_size, sequence_length, hidden_size), optional) — 可选地,您可以选择直接传递嵌入表示,而不是传递 input_ids。如果您希望对如何将 input_ids 索引转换为相关向量有更多控制,而不是使用模型的内部嵌入查找矩阵,这将非常有用。
  • use_cache (bool, 可选) — 如果设置为 Truepast_key_values 键值状态将被返回,并可用于加速解码(参见 past_key_values)。
  • output_attentions (bool, optional) — 是否返回所有注意力层的注意力张量。有关更多详细信息,请参见返回张量中的attentions
  • output_hidden_states (bool, 可选) — 是否返回所有层的隐藏状态。有关更多详细信息,请参见返回张量下的hidden_states
  • output_router_logits (bool, 可选) — 是否返回所有路由器的logits。它们对于计算路由器损失非常有用,并且 在推理期间不应返回。
  • return_dict (bool, 可选) — 是否返回一个 ModelOutput 而不是一个普通的元组。
  • cache_position (torch.LongTensor of shape (sequence_length), optional) — 表示输入序列标记在序列中的位置的索引。与position_ids不同, 这个张量不受填充的影响。它用于在正确的位置更新缓存并推断 完整的序列长度。
  • Args — labels (torch.LongTensor of shape (batch_size, sequence_length), optional): Labels for computing the masked language modeling loss. Indices should either be in [0, ..., config.vocab_size] or -100 (see input_ids docstring). Tokens with indices set to -100 are ignored (masked), the loss is only computed for the tokens with labels in [0, ..., config.vocab_size].

    num_logits_to_keep (int, 可选): 计算最后num_logits_to_keep个token的logits。如果为0,则计算所有input_ids的logits(特殊情况)。生成时只需要最后一个token的logits,仅计算该token的logits可以节省内存,这对于长序列或大词汇量来说非常重要。

返回

transformers.modeling_outputs.MoeCausalLMOutputWithPasttuple(torch.FloatTensor)

一个 transformers.modeling_outputs.MoeCausalLMOutputWithPast 或一个由 torch.FloatTensor 组成的元组(如果传递了 return_dict=False 或当 config.return_dict=False 时),包含各种元素,具体取决于配置(OlmoeConfig)和输入。

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

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

  • aux_loss (torch.FloatTensor可选,当提供 labels 时返回) — 稀疏模块的辅助损失。

  • router_logits (tuple(torch.FloatTensor)可选,当传递 output_router_probs=Trueconfig.add_router_probs=True 或当 config.output_router_probs=True 时返回) — 由 torch.FloatTensor 组成的元组(每层一个),形状为 (batch_size, sequence_length, num_experts)

    由 MoE 路由器计算的原始路由器 logits(softmax 后),这些项用于计算专家混合模型的辅助损失。

  • past_key_values (tuple(tuple(torch.FloatTensor))可选,当传递 use_cache=True 或当 config.use_cache=True 时返回) — 由 tuple(torch.FloatTensor) 组成的元组,长度为 config.n_layers,每个元组包含 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 后的注意力权重,用于计算自注意力头中的加权平均值。

OlmoeForCausalLM 的前向方法,重写了 __call__ 特殊方法。

尽管前向传递的配方需要在此函数内定义,但之后应该调用Module实例而不是这个,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。

示例:

>>> from transformers import AutoTokenizer, OlmoeForCausalLM

>>> model = OlmoeForCausalLM.from_pretrained("allenai/OLMoE-1B-7B-0924")
>>> tokenizer = AutoTokenizer.from_pretrained("allenai/OLMoE-1B-7B-0924")

>>> 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 sure if you’re conscious of this, but I’m'
< > Update on GitHub