Transformers 文件

NLLB

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

NLLB

PyTorch FlashAttention SDPA

更新的分詞器行為

免責宣告:分詞器的預設行為已在 2023 年 4 月修復並因此發生改變。之前的版本在目標和源分詞序列的末尾都添加了 `[self.eos_token_id, self.cur_lang_code]`。這是錯誤的,因為 NLLB 論文(第 48 頁,6.1.1. 模型架構)中提到:

請注意,我們將源語言新增到源序列的字首,這與之前一些工作中將目標語言新增到字首的做法相反(Arivazhagan et al., 2019; Johnson et al., 2017)。這主要是因為我們優先最佳化模型在任意 200 種語言對上的零樣本效能,而對監督效能的影響很小。

之前的行為

>>> from transformers import NllbTokenizer

>>> tokenizer = NllbTokenizer.from_pretrained("facebook/nllb-200-distilled-600M")
>>> tokenizer("How was your day?").input_ids
[13374, 1398, 4260, 4039, 248130, 2, 256047]

>>> # 2: '</s>'
>>> # 256047 : 'eng_Latn'

新的行為

>>> from transformers import NllbTokenizer

>>> tokenizer = NllbTokenizer.from_pretrained("facebook/nllb-200-distilled-600M")
>>> tokenizer("How was your day?").input_ids
[256047, 13374, 1398, 4260, 4039, 248130, 2]

可以按如下方式啟用舊行為

>>> from transformers import NllbTokenizer

>>> tokenizer = NllbTokenizer.from_pretrained("facebook/nllb-200-distilled-600M", legacy_behaviour=True)

更多細節,請隨時檢視相關的PRIssue

概述

NLLB 模型在 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, and Jeff Wang 的論文 No Language Left Behind: Scaling Human-Centered Machine Translation 中提出。

論文摘要如下:

在消除全球語言障礙的目標驅動下,機器翻譯已成為當今人工智慧研究的核心焦點。然而,這些努力主要集中在少數幾種語言上,而絕大多數低資源語言被忽略了。要打破 200 種語言的障礙,同時確保安全、高質量的結果,併兼顧倫理考量,需要做些什麼?在《No Language Left Behind》中,我們透過與母語者進行探索性訪談,首先明確了對低資源語言翻譯支援的需求,從而應對了這一挑戰。然後,我們建立了旨在縮小低資源語言和高資源語言之間效能差距的資料集和模型。具體來說,我們開發了一個基於稀疏門控混合專家(Sparsely Gated Mixture of Experts)的條件計算模型,該模型使用專門為低資源語言設計的新穎有效的資料探勘技術獲得的資料進行訓練。我們提出了多種架構和訓練改進,以在數千個任務上進行訓練時對抗過擬合。至關重要的是,我們使用人工翻譯的基準 Flores-200 評估了超過 40,000 個不同翻譯方向的效能,並將人工評估與覆蓋 Flores-200 中所有語言的新型毒性基準相結合,以評估翻譯的安全性。我們的模型相對於之前的最先進技術實現了 44% 的 BLEU 提升,為實現通用翻譯系統奠定了重要基礎。

此實現包含了釋出時可用的密集模型。

稀疏模型 NLLB-MoE(專家混合)現已可用!更多細節請見此處

此模型由 Lysandre 貢獻。作者的程式碼可以在這裡找到。

使用 NLLB 生成文字

在生成目標文字時,將 `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-200-distilled-600M")
>>> model = AutoModelForSeq2SeqLM.from_pretrained("facebook/nllb-200-distilled-600M")

>>> article = "UN Chief says there is no military solution in Syria"
>>> inputs = tokenizer(article, return_tensors="pt")

>>> translated_tokens = model.generate(
...     **inputs, forced_bos_token_id=tokenizer.convert_tokens_to_ids("fra_Latn"), max_length=30
... )
>>> tokenizer.batch_decode(translated_tokens, skip_special_tokens=True)[0]
Le chef de l'ONU dit qu'il n'y a pas de solution militaire en Syrie

從英語以外的其他語言生成

英語 (`eng_Latn`) 被設定為預設的源語言。為了指定您希望從其他語言翻譯,您應該在分詞器初始化的 `src_lang` 關鍵字引數中指定 BCP-47 程式碼。

以下是將羅馬尼亞語翻譯成德語的示例

>>> from transformers import AutoModelForSeq2SeqLM, AutoTokenizer

>>> tokenizer = AutoTokenizer.from_pretrained(
...     "facebook/nllb-200-distilled-600M", token=True, src_lang="ron_Latn"
... )
>>> model = AutoModelForSeq2SeqLM.from_pretrained("facebook/nllb-200-distilled-600M", token=True)

>>> 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.convert_tokens_to_ids("deu_Latn"), max_length=30
... )
>>> tokenizer.batch_decode(translated_tokens, skip_special_tokens=True)[0]
UN-Chef sagt, es gibt keine militärische Lösung in Syrien

資源

NllbTokenizer

class transformers.NllbTokenizer

< >

( vocab_file bos_token = '<s>' eos_token = '</s>' sep_token = '</s>' cls_token = '<s>' unk_token = '<unk>' pad_token = '<pad>' mask_token = '<mask>' tokenizer_file = None src_lang = None tgt_lang = None sp_model_kwargs: typing.Optional[dict[str, typing.Any]] = None additional_special_tokens = None legacy_behaviour = False **kwargs )

引數

  • vocab_file (str) — 詞彙表文件的路徑。
  • bos_token (str可選,預設為 "<s>") — 在預訓練期間使用的序列開始標記。可以用作序列分類器標記。

    在使用特殊標記構建序列時,這不是用於序列開始的標記。使用的標記是 `cls_token`。

  • eos_token (str可選,預設為 "</s>") — 序列結束標記。

    在使用特殊標記構建序列時,這不是用於序列結束的標記。使用的標記是 `sep_token`。

  • sep_token (str可選,預設為 "</s>") — 分隔符標記,用於從多個序列構建一個序列,例如用於序列分類的兩個序列,或用於問答的文字和問題。它也用作使用特殊標記構建的序列的最後一個標記。
  • cls_token (str可選,預設為 "<s>") — 分類器標記,用於進行序列分類(對整個序列進行分類,而不是逐個標記分類)。當使用特殊標記構建序列時,它是序列的第一個標記。
  • unk_token (str可選,預設為 "<unk>") — 未知標記。不在詞彙表中的標記無法轉換為 ID,將被設定為此標記。
  • pad_token (str可選,預設為 "<pad>") — 用於填充的標記,例如在批處理不同長度的序列時使用。
  • mask_token (str可選,預設為 "<mask>") — 用於掩碼值的標記。這是在使用掩碼語言建模訓練此模型時使用的標記。模型將嘗試預測此標記。
  • tokenizer_file (str可選) — 要使用的分詞器檔案的路徑,而不是詞彙表文件。
  • src_lang (str可選) — 用於翻譯的源語言。
  • tgt_lang (str可選) — 用於翻譯的目標語言。
  • sp_model_kwargs (dict[str, str]) — 傳遞給模型初始化的其他關鍵字引數。

構建一個 NLLB 分詞器。

改編自RobertaTokenizerXLNetTokenizer。基於SentencePiece

源語言文件的分詞方法是 <tokens> <eos> <language code>,目標語言文件的分詞方法是 `<language code>

<tokens> <eos>`。

示例

>>> from transformers import NllbTokenizer

>>> tokenizer = NllbTokenizer.from_pretrained(
...     "facebook/nllb-200-distilled-600M", src_lang="eng_Latn", tgt_lang="fra_Latn"
... )
>>> example_english_phrase = " UN Chief Says There Is No Military Solution in Syria"
>>> expected_translation_french = "Le chef de l'ONU affirme qu'il n'y a pas de solution militaire en Syrie."
>>> inputs = tokenizer(example_english_phrase, text_target=expected_translation_french, return_tensors="pt")

build_inputs_with_special_tokens

< >

( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None ) list[int]

引數

  • token_ids_0 (list[int]) — 將新增特殊標記的 ID 列表。
  • token_ids_1 (list[int]可選) — 用於序列對的可選第二組 ID 列表。

返回

list[int]

帶有適當特殊標記的輸入ID列表。

透過連線和新增特殊標記,從一個序列或一對序列構建模型輸入,用於序列分類任務。一個 NLLB 序列具有以下格式,其中 `X` 表示序列

  • input_ids(用於編碼器)X [eos, src_lang_code]
  • decoder_input_ids:(用於解碼器)X [eos, tgt_lang_code]

從不使用 BOS。序列對不是預期的用例,但它們將在沒有分隔符的情況下處理。

NllbTokenizerFast

class transformers.NllbTokenizerFast

< >

( vocab_file = None tokenizer_file = None bos_token = '<s>' eos_token = '</s>' sep_token = '</s>' cls_token = '<s>' unk_token = '<unk>' pad_token = '<pad>' mask_token = '<mask>' src_lang = None tgt_lang = None additional_special_tokens = None legacy_behaviour = False **kwargs )

引數

  • vocab_file (str) — 詞彙表文件的路徑。
  • bos_token (str可選,預設為 "<s>") — 在預訓練期間使用的序列開始標記。可以用作序列分類器標記。

    在使用特殊標記構建序列時,這不是用於序列開始的標記。使用的標記是 `cls_token`。

  • eos_token (str, 可選, 預設為 "</s>") — 序列結束標記。

    當使用特殊標記構建序列時,這不是用於序列結束的標記。實際使用的標記是 sep_token

  • sep_token (str, 可選, 預設為 "</s>") — 分隔符標記,用於從多個序列構建一個序列,例如,用於序列分類的兩個序列,或用於問答任務的文字和問題。它也被用作由特殊標記構建的序列的最後一個標記。
  • cls_token (str, 可選, 預設為 "<s>") — 分類符標記,在進行序列分類(對整個序列而非每個標記進行分類)時使用。當使用特殊標記構建序列時,它是序列的第一個標記。
  • unk_token (str, 可選, 預設為 "<unk>") — 未知標記。不在詞彙表中的標記無法轉換為 ID,將被設定為此標記。
  • pad_token (str, 可選, 預設為 "<pad>") — 用於填充的標記,例如在批處理不同長度的序列時使用。
  • mask_token (str, 可選, 預設為 "<mask>") — 用於掩蓋值的標記。這是在使用掩碼語言建模訓練此模型時使用的標記。這也是模型將嘗試預測的標記。
  • tokenizer_file (str, 可選) — 要使用的分詞器檔案的路徑,用於替代詞彙表文件。
  • src_lang (str, 可選) — 用作翻譯源語言的語言。
  • tgt_lang (str, 可選) — 用作翻譯目標語言的語言。

構建一個“快速”的 NLLB 分詞器(由 HuggingFace 的 tokenizers 庫支援)。基於 BPE

此分詞器繼承自 PreTrainedTokenizerFast,其中包含了大部分主要方法。使用者應參考此超類以獲取有關這些方法的更多資訊。

源語言文件的分詞方法是 <tokens> <eos> <language code>,目標語言文件的分詞方法是 `<language code>

<tokens> <eos>`。

示例

>>> from transformers import NllbTokenizerFast

>>> tokenizer = NllbTokenizerFast.from_pretrained(
...     "facebook/nllb-200-distilled-600M", src_lang="eng_Latn", tgt_lang="fra_Latn"
... )
>>> example_english_phrase = " UN Chief Says There Is No Military Solution in Syria"
>>> expected_translation_french = "Le chef de l'ONU affirme qu'il n'y a pas de solution militaire en Syrie."
>>> inputs = tokenizer(example_english_phrase, text_target=expected_translation_french, return_tensors="pt")

build_inputs_with_special_tokens

< >

( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None ) list[int]

引數

  • token_ids_0 (list[int]) — 將要新增特殊標記的 ID 列表。
  • token_ids_1 (list[int], 可選) — 用於序列對的可選的第二個 ID 列表。

返回

list[int]

包含適當特殊標記的 輸入 ID 列表。

透過連線和新增特殊標記來構建序列或序列對的模型輸入,用於序列分類任務。特殊標記取決於呼叫 set_lang。

一個 NLLB 序列具有以下格式,其中 X 代表序列

  • input_ids(用於編碼器)X [eos, src_lang_code]
  • decoder_input_ids:(用於解碼器)X [eos, tgt_lang_code]

從不使用 BOS。序列對不是預期的用例,但它們將在沒有分隔符的情況下處理。

create_token_type_ids_from_sequences

< >

( token_ids_0: list token_ids_1: typing.Optional[list[int]] = None ) list[int]

引數

  • token_ids_0 (list[int]) — ID 列表。
  • token_ids_1 (list[int], 可選) — 用於序列對的可選的第二個 ID 列表。

返回

list[int]

零列表。

從傳入的兩個序列建立掩碼,用於序列對分類任務。nllb 不使用標記型別 ID,因此返回一個全為零的列表。

set_src_lang_special_tokens

< >

( src_lang )

將特殊標記重置為源語言設定。

  • 在舊版模式中:沒有字首,字尾為 [eos, src_lang_code]。
  • 在預設模式中:字首為 [src_lang_code],字尾為 [eos]。

set_tgt_lang_special_tokens

< >

( lang: str )

將特殊標記重置為目標語言設定。

  • 在舊版模式中:沒有字首,字尾為 [eos, tgt_lang_code]。
  • 在預設模式中:字首為 [tgt_lang_code],字尾為 [eos]。

使用 Flash Attention 2

Flash Attention 2 是一個更快、更最佳化的注意力分數計算版本,它依賴於 cuda 核心。

安裝

首先,檢查您的硬體是否與 Flash Attention 2 相容。最新的相容硬體列表可以在官方文件中找到。

接下來,安裝 最新版本的 Flash Attention 2

pip install -U flash-attn --no-build-isolation

用法

要使用 Flash Attention 2 載入模型,我們可以在 .from_pretrained 中傳遞引數 attn_implementation="flash_attention_2"。您可以使用 torch.float16torch.bfloat16 精度。

>>> import torch
>>> from transformers import AutoModelForSeq2SeqLM, AutoTokenizer

>>> model = AutoModelForSeq2SeqLM.from_pretrained("facebook/nllb-200-distilled-600M", torch_dtype=torch.float16, attn_implementation="flash_attention_2").to("cuda").eval()
>>> tokenizer = AutoTokenizer.from_pretrained("facebook/nllb-200-distilled-600M")

>>> article = "Şeful ONU spune că nu există o soluţie militară în Siria"
>>> inputs = tokenizer(article, return_tensors="pt").to("cuda")

>>> translated_tokens = model.generate(
...     **inputs, forced_bos_token_id=tokenizer.convert_tokens_to_ids("deu_Latn"), max_length=30
... )
>>> tokenizer.batch_decode(translated_tokens, skip_special_tokens=True)[0]
"UN-Chef sagt, es gibt keine militärische Lösung in Syrien"

預期加速

以下是一個預期加速圖,比較了原生實現和 Flash Attention 2 之間的純推理時間。

使用縮放點積注意力 (SDPA)

PyTorch 在 torch.nn.functional 中包含了原生的縮放點積注意力(SDPA)運算元。此函式包含多種實現,可根據輸入和所用硬體進行應用。更多資訊請參閱官方文件GPU 推理頁面。

當實現可用時,SDPA 預設用於 `torch>=2.1.1`,但你也可以在 `from_pretrained()` 中設定 `attn_implementation="sdpa"` 來明確請求使用 SDPA。

from transformers import AutoModelForSeq2SeqLM
model = AutoModelForSeq2SeqLM.from_pretrained("facebook/nllb-200-distilled-600M", torch_dtype=torch.float16, attn_implementation="sdpa")
...

為了獲得最佳加速效果,我們建議以半精度(例如 `torch.float16` 或 `torch.bfloat16`)載入模型。

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.