Transformers 文档
NLLB
并获得增强的文档体验
开始使用
NLLB
更新的分词器行为
免责声明:分词器的默认行为已在 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)
概述
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 分词器。
改编自RobertaTokenizer和XLNetTokenizer。基于SentencePiece。
源语言文档的分词方法是 <tokens> <eos> <language code>
,目标语言文档的分词方法是 `<language code>
示例
>>> 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]
通过连接和添加特殊标记,从一个序列或一对序列构建模型输入,用于序列分类任务。一个 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>
示例
>>> 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]
通过连接和添加特殊标记来构建序列或序列对的模型输入,用于序列分类任务。特殊标记取决于调用 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]
从传入的两个序列创建掩码,用于序列对分类任务。nllb 不使用标记类型 ID,因此返回一个全为零的列表。
将特殊标记重置为源语言设置。
- 在旧版模式中:没有前缀,后缀为 [eos, src_lang_code]。
- 在默认模式中:前缀为 [src_lang_code],后缀为 [eos]。
将特殊标记重置为目标语言设置。
- 在旧版模式中:没有前缀,后缀为 [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.float16
或 torch.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 上更新