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: 开放专家混合语言模型 中提出。
OLMoE 是一系列使用稀疏专家混合 (MoE) 的**开**放**语**言**模**型,旨在促进语言模型的科学研究。我们发布了所有代码、检查点、日志以及训练这些模型所涉及的详细信息。
论文摘要如下:
我们引入了 OLMoE,一个完全开放的、最先进的利用稀疏专家混合 (MoE) 的语言模型。OLMoE-1B-7B 有 70 亿 (B) 个参数,但在每个输入 token 上仅使用 10 亿个参数。我们在 5 万亿个 token 上对其进行预训练,并进一步对其进行调整以创建 OLMoE-1B-7B-Instruct。我们的模型优于所有具有类似活动参数的可用模型,甚至超过了 Llama2-13B-Chat 和 DeepSeekMoE-16B 等更大的模型。我们展示了关于 MoE 训练的各种实验,分析了模型中的路由,显示了高度的专业化,并开源了我们工作的所有方面:模型权重、训练数据、代码和日志。
此模型由 Muennighoff 贡献。原始代码可以 在此处 找到。
OlmoeConfig
类 transformers.OlmoeConfig
< 源代码 >( vocab_size = 50304 hidden_size = 2048 intermediate_size = 2048 num_hidden_layers = 16 num_attention_heads = 16 num_key_value_heads = None hidden_act = 'silu' max_position_embeddings = 4096 initializer_range = 0.02 rms_norm_eps = 1e-05 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 num_experts_per_tok = 8 num_experts = 64 output_router_logits = False router_aux_loss_coef = 0.01 norm_topk_prob = False **kwargs )
参数
- vocab_size (
int
, 可选, 默认为 50304) — OLMoE 模型的词汇量大小。定义了调用 OlmoeModel 时传递的inputs_ids
可以表示的不同 token 的数量 - hidden_size (
int
, 可选, 默认为 2048) — 隐藏表示的维度。 - intermediate_size (
int
, 可选, 默认为 2048) — MLP 表示的维度。 - num_hidden_layers (
int
,可选,默认为 16) — Transformer 解码器中隐藏层的数量。 - num_attention_heads (
int
,可选,默认为 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 (
str
或function
,可选,默认为"silu"
) — 解码器中的非线性激活函数(函数或字符串)。 - max_position_embeddings (
int
,可选,默认为 4096) — 此模型可能使用的最大序列长度。 - initializer_range (
float
,可选,默认为 0.02) — 用于初始化所有权重矩阵的截断正态初始化器的标准差。 - rms_norm_eps (
float
,可选,默认为 1e-05) — RMS 归一化层使用的 epsilon。 - use_cache (
bool
,可选,默认为True
) — 模型是否应返回最后的键/值注意力(并非所有模型都使用)。仅当config.is_decoder=True
时相关。 - pad_token_id (
int
,可选,默认为 1) — 填充标记 ID。 - bos_token_id (
int
,可选) — 流开始标记 ID。 - 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
,则对查询、键和值注意力状态的元素进行裁剪,以使其绝对值不超过此值。 - num_experts_per_tok (
int
,可选,默认为 8) — 选择的专家数量。 - num_experts (
int
,可选,默认为 64) — 路由专家的数量。 - output_router_logits (
bool
,可选,默认为False
) — 模型是否应返回路由器 logits。启用此选项还将允许模型输出辅助损失,包括负载均衡损失和路由器 z 损失。 - router_aux_loss_coef (
float
,可选,默认为 0.01) — 总损失的辅助损失因子。
OlmoeModel
类 transformers.OlmoeModel
< 源代码 >( config: OlmoeConfig )
参数
- config (OlmoeConfig) — 模型配置类,包含模型的所有参数。使用配置文件初始化不会加载与模型关联的权重,仅加载配置。查看from_pretrained()方法来加载模型权重。 config — OlmoeConfig
不带任何特定头的基本Olmoe模型,输出原始隐藏状态。此模型继承自PreTrainedModel。查看超类文档以了解库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入的大小、修剪头等)。
此模型也是一个PyTorch torch.nn.Module子类。将其用作常规PyTorch模块,并参考PyTorch文档以了解与一般用法和行为相关的所有事项。
包含config.num_hidden_layers层的Transformer解码器。每个层都是一个OlmoeDecoderLayer
。
前向传播
< 源代码 > ( 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 output_router_logits: 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 实例;
- 长度为
config.n_layers
的tuple(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
。 - output_router_logits (
bool
,可选) — 是否返回所有路由器的 logits。它们可用于计算路由器损失,并且不应在推理期间返回。 - return_dict (
bool
,可选) — 是否返回 ModelOutput 而不是普通元组。 - cache_position (
torch.LongTensor
形状为(sequence_length)
,可选) — 描述输入序列标记在序列中的位置的索引。与position_ids
不同,此张量不受填充的影响。它用于在正确的位置更新缓存并推断完整的序列长度。
The OlmoeModel 正向方法覆盖了 __call__
特殊方法。
虽然正向传递的配方需要在此函数内定义,但此后应调用 Module
实例,而不是此实例,因为前者负责运行预处理和后处理步骤,而后者则静默地忽略它们。
OlmoeForCausalLM
类 transformers.OlmoeForCausalLM
< 源代码 >(
前向传播
< 源代码 > ( input_ids: LongTensor = None attention_mask: Optional = None position_ids: Optional = None past_key_values: Optional = None inputs_embeds: Optional = None labels: Optional = None use_cache: Optional = None output_attentions: Optional = None output_hidden_states: Optional = None output_router_logits: Optional = None return_dict: Optional = None cache_position: Optional = None num_logits_to_keep: int = 0 ) → transformers.modeling_outputs.MoeCausalLMOutputWithPast
或 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)
,可选) — 位置嵌入中每个输入序列标记的位置索引。在[0, config.n_positions - 1]
范围内选择。 - past_key_values (
Cache
或tuple(tuple(torch.FloatTensor))
,可选) — 预先计算的隐藏状态(自注意力块和交叉注意力块中的键和值),可用于加速顺序解码。这通常包括模型在解码的先前阶段返回的past_key_values
,当use_cache=True
或config.use_cache=True
时。允许两种格式:
- 一个 Cache 实例;
- 长度为
config.n_layers
的tuple(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
。 - output_router_logits (
bool
, 可选) — 是否返回所有路由器的 logits。它们对于计算路由器损失很有用,在推理过程中不应返回。 - return_dict (
bool
, 可选) — 是否返回ModelOutput而不是普通元组。 - cache_position (
torch.LongTensor
形状为(sequence_length)
, 可选) — 描述输入序列标记在序列中的位置的索引。与position_ids
相反,此张量不受填充的影响。它用于在正确的位置更新缓存并推断完整的序列长度。参数 — labels (
torch.LongTensor
形状为(batch_size, sequence_length)
, 可选): 用于计算掩码语言建模损失的标签。索引应在[0, ..., config.vocab_size]
或 -100 中(请参阅input_ids
文档字符串)。索引设置为-100
的标记将被忽略(掩码),损失仅针对标签在[0, ..., config.vocab_size]
中的标记计算。num_logits_to_keep (
int
, 可选): 计算最后num_logits_to_keep
个标记的 logits。如果为0
,则为所有input_ids
计算 logits(特殊情况)。生成只需要最后一个标记的 logits,并且仅为该标记计算它们可以节省内存,这对于长序列或大型词汇量来说变得非常重要。
返回
transformers.modeling_outputs.MoeCausalLMOutputWithPast
或 tuple(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=True
和config.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
时返回) — 长度为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 之后的注意力权重,用于计算自注意力头中的加权平均值。
OlmoeForCausalLM 的前向方法,覆盖了__call__
特殊方法。
虽然正向传递的配方需要在此函数内定义,但此后应调用 Module
实例,而不是此实例,因为前者负责运行预处理和后处理步骤,而后者则静默地忽略它们。
示例
>>> from transformers import AutoTokenizer, OlmoeForCausalLM
>>> model = OlmoeForCausalLM.from_pretrained("allenai/OLMoE-1B-7B-0824")
>>> tokenizer = AutoTokenizer.from_pretrained("allenai/OLMoE-1B-7B-0824")
>>> 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'