# NLLB

    
        
        
    

## Обзор

[NLLB: No Language Left Behind](https://huggingface.co/papers/2207.04672) — это модель многоязычного перевода. Она обучена на данных с использованием методов добычи данных, адаптированных для языков с малым объёмом данных, и поддерживает более 200 языков. NLLB использует архитектуру условных вычислений на основе разреженно-шлюзованной смеси экспертов (Sparsely Gated Mixture of Experts).

Все исходные контрольные точки NLLB можно найти в организации [AI at Meta](https://huggingface.co/facebook/models?search=nllb).

> [!TIP]
> Эта модель была добавлена пользователем [Lysandre](https://huggingface.co/lysandre). Нажмите на модели NLLB в правой боковой панели, чтобы увидеть больше примеров применения NLLB к различным задачам перевода.

Приведённый ниже пример показывает, как переводить текст с помощью [Pipeline](/docs/transformers/main/ru/main_classes/pipelines#transformers.Pipeline) или класса [AutoModel](/docs/transformers/main/ru/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), чтобы лучше понять, к каким токенам модель может и не может обращать внимание.

```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 года: теперь исходная последовательность дополняется префиксом с указанием языка источника, а не языка цели. Это позволяет повысить качество работы в режиме zero-shot незначительной ценой для контролируемого обучения.

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

- Для языков, отличных от английского, укажите код языка [BCP-47](https://github.com/facebookresearch/flores/blob/main/flores200/README.md#languages-in-flores-200) с помощью ключевого слова `src_lang`, как показано ниже.

- См. пример ниже с переводом с румынского на немецкий.

    ```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 (на базе библиотеки *tokenizers* от HuggingFace). Основан на [Unigram](https://huggingface.co/docs/tokenizers/python/latest/components.html?highlight=unigram#models).

Этот токенизатор наследуется от [TokenizersBackend](/docs/transformers/main/ru/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)

Сбросьте специальные токены до настроек исходного языка.
- В режиме legacy: префикс отсутствует, а суффикс=[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)

Сбросьте специальные токены до настроек целевого языка.
- В режиме legacy: префикс отсутствует, а суффикс = [eos, tgt_lang_code].
- В режиме по умолчанию: префикс=[tgt_lang_code], суффикс = [eos]

