# NLLB

    
        
        
    

## 概述

[NLLB: No Language Left Behind](https://huggingface.co/papers/2207.04672) 是一个多语言翻译模型。它使用专为低资源语言定制的数据挖掘技术对数据进行了训练，并支持 200 多种语言。NLLB 采用稀疏门控混合专家（Sparsely Gated Mixture of Experts）技术，具备条件计算架构。

您可以在 [AI at Meta](https://huggingface.co/facebook/models?search=nllb) 组织下找到所有原始的 NLLB 检查点。

> [!TIP]
> 该模型由 [Lysandre](https://huggingface.co/lysandre) 贡献。点击右侧边栏中的 NLLB 模型，以获取更多将 NLLB 应用于不同翻译任务的示例。

以下示例演示了如何使用 [Pipeline](/docs/transformers/main/zh/main_classes/pipelines#transformers.Pipeline) 或 [AutoModel](/docs/transformers/main/zh/model_doc/auto#transformers.AutoModel) 类来翻译文本。

```python
from transformers import pipeline

pipeline = pipeline(task="translation", model="facebook/nllb-200-distilled-600M", src_lang="eng_Latn", tgt_lang="fra_Latn", device=0)
pipeline("UN Chief says there is no military solution in Syria")
```

```python
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("facebook/nllb-200-distilled-600M")
model = AutoModelForSeq2SeqLM.from_pretrained("facebook/nllb-200-distilled-600M", attn_implementation="sdpa", device_map="auto")

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

translated_tokens = model.generate(
    **inputs, forced_bos_token_id=tokenizer.convert_tokens_to_ids("fra_Latn"), max_length=30
)
print(tokenizer.batch_decode(translated_tokens, skip_special_tokens=True)[0])
```

量化通过以较低精度表示权重来降低大模型的内存负担。有关更多可用的量化后端，请参阅 [量化](../quantization/overview) 概述。

以下示例使用 [bitsandbytes](../quantization/bitsandbytes) 将权重量化为 8 位。

```python
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, BitsAndBytesConfig

bnb_config = BitsAndBytesConfig(load_in_8bit=True)
model = AutoModelForSeq2SeqLM.from_pretrained("facebook/nllb-200-distilled-1.3B", quantization_config=bnb_config, device_map="auto")
tokenizer = AutoTokenizer.from_pretrained("facebook/nllb-200-distilled-1.3B")

article = "UN Chief says there is no military solution in Syria"
inputs = tokenizer(article, return_tensors="pt").to(model.device)
translated_tokens = model.generate(
    **inputs, forced_bos_token_id=tokenizer.convert_tokens_to_ids("fra_Latn"), max_length=30,
)
print(tokenizer.batch_decode(translated_tokens, skip_special_tokens=True)[0])
```

使用 [AttentionMaskVisualizer](https://github.com/huggingface/transformers/blob/main/src/transformers/utils/attention_visualizer.py#L139) 可以更直观地了解模型能够和不能关注哪些 token。

```python
from transformers.utils.attention_visualizer import AttentionMaskVisualizer

visualizer = AttentionMaskVisualizer("facebook/nllb-200-distilled-600M")
visualizer("UN Chief says there is no military solution in Syria")
```

    

## 备注

- 分词器已于 2023 年 4 月更新，现在会在源序列前添加源语言标识，而非目标语言标识。这一更改优先提升了零样本性能，仅对监督性能造成轻微影响。

   ```python
   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]
   ```

   若要恢复为旧版行为，请使用以下代码示例。

   ```python
   from transformers import NllbTokenizer

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

- 对于非英语语言，请按照下方所示，使用 `src_lang` 关键字指定该语言的 [BCP-47](https://github.com/facebookresearch/flores/blob/main/flores200/README.md#languages-in-flores-200) 代码。

- 请参阅下方从罗马尼亚语翻译到德语的示例。

    ```python
    from transformers import AutoModelForSeq2SeqLM, AutoTokenizer

    tokenizer = AutoTokenizer.from_pretrained("facebook/nllb-200-distilled-600M")
    model = AutoModelForSeq2SeqLM.from_pretrained("facebook/nllb-200-distilled-600M", device_map="auto")

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

    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
    ```

## NllbTokenizer[[transformers.NllbTokenizer]]

#### transformers.NllbTokenizer[[transformers.NllbTokenizer]]

```python
transformers.NllbTokenizer(vocab: str | dict[str, int] | None = None, merges: str | list[str] | None = 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, _spm_precompiled_charsmap: str | None = None, additional_special_tokens = None, extra_special_tokens = None, legacy_behaviour = False, **kwargs)
```

[来源](https://github.com/huggingface/transformers/blob/main/src/transformers/models/nllb/tokenization_nllb.py#L33)

**参数：**

vocab_file (`str`, *可选*) : 词汇表文件的路径。

bos_token (`str`，*可选*，默认为 `"<s>"`)：预训练期间使用的序列起始标记。

eos_token (`str`，*可选*，默认为 `"</s>"`)：序列结束标记。

sep_token (`str`，*可选*，默认为 `"</s>"`)：分隔符标记。

cls_token (`str`，*可选*，默认为 `"<s>"`)：分类器标记。

unk_token (`str`，*可选*，默认为 `"<unk>"`)：未知标记。

pad_token (`str`，*可选*，默认为 `"<pad>"`)：用于填充的标记。

mask_token (`str`，*可选*，默认为 `"<mask>"`)：用于掩码值的标记。

src_lang (`str`, *可选*) : 用作翻译源语言的语言。

tgt_lang (`str`, *可选*) : 用作翻译目标语言的语言。

legacy_behaviour (`bool`，*可选*，默认为 `False`)：是否使用旧版行为（后缀模式）或新版行为（前缀模式）。

构建 NLLB 分词器（基于 HuggingFace 的 *tokenizers* 库）。基于 [Unigram](https://huggingface.co/docs/tokenizers/python/latest/components.html?highlight=unigram#models)。

该分词器继承自 [TokenizersBackend](/docs/transformers/main/zh/main_classes/tokenizer#transformers.TokenizersBackend)，其中包含了大部分主要方法。用户应参考该父类以获取有关这些方法的更多信息。

源语言文档的分词方法是 `<tokens> <eos> <language code>`，目标语言文档的分词方法是 ` `。

示例：

```python
>>> 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")
```

#### set_src_lang_special_tokens[[transformers.NllbTokenizer.set_src_lang_special_tokens]]

```python
set_src_lang_special_tokens(src_lang)
```

[来源](https://github.com/huggingface/transformers/blob/main/src/transformers/models/nllb/tokenization_nllb.py#L267)

将特殊标记重置为源语言设置。
- 在旧版模式下：无前缀，后缀为 [eos, src_lang_code]。
- 在默认模式下：前缀=[src_lang_code]，后缀=[eos]

#### set_tgt_lang_special_tokens[[transformers.NllbTokenizer.set_tgt_lang_special_tokens]]

```python
set_tgt_lang_special_tokens(lang: str)
```

[来源](https://github.com/huggingface/transformers/blob/main/src/transformers/models/nllb/tokenization_nllb.py#L292)

将特殊标记重置为目标语言设置。
- 在旧版模式下：没有前缀，且后缀为 [eos, tgt_lang_code]。
- 在默认模式下：前缀=[tgt_lang_code]，后缀=[eos]

