Transformers 文件
M2M100
並獲得增強的文件體驗
開始使用
M2M100
概述
M2M100 模型由 Angela Fan、Shruti Bhosale、Holger Schwenk、Zhiyi Ma、Ahmed El-Kishky、Siddharth Goyal、Mandeep Baines、Onur Celebi、Guillaume Wenzek、Vishrav Chaudhary、Naman Goyal、Tom Birch、Vitaliy Liptchinsky、Sergey Edunov、Edouard Grave、Michael Auli、Armand Joulin 在論文《Beyond English-Centric Multilingual Machine Translation》中提出。
論文摘要如下:
現有的翻譯工作透過訓練一個能夠在任意語言對之間進行翻譯的單一模型,展示了大規模多語言機器翻譯的潛力。然而,這些工作大多是以英語為中心,僅在被翻譯成英語或從英語翻譯的資料上進行訓練。雖然這有大量訓練資料的支援,但並不能反映全球範圍內的翻譯需求。在這項工作中,我們建立了一個真正的多對多(Many-to-Many)多語言翻譯模型,能夠直接在 100 種語言的任意兩種之間進行翻譯。我們構建並開源了一個訓練資料集,該資料集透過大規模資料探勘建立,涵蓋了數千個有監督資料的語言方向。然後,我們探索瞭如何透過密集縮放和特定語言的稀疏引數相結合來有效增加模型容量,以建立高質量的模型。我們專注於非英語中心的模型,在非英語方向之間直接翻譯時,BLEU 值提高了 10 分以上,同時在 WMT 上的表現與最佳的單一系統相當。我們開源了我們的指令碼,以便其他人可以復現資料、評估和最終的 M2M-100 模型。
此模型由 valhalla 貢獻。
使用技巧和示例
M2M100 是一個多語言編碼器-解碼器(seq-to-seq)模型,主要用於翻譯任務。由於該模型是多語言的,它期望輸入序列遵循特定格式:一個特殊的語言 ID 詞元被用作源文字和目標文字的字首。源文字的格式為 [lang_code] X [eos]
,其中 lang_code
是源文字的源語言 ID 或目標文字的目標語言 ID,X
是源文字或目標文字。
[!NOTE] 當使用除“eager”之外的注意力實現時,
head_mask
引數會被忽略。如果你有head_mask
並且希望它生效,請使用XXXModel.from_pretrained(model_id, attn_implementation="eager")
載入模型。
M2M100Tokenizer 依賴於 sentencepiece
,因此在執行示例前請確保已安裝。要安裝 sentencepiece
,請執行 pip install sentencepiece
。
有監督訓練
from transformers import M2M100Config, M2M100ForConditionalGeneration, M2M100Tokenizer
model = M2M100ForConditionalGeneration.from_pretrained("facebook/m2m100_418M")
tokenizer = M2M100Tokenizer.from_pretrained("facebook/m2m100_418M", src_lang="en", tgt_lang="fr")
src_text = "Life is like a box of chocolates."
tgt_text = "La vie est comme une boîte de chocolat."
model_inputs = tokenizer(src_text, text_target=tgt_text, return_tensors="pt")
loss = model(**model_inputs).loss # forward pass
生成
M2M100 使用 eos_token_id
作為 decoder_start_token_id
進行生成,並將目標語言 ID 強制作為第一個生成的詞元。要強制將目標語言 ID 作為第一個生成的詞元,請將 forced_bos_token_id 引數傳遞給 generate 方法。以下示例展示瞭如何使用 facebook/m2m100_418M 檢查點進行印地語到法語和中文到英語的翻譯。
>>> from transformers import M2M100ForConditionalGeneration, M2M100Tokenizer
>>> hi_text = "जीवन एक चॉकलेट बॉक्स की तरह है।"
>>> chinese_text = "生活就像一盒巧克力。"
>>> model = M2M100ForConditionalGeneration.from_pretrained("facebook/m2m100_418M")
>>> tokenizer = M2M100Tokenizer.from_pretrained("facebook/m2m100_418M")
>>> # translate Hindi to French
>>> tokenizer.src_lang = "hi"
>>> encoded_hi = tokenizer(hi_text, return_tensors="pt")
>>> generated_tokens = model.generate(**encoded_hi, forced_bos_token_id=tokenizer.get_lang_id("fr"))
>>> tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
"La vie est comme une boîte de chocolat."
>>> # translate Chinese to English
>>> tokenizer.src_lang = "zh"
>>> encoded_zh = tokenizer(chinese_text, return_tensors="pt")
>>> generated_tokens = model.generate(**encoded_zh, forced_bos_token_id=tokenizer.get_lang_id("en"))
>>> tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
"Life is like a box of chocolate."
資源
M2M100Config
class transformers.M2M100Config
< 來源 >( 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 pad_token_id = 1 bos_token_id = 0 eos_token_id = 2 **kwargs )
引數
- vocab_size (
int
,可選,預設為 50265) — M2M100 模型的詞彙表大小。定義了在呼叫 M2M100Model 時,可以透過inputs_ids
傳遞的不同詞元的數量。 - 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) — 用於初始化所有權重矩陣的截斷正態分佈初始化器的標準差。 - encoder_layerdrop (
float
,可選,預設為 0.0) — 編碼器的 LayerDrop 機率。更多細節請參閱 [LayerDrop 論文](https://huggingface.co/papers/1909.11556)。 - decoder_layerdrop (
float
, 可選, 預設為 0.0) — 解碼器的 LayerDrop 機率。更多詳情請參閱 [LayerDrop 論文](參見 https://huggingface.co/papers/1909.11556)。 - use_cache (
bool
, 可選, 預設為True
) — 模型是否應返回最後一個鍵/值注意力(並非所有模型都使用)。
這是一個用於儲存 M2M100Model 配置的配置類。它用於根據指定的引數例項化一個 M2M100 模型,定義模型架構。使用預設值例項化配置將產生與 M2M100 facebook/m2m100_418M 架構類似的配置。
配置物件繼承自 PretrainedConfig,可用於控制模型輸出。請閱讀 PretrainedConfig 的文件以獲取更多資訊。
示例
>>> from transformers import M2M100Config, M2M100Model
>>> # Initializing a M2M100 facebook/m2m100_418M style configuration
>>> configuration = M2M100Config()
>>> # Initializing a model (with random weights) from the facebook/m2m100_418M style configuration
>>> model = M2M100Model(configuration)
>>> # Accessing the model configuration
>>> configuration = model.config
M2M100Tokenizer
class transformers.M2M100Tokenizer
< 原始碼 >( vocab_file spm_file src_lang = None tgt_lang = None bos_token = '<s>' eos_token = '</s>' sep_token = '</s>' pad_token = '<pad>' unk_token = '<unk>' language_codes = 'm2m100' sp_model_kwargs: typing.Optional[dict[str, typing.Any]] = None num_madeup_words = 8 **kwargs )
引數
- vocab_file (
str
) — 詞彙表文件的路徑。 - spm_file (
str
) — SentencePiece 檔案的路徑(通常副檔名為 .spm),該檔案包含詞彙表。 - src_lang (
str
, 可選) — 表示源語言的字串。 - tgt_lang (
str
, 可選) — 表示目標語言的字串。 - eos_token (
str
, 可選, 預設為"</s>"
) — 序列結束標記。 - sep_token (
str
, 可選, 預設為"</s>"
) — 分隔標記,用於從多個序列構建一個序列,例如用於序列分類的兩個序列,或用於問答任務的文字和問題。它也用作使用特殊標記構建的序列的最後一個標記。 - unk_token (
str
, 可選, 預設為"<unk>"
) — 未知標記。不在詞彙表中的標記無法轉換為 ID,將被設定為此標記。 - pad_token (
str
, 可選, 預設為"<pad>"
) — 用於填充的標記,例如在批處理不同長度的序列時使用。 - language_codes (
str
, 可選, 預設為"m2m100"
) — 使用哪種語言程式碼。應為"m2m100"
或"wmt21"
之一。 - sp_model_kwargs (
dict
, 可選) — 將傳遞給SentencePieceProcessor.__init__()
方法。SentencePiece 的 Python 包裝器可用於設定以下內容等:-
enable_sampling
: 啟用子詞正則化。 -
nbest_size
: unigram 的取樣引數。對 BPE-Dropout 無效。nbest_size = {0,1}
: 不執行取樣。nbest_size > 1
: 從 nbest_size 個結果中取樣。nbest_size < 0
: 假設 nbest_size 是無限的,並使用前向過濾-後向取樣演算法從所有假設(格)中取樣。
-
alpha
: unigram 取樣的平滑引數,以及 BPE-dropout 的合併操作的丟棄機率。
-
構建一個 M2M100 分詞器。基於 SentencePiece。
此分詞器繼承自 PreTrainedTokenizer,其中包含大多數主要方法。使用者應參考此超類以獲取有關這些方法的更多資訊。
示例
>>> from transformers import M2M100ForConditionalGeneration, M2M100Tokenizer
>>> model = M2M100ForConditionalGeneration.from_pretrained("facebook/m2m100_418M")
>>> tokenizer = M2M100Tokenizer.from_pretrained("facebook/m2m100_418M", src_lang="en", tgt_lang="ro")
>>> src_text = " UN Chief Says There Is No Military Solution in Syria"
>>> tgt_text = "Şeful ONU declară că nu există o soluţie militară în Siria"
>>> model_inputs = tokenizer(src_text, text_target=tgt_text, return_tensors="pt")
>>> outputs = model(**model_inputs) # should work
build_inputs_with_special_tokens
< 原始碼 >( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None ) → list[int]
透過連線和新增特殊標記,從一個序列或一對序列為序列分類任務構建模型輸入。一個 MBART 序列具有以下格式,其中 `X` 代表序列
input_ids
(用於編碼器)X [eos, src_lang_code]
decoder_input_ids
:(用於解碼器)X [eos, tgt_lang_code]
從不使用 BOS。序列對不是預期的用例,但它們將在沒有分隔符的情況下處理。
get_special_tokens_mask
< 原始碼 >( token_ids_0: list token_ids_1: typing.Optional[list[int]] = 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: typing.Optional[list[int]] = None ) → list[int]
建立與傳入序列對應的標記型別 ID。什麼是標記型別 ID?
如果模型有特殊的構建方式,應在子類中重寫此方法。
M2M100Model
class transformers.M2M100Model
< 原始碼 >( config: M2M100Config )
引數
- config (M2M100Config) — 模型配置類,包含模型的所有引數。使用配置檔案進行初始化不會載入與模型相關的權重,只會載入配置。請檢視 from_pretrained() 方法來載入模型權重。
原始的 M2M 100 模型,輸出未經任何特定頭處理的原始隱藏狀態。
該模型繼承自 PreTrainedModel。請檢視超類的文件,瞭解庫為所有模型實現的通用方法(例如下載或儲存、調整輸入嵌入大小、修剪頭等)。
此模型也是 PyTorch torch.nn.Module 的子類。可以像常規 PyTorch 模組一樣使用它,並參考 PyTorch 文件瞭解所有與通用用法和行為相關的事項。
forward
< 原始碼 >( 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[tuple[tuple[torch.FloatTensor]]] = None past_key_values: typing.Optional[tuple[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 return_dict: typing.Optional[bool] = None cache_position: typing.Optional[torch.Tensor] = None ) → transformers.modeling_outputs.Seq2SeqModelOutput 或 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 表示標記被遮蔽。
- decoder_input_ids (
torch.LongTensor
,形狀為(batch_size, target_sequence_length)
, 可選) — 詞彙表中解碼器輸入序列標記的索引。可以使用 AutoTokenizer 獲取索引。有關詳細資訊,請參閱 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
M2M100 使用 `eos_token_id` 作為 `decoder_input_ids` 生成的起始標記。如果使用 `past_key_values`,則可以選擇只輸入最後一個 `decoder_input_ids`(參見 `past_key_values`)。
- decoder_attention_mask (
torch.LongTensor
,形狀為(batch_size, target_sequence_length)
, 可選) — 預設行為:生成一個忽略 `decoder_input_ids` 中填充標記的張量。預設情況下也會使用因果掩碼。 - head_mask (
torch.Tensor
,形狀為(num_heads,)
或(num_layers, num_heads)
, 可選) — 用於使自注意力模組中選定的頭無效的掩碼。掩碼值在 `[0, 1]` 中選擇:- 1 表示頭未被遮蔽,
- 0 表示頭被遮蔽。
- decoder_head_mask (
torch.Tensor
,形狀為(decoder_layers, decoder_attention_heads)
, 可選) — 用於使解碼器中注意力模組中選定的頭無效的掩碼。掩碼值在 `[0, 1]` 中選擇:- 1 表示頭未被遮蔽,
- 0 表示頭被遮蔽。
- cross_attn_head_mask (
torch.Tensor
,形狀為(decoder_layers, decoder_attention_heads)
, 可選) — 用於使解碼器中交叉注意力模組中選定的頭無效的掩碼。掩碼值在 `[0, 1]` 中選擇:- 1 表示頭未被遮蔽,
- 0 表示頭被遮蔽。
- encoder_outputs (
tuple[tuple[torch.FloatTensor]]
, 可選) — 元組,包含 (last_hidden_state
, 可選:hidden_states
, 可選:attentions
)。形狀為(batch_size, sequence_length, hidden_size)
的 `last_hidden_state` 是編碼器最後一層輸出的隱藏狀態序列。用於解碼器的交叉注意力中。 - past_key_values (
tuple[tuple[torch.FloatTensor]]
, 可選) — 預計算的隱藏狀態(自注意力和交叉注意力塊中的鍵和值),可用於加速序列解碼。這通常包括模型在解碼的先前階段返回的 `past_key_values`,當 `use_cache=True` 或 `config.use_cache=True` 時。允許兩種格式:
- 一個 Cache 例項,請參閱我們的 kv 快取指南;
- 一個 `tuple(torch.FloatTensor)` 的元組,長度為 `config.n_layers`,每個元組包含 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` 索引轉換為關聯向量,這將非常有用。 - 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`。 - return_dict (
bool
, 可選) — 是否返回 ModelOutput 而不是普通的元組。 - cache_position (
torch.Tensor
,形狀為(sequence_length)
, 可選) — 描繪輸入序列標記在序列中位置的索引。與 `position_ids` 不同,此張量不受填充影響。它用於在正確的位置更新快取並推斷完整的序列長度。
返回
transformers.modeling_outputs.Seq2SeqModelOutput 或 tuple(torch.FloatTensor)
一個 transformers.modeling_outputs.Seq2SeqModelOutput 或一個 `torch.FloatTensor` 的元組(如果傳遞了 `return_dict=False` 或 `config.return_dict=False`),根據配置 (M2M100Config) 和輸入包含各種元素。
-
last_hidden_state (
torch.FloatTensor
,形狀為(batch_size, sequence_length, hidden_size)
) — 模型解碼器最後一層輸出的隱藏狀態序列。如果使用了
past_key_values
,則只輸出形狀為(batch_size, 1, hidden_size)
的序列的最後一個隱藏狀態。 -
past_key_values (
EncoderDecoderCache
, 可選, 當傳遞 `use_cache=True` 或 `config.use_cache=True` 時返回) — 這是一個 EncoderDecoderCache 例項。更多詳情請參閱我們的 kv 快取指南。包含預先計算的隱藏狀態(自注意力塊和交叉注意力塊中的鍵和值),可用於(參見
past_key_values
輸入)加速順序解碼。 -
decoder_hidden_states (
tuple(torch.FloatTensor)
, 可選, 當傳遞 `output_hidden_states=True` 或 `config.output_hidden_states=True` 時返回) — `torch.FloatTensor` 的元組(如果模型有嵌入層,則一個用於嵌入層的輸出,+ 每個層的輸出一個),形狀為 `(batch_size, sequence_length, hidden_size)`。解碼器在每個層輸出的隱藏狀態,加上可選的初始嵌入輸出。
-
decoder_attentions (
tuple(torch.FloatTensor)
, 可選, 當傳遞 `output_attentions=True` 或 `config.output_attentions=True` 時返回) — `torch.FloatTensor` 的元組(每層一個),形狀為 `(batch_size, num_heads, sequence_length, sequence_length)`。解碼器的注意力權重,在注意力 softmax 之後,用於計算自注意力頭中的加權平均。
-
cross_attentions (
tuple(torch.FloatTensor)
, 可選, 當傳遞 `output_attentions=True` 或 `config.output_attentions=True` 時返回) — `torch.FloatTensor` 的元組(每層一個),形狀為 `(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` 的元組(如果模型有嵌入層,則一個用於嵌入層的輸出,+ 每個層的輸出一個),形狀為 `(batch_size, sequence_length, hidden_size)`。編碼器在每個層輸出的隱藏狀態,加上可選的初始嵌入輸出。
-
encoder_attentions (
tuple(torch.FloatTensor)
, 可選, 當傳遞 `output_attentions=True` 或 `config.output_attentions=True` 時返回) — `torch.FloatTensor` 的元組(每層一個),形狀為 `(batch_size, num_heads, sequence_length, sequence_length)`。編碼器的注意力權重,在注意力 softmax 之後,用於計算自注意力頭中的加權平均。
M2M100Model 的前向方法,覆蓋了 `__call__` 特殊方法。
儘管前向傳遞的配方需要在此函式內定義,但之後應呼叫 `Module` 例項而不是此函式,因為前者會處理執行前處理和後處理步驟,而後者會默默地忽略它們。
M2M100ForConditionalGeneration
class transformers.M2M100ForConditionalGeneration
< 來源 >( config: M2M100Config )
引數
- config (M2M100Config) — 包含模型所有引數的模型配置類。使用配置檔案進行初始化不會載入與模型相關的權重,只會載入配置。請檢視 from_pretrained() 方法來載入模型權重。
帶有語言建模頭的 M2M100 模型。可用於文字摘要。
該模型繼承自 PreTrainedModel。請檢視超類的文件,瞭解庫為所有模型實現的通用方法(例如下載或儲存、調整輸入嵌入大小、修剪頭等)。
此模型也是 PyTorch torch.nn.Module 的子類。可以像常規 PyTorch 模組一樣使用它,並參考 PyTorch 文件瞭解所有與通用用法和行為相關的事項。
forward
< 來源 >( 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[tuple[tuple[torch.FloatTensor]]] = None past_key_values: typing.Optional[tuple[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 return_dict: typing.Optional[bool] = None cache_position: typing.Optional[torch.Tensor] = None ) → transformers.modeling_outputs.Seq2SeqLMOutput 或 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 表示標記被掩碼。
- decoder_input_ids (
torch.LongTensor
,形狀為(batch_size, target_sequence_length)
,可選) — 詞彙表中解碼器輸入序列標記的索引。可以使用 AutoTokenizer 獲取索引。有關詳細資訊,請參閱 PreTrainedTokenizer.encode() 和 PreTrainedTokenizer.call()。
M2M100 使用
eos_token_id
作為生成decoder_input_ids
的起始標記。如果使用past_key_values
,則可以選擇只輸入最後一個decoder_input_ids
(請參閱past_key_values
)。 - decoder_attention_mask (
torch.LongTensor
,形狀為(batch_size, target_sequence_length)
,可選) — 預設行為:生成一個忽略decoder_input_ids
中填充標記的張量。預設情況下也會使用因果掩碼。 - head_mask (
torch.Tensor
,形狀為(num_heads,)
或(num_layers, num_heads)
,可選) — 用於使自注意力模組的選定頭無效的掩碼。掩碼值在[0, 1]
中選擇:- 1 表示頭未被掩碼,
- 0 表示頭被掩碼。
- decoder_head_mask (
torch.Tensor
,形狀為(decoder_layers, decoder_attention_heads)
,可選) — 用於使解碼器中注意力模組的選定頭無效的掩碼。掩碼值在[0, 1]
中選擇:- 1 表示頭未被掩碼,
- 0 表示頭被掩碼。
- cross_attn_head_mask (
torch.Tensor
,形狀為(decoder_layers, decoder_attention_heads)
,可選) — 用於使解碼器中交叉注意力模組的選定頭無效的掩碼。掩碼值在[0, 1]
中選擇:- 1 表示頭未被掩碼,
- 0 表示頭被掩碼。
- encoder_outputs (
tuple[tuple[torch.FloatTensor]]
,可選) — 元組,包含 (last_hidden_state
, 可選:hidden_states
, 可選:attentions
)。last_hidden_state
的形狀為(batch_size, sequence_length, hidden_size)
,是編碼器最後一層輸出的隱藏狀態序列。用於解碼器的交叉注意力。 - past_key_values (
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
(那些沒有為其提供過去鍵值狀態的 ID),形狀為(batch_size, 1)
,而不是所有形狀為(batch_size, sequence_length)
的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
的值。 - 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
。 - return_dict (
bool
,可選) — 是否返回 ModelOutput 而不是普通的元組。 - cache_position (
torch.Tensor
,形狀為(sequence_length)
,可選) — 描繪輸入序列標記在序列中位置的索引。與position_ids
相反,此張量不受填充影響。它用於在正確位置更新快取並推斷完整的序列長度。
返回
transformers.modeling_outputs.Seq2SeqLMOutput 或 tuple(torch.FloatTensor)
一個 transformers.modeling_outputs.Seq2SeqLMOutput 或一個 torch.FloatTensor
的元組(如果傳遞了 return_dict=False
或當 config.return_dict=False
時),根據配置(M2M100Config)和輸入包含各種元素。
-
loss (
torch.FloatTensor
,形狀為(1,)
,可選,當提供labels
時返回) — 語言建模損失。 -
logits (形狀為
(batch_size, sequence_length, config.vocab_size)
的torch.FloatTensor
) — 語言建模頭部的預測分數(SoftMax 之前的每個詞彙標記的分數)。 -
past_key_values (
EncoderDecoderCache
, 可選, 當傳遞 `use_cache=True` 或 `config.use_cache=True` 時返回) — 這是一個 EncoderDecoderCache 例項。更多詳情請參閱我們的 kv 快取指南。包含預先計算的隱藏狀態(自注意力塊和交叉注意力塊中的鍵和值),可用於(參見
past_key_values
輸入)加速順序解碼。 -
decoder_hidden_states (
tuple(torch.FloatTensor)
, 可選, 當傳遞 `output_hidden_states=True` 或 `config.output_hidden_states=True` 時返回) — `torch.FloatTensor` 的元組(如果模型有嵌入層,則一個用於嵌入層的輸出,+ 每個層的輸出一個),形狀為 `(batch_size, sequence_length, hidden_size)`。解碼器在每一層輸出時的隱藏狀態以及初始嵌入輸出。
-
decoder_attentions (
tuple(torch.FloatTensor)
, 可選, 當傳遞 `output_attentions=True` 或 `config.output_attentions=True` 時返回) — `torch.FloatTensor` 的元組(每層一個),形狀為 `(batch_size, num_heads, sequence_length, sequence_length)`。解碼器的注意力權重,在注意力 softmax 之後,用於計算自注意力頭中的加權平均。
-
cross_attentions (
tuple(torch.FloatTensor)
, 可選, 當傳遞 `output_attentions=True` 或 `config.output_attentions=True` 時返回) — `torch.FloatTensor` 的元組(每層一個),形狀為 `(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` 的元組(如果模型有嵌入層,則一個用於嵌入層的輸出,+ 每個層的輸出一個),形狀為 `(batch_size, sequence_length, hidden_size)`。編碼器在每一層輸出時的隱藏狀態以及初始嵌入輸出。
-
encoder_attentions (
tuple(torch.FloatTensor)
, 可選, 當傳遞 `output_attentions=True` 或 `config.output_attentions=True` 時返回) — `torch.FloatTensor` 的元組(每層一個),形狀為 `(batch_size, num_heads, sequence_length, sequence_length)`。編碼器的注意力權重,在注意力 softmax 之後,用於計算自注意力頭中的加權平均。
M2M100ForConditionalGeneration 的 forward 方法會覆蓋 __call__
特殊方法。
儘管前向傳遞的配方需要在此函式內定義,但之後應呼叫 `Module` 例項而不是此函式,因為前者會處理執行前處理和後處理步驟,而後者會默默地忽略它們。
翻譯示例
>>> from transformers import AutoTokenizer, M2M100ForConditionalGeneration
>>> model = M2M100ForConditionalGeneration.from_pretrained("facebook/m2m100_418M")
>>> tokenizer = AutoTokenizer.from_pretrained("facebook/m2m100_418M")
>>> 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("fr"))
>>> print(tokenizer.batch_decode(gen_tokens, skip_special_tokens=True))
使用 Flash Attention 2
Flash Attention 2 是一個更快、更最佳化的注意力分數計算版本,它依賴於 cuda
核心。
安裝
首先,檢查您的硬體是否與 Flash Attention 2 相容。最新的相容硬體列表可以在官方文件中找到。
接下來,安裝 最新版本的 Flash Attention 2
pip install -U flash-attn --no-build-isolation
用法
要使用 Flash Attention 2 載入模型,我們可以將引數 attn_implementation="flash_attention_2"
傳遞給 .from_pretrained
。您可以使用 torch.float16
或 torch.bfloat16
精度。
>>> import torch
>>> from transformers import M2M100ForConditionalGeneration, M2M100Tokenizer
>>> model = M2M100ForConditionalGeneration.from_pretrained("facebook/m2m100_418M", torch_dtype=torch.float16, attn_implementation="flash_attention_2").to("cuda").eval()
>>> tokenizer = M2M100Tokenizer.from_pretrained("facebook/m2m100_418M")
>>> # translate Hindi to French
>>> hi_text = "जीवन एक चॉकलेट बॉक्स की तरह है।"
>>> tokenizer.src_lang = "hi"
>>> encoded_hi = tokenizer(hi_text, return_tensors="pt").to("cuda")
>>> generated_tokens = model.generate(**encoded_hi, forced_bos_token_id=tokenizer.get_lang_id("fr"))
>>> tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)
"La vie est comme une boîte de chocolat."
預期加速
下面是一個預期加速圖,比較了原生實現和 Flash Attention 2 之間的純推理時間。

使用縮放點積注意力 (SDPA)
PyTorch 包含一個原生的縮放點積注意力 (SDPA) 運算子,作為 torch.nn.functional
的一部分。此函式包含多種實現,可以根據輸入和使用的硬體應用。請參閱官方文件或GPU 推理頁面瞭解更多資訊。
當實現可用時,SDPA 預設用於 `torch>=2.1.1`,但你也可以在 `from_pretrained()` 中設定 `attn_implementation="sdpa"` 來明確請求使用 SDPA。
from transformers import M2M100ForConditionalGeneration
model = M2M100ForConditionalGeneration.from_pretrained("facebook/m2m100_418M", torch_dtype=torch.float16, attn_implementation="sdpa")
...
為了獲得最佳加速效果,我們建議以半精度(例如 `torch.float16` 或 `torch.bfloat16`)載入模型。
< > 在 GitHub 上更新