Transformers 文档
NLLB-MOE
并获得增强的文档体验
开始使用
NLLB-MOE
概述
NLLB 模型在 No Language Left Behind:扩展以人为中心的机器翻译 中被提出,作者包括 Marta R. Costa-jussà, James Cross, Onur Çelebi, Maha Elbayad, Kenneth Heafield, Kevin Heffernan, Elahe Kalbassi, Janice Lam, Daniel Licht, Jean Maillard, Anna Sun, Skyler Wang, Guillaume Wenzek, Al Youngblood, Bapi Akula, Loic Barrault, Gabriel Mejia Gonzalez, Prangthip Hansanti, John Hoffman, Semarley Jarrett, Kaushik Ram Sadagopan, Dirk Rowe, Shannon Spruit, Chau Tran, Pierre Andrews, Necip Fazil Ayan, Shruti Bhosale, Sergey Edunov, Angela Fan, Cynthia Gao, Vedanuj Goswami, Francisco Guzmán, Philipp Koehn, Alexandre Mourachko, Christophe Ropers, Safiyyah Saleem, Holger Schwenk, 和 Jeff Wang。
该论文的摘要如下
在全球范围内消除语言障碍的目标驱动下,机器翻译已巩固其作为当今人工智能研究关键焦点的地位。然而,这些努力集中在少数几种语言上,而将绝大多数主要是低资源语言抛在后面。“打破 200 种语言障碍”需要什么?同时还要确保安全、高质量的结果,并牢记伦理考量?在“不让任何语言掉队”倡议中,我们通过与母语人士的探索性访谈,首先将对低资源语言翻译支持的需求置于背景之中。然后,我们创建了旨在缩小低资源语言和高资源语言之间性能差距的数据集和模型。更具体地说,我们开发了一种基于稀疏门控混合专家的条件计算模型,该模型在通过为低资源语言量身定制的新颖有效的数据挖掘技术获得的数据上进行训练。我们提出了多项架构和训练改进,以在数千个任务上训练时抵消过拟合。至关重要的是,我们使用人工翻译的基准 Flores-200 评估了超过 40,000 个不同翻译方向的性能,并将人工评估与涵盖 Flores-200 中所有语言的新型毒性基准相结合,以评估翻译安全性。我们的模型实现了相对于先前最先进水平 44% BLEU 值的提升,为实现通用翻译系统奠定了重要的基础。
此模型由 Arthur Zucker 贡献。原始代码可以在这里找到。
使用技巧
- M2M100ForConditionalGeneration 是 NLLB 和 NLLB MoE 的基础模型
- NLLB-MoE 与 NLLB 模型非常相似,但它的前馈层基于 SwitchTransformers 的实现。
- tokenizer 与 NLLB 模型相同。
与 SwitchTransformers 的实现差异
最大的区别在于 token 的路由方式。NLLB-MoE 使用 top-2-gate
,这意味着对于每个输入,仅根据门控网络预测的最高概率选择前两个专家,而忽略其余专家。在 SwitchTransformers
中,仅计算 top-1 概率,这意味着 token 被转发的可能性较小。此外,如果 token 没有路由到任何专家,SwitchTransformers
仍然会添加其未修改的隐藏状态(有点像残差连接),而在 NLLB
的 top-2 路由机制中,这些状态会被屏蔽。
使用 NLLB-MoE 生成
可用的 checkpoint 大约需要 350GB 的存储空间。如果您的机器上没有足够的 RAM,请确保使用 accelerate
。
在生成目标文本时,将 forced_bos_token_id
设置为目标语言 ID。以下示例展示了如何使用 facebook/nllb-200-distilled-600M 模型将英语翻译成法语。
请注意,我们正在使用法语的 BCP-47 代码 fra_Latn
。有关 Flores 200 数据集中所有 BCP-47 代码的列表,请参阅此处。
>>> from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("facebook/nllb-moe-54b")
>>> model = AutoModelForSeq2SeqLM.from_pretrained("facebook/nllb-moe-54b")
>>> article = "Previously, Ring's CEO, Jamie Siminoff, remarked the company started when his doorbell wasn't audible from his shop in his garage."
>>> inputs = tokenizer(article, return_tensors="pt")
>>> translated_tokens = model.generate(
... **inputs, forced_bos_token_id=tokenizer.lang_code_to_id["fra_Latn"], max_length=50
... )
>>> tokenizer.batch_decode(translated_tokens, skip_special_tokens=True)[0]
"Auparavant, le PDG de Ring, Jamie Siminoff, a fait remarquer que la société avait commencé lorsque sa sonnette n'était pas audible depuis son magasin dans son garage."
从英语以外的任何其他语言生成
英语 (eng_Latn
) 被设置为默认的翻译源语言。为了指定您想从其他语言进行翻译,您应该在 tokenizer 初始化中的 src_lang
关键字参数中指定 BCP-47 代码。
请参见以下罗马尼亚语到德语的翻译示例
>>> from transformers import AutoModelForSeq2SeqLM, AutoTokenizer
>>> tokenizer = AutoTokenizer.from_pretrained("facebook/nllb-moe-54b", src_lang="ron_Latn")
>>> model = AutoModelForSeq2SeqLM.from_pretrained("facebook/nllb-moe-54b")
>>> article = "Şeful ONU spune că nu există o soluţie militară în Siria"
>>> inputs = tokenizer(article, return_tensors="pt")
>>> translated_tokens = model.generate(
... **inputs, forced_bos_token_id=tokenizer.lang_code_to_id["deu_Latn"], max_length=30
... )
>>> tokenizer.batch_decode(translated_tokens, skip_special_tokens=True)[0]
资源
NllbMoeConfig
class transformers.NllbMoeConfig
< source >( vocab_size = 128112 max_position_embeddings = 1024 encoder_layers = 12 encoder_ffn_dim = 4096 encoder_attention_heads = 16 decoder_layers = 12 decoder_ffn_dim = 4096 decoder_attention_heads = 16 encoder_layerdrop = 0.05 decoder_layerdrop = 0.05 use_cache = True is_encoder_decoder = True activation_function = 'relu' d_model = 1024 dropout = 0.1 attention_dropout = 0.1 activation_dropout = 0.0 init_std = 0.02 decoder_start_token_id = 2 scale_embedding = True router_bias = False router_dtype = 'float32' router_ignore_padding_tokens = False num_experts = 128 expert_capacity = 64 encoder_sparse_step = 4 decoder_sparse_step = 4 router_z_loss_coef = 0.001 router_aux_loss_coef = 0.001 second_expert_policy = 'all' normalize_router_prob_before_dropping = False batch_prioritized_routing = False moe_eval_capacity_token_fraction = 1.0 moe_token_dropout = 0.2 pad_token_id = 1 bos_token_id = 0 eos_token_id = 2 output_router_logits = False **kwargs )
参数
- vocab_size (
int
, 可选, 默认为 50265) — NllbMoe 模型的词汇表大小。定义了在调用 NllbMoeModel 或 时传递的inputs_ids
可以表示的不同 token 的数量 - d_model (
int
, 可选, 默认为 1024) — 层和池化器层的维度。 - encoder_layers (
int
, 可选, 默认为 12) — 编码器层数。 - decoder_layers (
int
, 可选, 默认为 12) — 解码器层数。 - encoder_attention_heads (
int
, 可选, 默认为 16) — Transformer 编码器中每个注意力层的注意力头数。 - decoder_attention_heads (
int
, 可选, 默认为 16) — Transformer 解码器中每个注意力层的注意力头数。 - decoder_ffn_dim (
int
, 可选, 默认为 4096) — 解码器中“中间”层(通常称为前馈层)的维度。 - encoder_ffn_dim (
int
, 可选, 默认为 4096) — 编码器中“中间”层(通常称为前馈层)的维度。 - activation_function (
str
或function
, 可选, 默认为"gelu"
) — 编码器和池化器中的非线性激活函数(函数或字符串)。如果为字符串,则支持"gelu"
、"relu"
、"silu"
和"gelu_new"
。 - dropout (
float
, 可选, 默认为 0.1) — 嵌入层、编码器和池化器中所有全连接层的 dropout 概率。 - attention_dropout (
float
, 可选, 默认为 0.0) — 注意力概率的 dropout 比率。 - activation_dropout (
float
, 可选, 默认为 0.0) — 全连接层内部激活的 dropout 比率。 - classifier_dropout (
float
, 可选, 默认为 0.0) — 分类器的 dropout 比率。 - max_position_embeddings (
int
, 可选, 默认为 1024) — 此模型可能使用的最大序列长度。通常将其设置为较大的值以防万一(例如,512 或 1024 或 2048)。 - init_std (
float
, 可选, 默认为 0.02) — 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。 - encoder_layerdrop (
float
, 可选, 默认为 0.0) — 编码器的 LayerDrop 概率。有关更多详细信息,请参阅 [LayerDrop 论文](see https://arxiv.org/abs/1909.11556)。 - decoder_layerdrop (
float
, 可选, 默认为 0.0) — 解码器的 LayerDrop 概率。有关更多详细信息,请参阅 [LayerDrop 论文](see https://arxiv.org/abs/1909.11556)。 - second_expert_policy (
str
, 可选, 默认为"all"
) — 用于对每个 token 采样被采样到第二个专家的概率的策略。 - normalize_router_prob_before_dropping (
bool
, 可选, 默认为True
) — 是否在应用基于专家容量的掩码(容量丢弃)之前,对路由器概率进行归一化。 - batch_prioritized_routing (
bool
, 可选, 默认为True
) — 是否在容量丢弃之前按路由器概率对 token 进行排序。这意味着具有最高概率的 token 将优先于序列中可能更靠后的其他 token 进行路由。 - moe_eval_capacity_token_fraction (
float
, 可选, 默认为 1.0) — 验证期间作为容量的 token 分数,如果设置为负数,则使用与训练相同的容量。应在范围 (0.0, 1.0] 内。 - num_experts (
int
, 可选, 默认为 128) — 每个 NllbMoeSparseMlp 层的专家数量。 - expert_capacity (
int
, 可选, 默认为 64) — 每个专家可以存储的 token 数量。 - encoder_sparse_step (
int
, 可选, 默认为 4) — 编码器中稀疏层的频率。4 表示每 4 层中有一层是稀疏层。 - decoder_sparse_step (
int
, 可选, 默认为 4) — 解码器中稀疏层的频率。4 表示每 4 层中有一层是稀疏层。 - router_dtype (
str
, 可选, 默认为"float32"
) — 路由器使用的dtype
。最好将dtype
保留为"float32"
,如 论文中选择性精度讨论中所述。 - router_ignore_padding_tokens (
bool
, 可选, 默认为False
) — 路由时是否忽略 padding token。如果为False
,则 padding token 不会路由到任何专家。 - router_bias (
bool
, 可选, 默认为False
) — 路由器的分类器是否应具有偏置。 - moe_token_dropout (
float
, 可选, 默认为 0.2) — MoE 专家输出掩码(EOM)的掩码率,通过对专家输出执行 Dropout2d 来实现。 - output_router_logits (
bool
, 可选, 默认为False
) — 是否返回路由器 logits。仅当训练时需要获取辅助损失时才设置为True
。 - use_cache (
bool
, 可选, 默认为True
) — 模型是否应返回最后的键/值注意力(并非所有模型都使用)。
这是用于存储 NllbMoeModel 配置的配置类。它用于根据指定的参数实例化 NLLB-MoE 模型,定义模型架构。使用默认值实例化配置将产生类似于 NLLB-MoE facebook/nllb-moe-54b 架构的配置。
配置对象继承自 PretrainedConfig,可用于控制模型输出。有关更多信息,请阅读 PretrainedConfig 的文档。
示例
>>> from transformers import NllbMoeModel, NllbMoeConfig
>>> # Initializing a NllbMoe facebook/nllb-moe-54b style configuration
>>> configuration = NllbMoeConfig()
>>> # Initializing a model from the facebook/nllb-moe-54b style configuration
>>> model = NllbMoeModel(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
NllbMoeTop2Router
路由器使用 token 选择前 2 个专家的分配。
此路由器使用与 fairseq 仓库中 NLLB-MoE 相同的机制。项目按 router_probs 排序,然后路由到其选择的专家,直到专家的 expert_capacity 达到上限。 不保证每个 token 都由专家处理,或者每个专家至少接收到一个 token。
路由器组合权重也返回,以确保未更新的状态将被掩盖。
route_tokens
< source >( router_logits: Tensor input_dtype: dtype = torch.float32 padding_mask: typing.Optional[torch.LongTensor] = None )
计算每个专家的 dispatch_mask
和 dispatch_weights
。掩码适用于专家容量。
forward
< source >( hidden_states: Tensor padding_mask: typing.Optional[torch.LongTensor] = None ) → top_1_mask (torch.Tensor
of shape (batch_size, sequence_length))
参数
- hidden_states (
torch.Tensor
) — 来自计算路由器概率的 (batch_size, sequence_length, hidden_dim)。
返回
top_1_mask (torch.Tensor
of shape (batch_size, sequence_length))
形状为 [batch_size, sequence_length] 的索引张量,对应于使用路由器 top1 概率为每个 token 选择的专家。 router_probabilities (torch.Tensor
of shape (batch_size, sequence_length, nump_experts)): 形状为 (batch_size, sequence_length, num_experts) 的张量,对应于每个 token 和专家的概率。用于将 token 路由到专家。 router_logits (torch.Tensor
of shape (batch_size, sequence_length))): 形状为 (batch_size, sequence_length, num_experts) 的 logits 张量,对应于原始路由器 logits。这稍后用于计算路由器 z 损失。
隐藏状态被重塑,以简化路由器概率的计算(每个专家的组合权重。)
NllbMoeSparseMLP
class transformers.NllbMoeSparseMLP
< source >( config: NllbMoeConfig ffn_dim: int expert_class: Module = <class 'transformers.models.nllb_moe.modeling_nllb_moe.NllbMoeDenseActDense'> )
NLLB-MoE 稀疏 MLP 模块的实现。
forward
< source >( hidden_states: Tensor padding_mask: typing.Optional[torch.Tensor] = False ) → hidden_states (torch.Tensor
of shape (batch_size, sequence_length, hidden_dim)
)
参数
- hidden_states (
torch.Tensor
of shape(batch_size, sequence_length, hidden_dim)
) — 隐藏状态 - padding_mask (
torch.Tensor
, 可选, 默认为False
) — 注意力掩码。可以是因果形式或非因果形式。
返回
hidden_states (torch.Tensor
of shape (batch_size, sequence_length, hidden_dim)
)
更新后的隐藏状态 router_logits (torch.Tensor
of shape (batch_size, sequence_length, num_experts)
): 计算损失所需
此正向传递的目标是使操作数量与等效的 NllbMoeDenseActDense
(mlp) 层相同。这意味着所有隐藏状态最多应处理两次(因为我们使用的是 top_2 gating 机制)。这意味着我们将复杂度保持在 O(batch_size x sequence_length x hidden_dim),而不是 O(num_experts x batch_size x sequence_length x hidden_dim)。
1- 从 router
获取 router_probs
。 router_mask
的形状为 (batch_size X sequence_length, num_expert)
,对应于 router_probs
的布尔版本。输入使用 router_mask
进行掩码。
2- 将 hidden_states 分派到其关联的专家。路由器概率用于在更新掩码后的隐藏状态时对每个专家的贡献进行加权。
NllbMoeModel
class transformers.NllbMoeModel
< source >( config: NllbMoeConfig )
参数
- config (NllbMoeConfig) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载与模型关联的权重,仅加载配置。查看 from_pretrained() 方法来加载模型权重。
裸 NllbMoe 模型,输出原始隐藏状态,顶部没有任何特定的 head。此模型继承自 PreTrainedModel。查看超类文档,了解库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝 head 等)。
此模型也是 PyTorch torch.nn.Module 子类。将其用作常规 PyTorch 模块,并参阅 PyTorch 文档,了解与常规用法和行为相关的所有事项。
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.Tensor] = None decoder_input_ids: typing.Optional[torch.LongTensor] = None decoder_attention_mask: typing.Optional[torch.LongTensor] = None head_mask: typing.Optional[torch.Tensor] = None decoder_head_mask: typing.Optional[torch.Tensor] = None cross_attn_head_mask: typing.Optional[torch.Tensor] = None encoder_outputs: typing.Optional[typing.Tuple[typing.Tuple[torch.FloatTensor]]] = None past_key_values: typing.Optional[typing.Tuple[typing.Tuple[torch.FloatTensor]]] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None decoder_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 ) → transformers.modeling_outputs.Seq2SeqMoEModelOutput
或 tuple(torch.FloatTensor)
参数
- input_ids (
torch.LongTensor
,形状为(batch_size, sequence_length)
) — 词汇表中输入序列 tokens 的索引。如果提供 padding,默认情况下将被忽略。
返回
transformers.modeling_outputs.Seq2SeqMoEModelOutput
或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.Seq2SeqMoEModelOutput
或 torch.FloatTensor
的 tuple(如果传递了 return_dict=False
或者当 config.return_dict=False
时),包含各种元素,具体取决于配置 (NllbMoeConfig) 和输入。
-
last_hidden_state (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
) — 模型解码器最后一层的输出处的隐藏状态序列。如果使用
past_key_values
,则仅输出形状为(batch_size, 1, hidden_size)
的序列的最后一个隐藏状态。 -
past_key_values (
tuple(tuple(torch.FloatTensor))
,可选,当传递use_cache=True
或当config.use_cache=True
时返回) — 长度为config.n_layers
的tuple(torch.FloatTensor)
的 tuple,每个 tuple 具有 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
) 的 tensors 和 2 个形状为(batch_size, num_heads, encoder_sequence_length, embed_size_per_head)
的附加 tensors。包含预先计算的隐藏状态(自注意力模块和交叉注意力模块中的键和值),这些状态可以用于(参见
past_key_values
输入)加速顺序解码。 -
decoder_hidden_states (
tuple(torch.FloatTensor)
,可选,当传递output_hidden_states=True
或当config.output_hidden_states=True
时返回) —torch.FloatTensor
的 tuple(如果模型具有嵌入层,则为嵌入输出的 tuple,+ 每个层的输出一个 tuple),形状为(batch_size, sequence_length, hidden_size)
。解码器在每一层输出处的隐藏状态,加上可选的初始嵌入输出。
-
decoder_attentions (
tuple(torch.FloatTensor)
,可选,当传递output_attentions=True
或当config.output_attentions=True
时返回) —torch.FloatTensor
的 tuple(每层一个 tuple),形状为(batch_size, num_heads, sequence_length, sequence_length)
。解码器的注意力权重,在注意力 softmax 之后,用于计算自注意力头的加权平均值。
-
decoder_router_logits (
tuple(torch.FloatTensor)
,可选,当传递output_router_logits=True
或当config.add_router_probs=True
时返回) —torch.FloatTensor
的 tuple(每层一个 tuple),形状为(batch_size, sequence_length, num_experts)
。解码器模型的路由器 logits,用于计算专家混合模型的辅助损失。
-
cross_attentions (
tuple(torch.FloatTensor)
,可选,当传递output_attentions=True
或当config.output_attentions=True
时返回) —torch.FloatTensor
的 tuple(每层一个 tuple),形状为(batch_size, num_heads, sequence_length, sequence_length)
。解码器的交叉注意力层的注意力权重,在注意力 softmax 之后,用于计算交叉注意力头的加权平均值。
-
encoder_last_hidden_state (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
,可选) — 模型编码器最后一层的输出处的隐藏状态序列。 -
encoder_hidden_states (
tuple(torch.FloatTensor)
,可选,当传递output_hidden_states=True
或当config.output_hidden_states=True
时返回) —torch.FloatTensor
的 tuple(如果模型具有嵌入层,则为嵌入输出的 tuple,+ 每个层的输出一个 tuple),形状为(batch_size, sequence_length, hidden_size)
。编码器在每一层输出处的隐藏状态,加上可选的初始嵌入输出。
-
encoder_attentions (
tuple(torch.FloatTensor)
,可选,当传递output_attentions=True
或当config.output_attentions=True
时返回) —torch.FloatTensor
的 tuple(每层一个 tuple),形状为(batch_size, num_heads, sequence_length, sequence_length)
。编码器的注意力权重,在注意力 softmax 之后,用于计算自注意力头的加权平均值。
-
encoder_router_logits (
tuple(torch.FloatTensor)
,可选,当传递output_router_logits=True
或当config.add_router_probs=True
时返回) —torch.FloatTensor
的 tuple(每层一个 tuple),形状为(batch_size, sequence_length, num_experts)
。编码器模型的路由器 logits,用于计算稀疏模块的辅助损失和 z_loss。
NllbMoeModel 的 forward 方法,覆盖了 __call__
特殊方法。
虽然 forward 传递的配方需要在该函数中定义,但应该在之后调用 Module
实例,而不是调用此函数,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。
NllbMoeModel 的 forward 方法,覆盖了 __call__
特殊方法。
虽然 forward 传递的配方需要在该函数中定义,但应该在之后调用 Module
实例,而不是调用此函数,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。
示例
>>> from transformers import AutoTokenizer, NllbMoeModel
>>> tokenizer = AutoTokenizer.from_pretrained("hf-internal-testing/random-nllb-moe-2-experts")
>>> model = SwitchTransformersModel.from_pretrained("hf-internal-testing/random-nllb-moe-2-experts")
>>> input_ids = tokenizer(
... "Studies have been shown that owning a dog is good for you", return_tensors="pt"
... ).input_ids # Batch size 1
>>> decoder_input_ids = tokenizer("Studies show that", return_tensors="pt").input_ids # Batch size 1
>>> # preprocess: Prepend decoder_input_ids with start token which is pad token for NllbMoeModel
>>> decoder_input_ids = model._shift_right(decoder_input_ids)
>>> # forward pass
>>> outputs = model(input_ids=input_ids, decoder_input_ids=decoder_input_ids)
>>> last_hidden_states = outputs.last_hidden_state
NllbMoeForConditionalGeneration
class transformers.NllbMoeForConditionalGeneration
< source >( config: NllbMoeConfig )
参数
- config (NllbMoeConfig) — 包含模型所有参数的模型配置类。使用配置文件初始化不会加载与模型关联的权重,仅加载配置。查看 from_pretrained() 方法来加载模型权重。
带有语言建模 head 的 NllbMoe 模型。可用于摘要。此模型继承自 PreTrainedModel。查看超类文档,了解库为所有模型实现的通用方法(例如下载或保存、调整输入嵌入大小、剪枝 head 等)。
此模型也是 PyTorch torch.nn.Module 子类。将其用作常规 PyTorch 模块,并参阅 PyTorch 文档,了解与常规用法和行为相关的所有事项。
forward
< source >( input_ids: typing.Optional[torch.LongTensor] = None attention_mask: typing.Optional[torch.Tensor] = None decoder_input_ids: typing.Optional[torch.LongTensor] = None decoder_attention_mask: typing.Optional[torch.LongTensor] = None head_mask: typing.Optional[torch.Tensor] = None decoder_head_mask: typing.Optional[torch.Tensor] = None cross_attn_head_mask: typing.Optional[torch.Tensor] = None encoder_outputs: typing.Optional[typing.Tuple[typing.Tuple[torch.FloatTensor]]] = None past_key_values: typing.Optional[typing.Tuple[typing.Tuple[torch.FloatTensor]]] = None inputs_embeds: typing.Optional[torch.FloatTensor] = None decoder_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 ) → transformers.modeling_outputs.Seq2SeqMoEOutput
或 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)
,可选) — Mask,用于避免在 padding token 索引上执行注意力机制。Mask 值在[0, 1]
中选择:- 1 表示 tokens 未被 mask,
- 0 表示 tokens 已被 mask。
- decoder_input_ids (
torch.LongTensor
,形状为(batch_size, target_sequence_length)
,可选) — 词汇表中解码器输入序列 tokens 的索引。索引可以使用 AutoTokenizer 获得。请参阅 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call() 了解详细信息。
NllbMoe 使用
eos_token_id
作为decoder_input_ids
生成的起始 token。如果使用past_key_values
,则可以选择仅输入最后一个decoder_input_ids
(那些没有将其过去键值状态提供给此模型的 tokens)(请参阅past_key_values
)。 - decoder_attention_mask (
torch.LongTensor
,形状为(batch_size, target_sequence_length)
,可选) — 默认行为:生成一个 tensor,该 tensor 忽略decoder_input_ids
中的 pad tokens。默认情况下也将使用因果 mask。 - head_mask (
torch.Tensor
,形状为(encoder_layers, encoder_attention_heads)
,可选) — Mask,用于使编码器中注意力模块的选定 head 无效。Mask 值在[0, 1]
中选择:- 1 表示 head 未被 mask,
- 0 表示 head 已被 mask。
- decoder_head_mask (
torch.Tensor
,形状为(decoder_layers, decoder_attention_heads)
,可选) — Mask,用于使解码器中注意力模块的选定 head 无效。Mask 值在[0, 1]
中选择:- 1 表示 head 未被 mask,
- 0 表示 head 已被 mask。
- cross_attn_head_mask (
torch.Tensor
,形状为(decoder_layers, decoder_attention_heads)
,可选) — Mask,用于使解码器中交叉注意力模块的选定 head 无效。Mask 值在[0, 1]
中选择:- 1 表示 head 未被 mask,
- 0 表示 head 已被 mask。
- encoder_outputs (
tuple(tuple(torch.FloatTensor)
,可选) — Tuple 由 (last_hidden_state
, 可选:hidden_states
, 可选:attentions
) 组成last_hidden_state
的形状为(batch_size, sequence_length, hidden_size)
, 可选) 是编码器最后一层输出处的隐藏状态序列。在解码器的交叉注意力中使用。 - past_key_values (
tuple(tuple(torch.FloatTensor))
,可选,当传递use_cache=True
或当config.use_cache=True
时返回) — 长度为config.n_layers
的tuple(torch.FloatTensor)
的 Tuple,每个 tuple 具有 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
) 的 tensors 和 2 个形状为(batch_size, num_heads, encoder_sequence_length, embed_size_per_head)
的附加 tensors。包含预先计算的隐藏状态(自注意力模块和交叉注意力模块中的键和值),这些状态可以用于(参见
past_key_values
输入)加速顺序解码。如果使用
past_key_values
,则用户可以选择仅输入最后一个decoder_input_ids
(那些没有将其过去键值状态提供给此模型的 tokens),其形状为(batch_size, 1)
,而不是所有形状为(batch_size, sequence_length)
的decoder_input_ids
。 - inputs_embeds (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
,可选) — (可选)您可以选择直接传递嵌入表示,而不是传递input_ids
。如果您希望比模型的内部嵌入查找矩阵更精细地控制如何将input_ids
索引转换为关联向量,这将非常有用。 - decoder_inputs_embeds (
torch.FloatTensor
,形状为(batch_size, target_sequence_length, hidden_size)
,可选) — (可选)您可以选择直接传递嵌入表示,而不是传递decoder_input_ids
。如果使用了past_key_values
,则可以选择仅输入最后一个decoder_inputs_embeds
(参见past_key_values
)。如果您希望比模型的内部嵌入查找矩阵更精细地控制如何将decoder_input_ids
索引转换为关联向量,这将非常有用。如果
decoder_input_ids
和decoder_inputs_embeds
均未设置,则decoder_inputs_embeds
取inputs_embeds
的值。 - 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 而不是普通元组。 - labels (
torch.LongTensor
,形状为(batch_size, sequence_length)
,可选) — 用于计算掩码语言建模损失的标签。 索引应为[0, ..., config.vocab_size]
或 -100(请参阅input_ids
文档字符串)。 索引设置为-100
的标记将被忽略(掩码),损失仅针对标签在[0, ..., config.vocab_size]
中的标记计算。
返回
transformers.modeling_outputs.Seq2SeqMoEOutput
或 tuple(torch.FloatTensor)
一个 transformers.modeling_outputs.Seq2SeqMoEOutput
或 torch.FloatTensor
元组(如果传递了 return_dict=False
或当 config.return_dict=False
时),包含各种元素,具体取决于配置 (NllbMoeConfig) 和输入。
-
loss (
torch.FloatTensor
,形状为(1,)
,可选,当提供labels
时返回) — 语言建模损失。 -
logits (
torch.FloatTensor
,形状为(batch_size, sequence_length, config.vocab_size)
) — 语言建模头的预测分数(SoftMax 之前每个词汇标记的分数)。 -
past_key_values (
tuple(tuple(torch.FloatTensor))
,可选,当传递use_cache=True
或当config.use_cache=True
时返回) — 长度为config.n_layers
的tuple(torch.FloatTensor)
的 tuple,每个 tuple 具有 2 个形状为(batch_size, num_heads, sequence_length, embed_size_per_head)
) 的 tensors 和 2 个形状为(batch_size, num_heads, encoder_sequence_length, embed_size_per_head)
的附加 tensors。包含预先计算的隐藏状态(自注意力模块和交叉注意力模块中的键和值),这些状态可以用于(参见
past_key_values
输入)加速顺序解码。 -
decoder_hidden_states (
tuple(torch.FloatTensor)
,可选,当传递output_hidden_states=True
或当config.output_hidden_states=True
时返回) —torch.FloatTensor
的 tuple(如果模型具有嵌入层,则为嵌入输出的 tuple,+ 每个层的输出一个 tuple),形状为(batch_size, sequence_length, hidden_size)
。解码器在每一层输出端的隐藏状态,加上初始嵌入输出。
-
decoder_attentions (
tuple(torch.FloatTensor)
,可选,当传递output_attentions=True
或当config.output_attentions=True
时返回) —torch.FloatTensor
的 tuple(每层一个 tuple),形状为(batch_size, num_heads, sequence_length, sequence_length)
。解码器的注意力权重,在注意力 softmax 之后,用于计算自注意力头的加权平均值。
-
decoder_router_logits (
tuple(torch.FloatTensor)
,可选,当传递output_router_logits=True
或当config.add_router_probs=True
时返回) —torch.FloatTensor
的 tuple(每层一个 tuple),形状为(batch_size, sequence_length, num_experts)
。解码器模型的路由器 logits,用于计算专家混合模型的辅助损失。
-
cross_attentions (
tuple(torch.FloatTensor)
,可选,当传递output_attentions=True
或当config.output_attentions=True
时返回) —torch.FloatTensor
的 tuple(每层一个 tuple),形状为(batch_size, num_heads, sequence_length, sequence_length)
。解码器的交叉注意力层的注意力权重,在注意力 softmax 之后,用于计算交叉注意力头的加权平均值。
-
encoder_last_hidden_state (
torch.FloatTensor
,形状为(batch_size, sequence_length, hidden_size)
,可选) — 模型编码器最后一层的输出处的隐藏状态序列。 -
encoder_hidden_states (
tuple(torch.FloatTensor)
,可选,当传递output_hidden_states=True
或当config.output_hidden_states=True
时返回) —torch.FloatTensor
的 tuple(如果模型具有嵌入层,则为嵌入输出的 tuple,+ 每个层的输出一个 tuple),形状为(batch_size, sequence_length, hidden_size)
。编码器在每一层输出端的隐藏状态,加上初始嵌入输出。
-
encoder_attentions (
tuple(torch.FloatTensor)
,可选,当传递output_attentions=True
或当config.output_attentions=True
时返回) —torch.FloatTensor
的 tuple(每层一个 tuple),形状为(batch_size, num_heads, sequence_length, sequence_length)
。编码器的注意力权重,在注意力 softmax 之后,用于计算自注意力头的加权平均值。
-
encoder_router_logits (
tuple(torch.FloatTensor)
,可选,当传递output_router_logits=True
或当config.add_router_probs=True
时返回) —torch.FloatTensor
的 tuple(每层一个 tuple),形状为(batch_size, sequence_length, num_experts)
。编码器模型的路由器 logits,用于计算混合专家模型的辅助损失和 z_loss。
transformers.NllbMoeForConditionalGeneration
前向方法,覆盖了 __call__
特殊方法。
虽然 forward 传递的配方需要在该函数中定义,但应该在之后调用 Module
实例,而不是调用此函数,因为前者负责运行预处理和后处理步骤,而后者会默默地忽略它们。
翻译示例
>>> from transformers import AutoTokenizer, NllbMoeForConditionalGeneration
>>> model = NllbMoeForConditionalGeneration.from_pretrained("facebook/nllb-moe-54b")
>>> tokenizer = AutoTokenizer.from_pretrained("facebook/nllb-moe-54b")
>>> text_to_translate = "Life is like a box of chocolates"
>>> model_inputs = tokenizer(text_to_translate, return_tensors="pt")
>>> # translate to French
>>> gen_tokens = model.generate(**model_inputs, forced_bos_token_id=tokenizer.get_lang_id("eng_Latn"))
>>> print(tokenizer.batch_decode(gen_tokens, skip_special_tokens=True))