Transformers 文档
NLLB
并获得增强的文档体验
开始使用
NLLB
更新的分词器行为
免责声明: tokenizer 的默认行为已修复,因此在 2023 年 4 月发生了更改。之前的版本在目标和源 tokenization 的 token 序列末尾都添加了 [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 模型在 No Language Left Behind: Scaling Human-Centered Machine Translation 中提出,作者包括 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 的改进,为实现通用翻译系统奠定了重要的基础。
此实现包含发布时提供的密集模型。
稀疏模型 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
) 被设置为默认的翻译源语言。为了指定您想从其他语言进行翻译,您应该在 tokenizer 初始化中的 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
< source >( 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[typing.Dict[str, typing.Any]] = None additional_special_tokens = None legacy_behaviour = False **kwargs )
参数
- vocab_file (
str
) — 词汇表文件的路径。 - bos_token (
str
, 可选, 默认为"<s>"
) — 序列开始 token,在预训练期间使用。可以用作序列分类器 token。当使用特殊 token 构建序列时,这不是用于序列开始的 token。使用的 token 是
cls_token
。 - eos_token (
str
, 可选, 默认为"</s>"
) — 序列结束 token。当使用特殊 token 构建序列时,这不是用于序列结束的 token。使用的 token 是
sep_token
。 - sep_token (
str
, 可选, 默认为"</s>"
) — 分隔符 token,用于从多个序列构建序列时,例如用于序列分类的两个序列,或用于问答的文本和问题。它也用作使用特殊 token 构建的序列的最后一个 token。 - cls_token (
str
, 可选, 默认为"<s>"
) — 分类器 token,用于进行序列分类(对整个序列而不是每个 token 进行分类)。当使用特殊 token 构建时,它是序列的第一个 token。 - unk_token (
str
, 可选, 默认为"<unk>"
) — 未知 token。词汇表中不存在的 token 无法转换为 ID,而是设置为此 token。 - pad_token (
str
, 可选, 默认为"<pad>"
) — 用于填充的 token,例如在批量处理不同长度的序列时。 - mask_token (
str
, 可选, 默认为"<mask>"
) — 用于掩码值的 token。这是使用掩码语言建模训练此模型时使用的 token。这是模型将尝试预测的 token。 - tokenizer_file (
str
, 可选) — tokenizer 文件的路径,用于替代词汇表文件。 - src_lang (
str
, 可选) — 用作翻译源语言的语言。 - tgt_lang (
str
, 可选) — 用作翻译目标语言的语言。 - sp_model_kwargs (
Dict[str, str]
) — 传递给模型初始化的其他关键字参数。
构建 NLLB tokenizer。
改编自 RobertaTokenizer 和 XLNetTokenizer。基于 SentencePiece。
源语言文档的 tokenization 方法是 <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
< source >( token_ids_0: typing.List[int] token_ids_1: typing.Optional[typing.List[int]] = None ) → List[int]
通过连接和添加特殊 token,从序列或序列对构建用于序列分类任务的模型输入。 NLLB 序列具有以下格式,其中 X
表示序列
input_ids
(用于编码器)X [eos, src_lang_code]
decoder_input_ids
:(用于解码器)X [eos, tgt_lang_code]
从不使用 BOS。序列对不是预期的用例,但它们将在没有分隔符的情况下处理。
NllbTokenizerFast
class transformers.NllbTokenizerFast
< source >( 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
, optional, defaults to"<s>"
) — 序列开始标记,在预训练期间使用。可以用作序列分类器标记。当使用特殊标记构建序列时,这不是用于序列开始的标记。所使用的标记是
cls_token
。 - eos_token (
str
, optional, defaults to"</s>"
) — 序列结束标记。当使用特殊标记构建序列时,这不是用于序列结束的标记。所使用的标记是
sep_token
。 - sep_token (
str
, optional, defaults to"</s>"
) — 分隔符标记,用于从多个序列构建序列时,例如用于序列分类的两个序列,或用于问答的文本和问题。它也用作使用特殊标记构建的序列的最后一个标记。 - cls_token (
str
, optional, defaults to"<s>"
) — 分类器标记,用于进行序列分类(对整个序列而不是每个标记进行分类)。当使用特殊标记构建时,它是序列的第一个标记。 - unk_token (
str
, optional, defaults to"<unk>"
) — 未知标记。词汇表中不存在的标记无法转换为 ID,而是设置为此标记。 - pad_token (
str
, optional, defaults to"<pad>"
) — 用于填充的标记,例如在对不同长度的序列进行批处理时。 - mask_token (
str
, optional, defaults to"<mask>"
) — 用于掩码值的标记。这是使用掩码语言建模训练此模型时使用的标记。这是模型将尝试预测的标记。 - tokenizer_file (
str
, optional) — 用于代替词汇表文件的 tokenizer 文件的路径。 - src_lang (
str
, optional) — 用作翻译源语言的语言。 - tgt_lang (
str
, optional) — 用作翻译目标语言的语言。
构建一个 “快速” NLLB tokenizer(由 HuggingFace 的 tokenizers 库支持)。基于 BPE。
此 tokenizer 继承自 PreTrainedTokenizerFast,其中包含大多数主要方法。用户应参考此超类以获取有关这些方法的更多信息。
源语言文档的 tokenization 方法是 <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
< source >( token_ids_0: typing.List[int] token_ids_1: typing.Optional[typing.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
< source >( token_ids_0: typing.List[int] token_ids_1: typing.Optional[typing.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 加载模型,我们可以将参数 attn_implementation="flash_attention_2"
传递给 .from_pretrained
。您可以使用 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 包含一个原生的缩放点积注意力 (SDPA) 运算符,作为 torch.nn.functional
的一部分。此函数包含多个实现,可以根据输入和正在使用的硬件应用。有关更多信息,请参阅官方文档或 GPU 推理页面。
当实现可用时,对于 torch>=2.1.1
,SDPA 默认使用,但您也可以在 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
)加载模型。