Transformers documentation

Перевод

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.2).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Перевод

Перевод преобразует последовательность текста с одного языка на другой. Это одна из нескольких задач, которые можно сформулировать как задачу последовательность-в-последовательность — мощный подход для получения некоторого вывода на основе входных данных, например, для перевода или суммаризации. Системы перевода обычно используются для перевода текстов между различными языками, но их также можно применять для работы с речью или для комбинаций, таких как синтез речи из текста или распознавание речи.

В этом руководстве показано, как:

  1. Настройте T5 на англо-французском подмножестве набора данных OPUS Books для перевода текста с английского на французский.
  2. Используйте вашу дообученную модель для инференса.

Чтобы увидеть все архитектуры и контрольные точки, совместимые с этой задачей, рекомендуем обратиться к странице задачи.

Прежде чем начать, убедитесь, что у вас установлены все необходимые библиотеки:

pip install transformers datasets evaluate sacrebleu

Мы рекомендуем вам войти в свой аккаунт Hugging Face, чтобы вы могли загрузить свою модель и поделиться ею с сообществом. При появлении запроса введите токен для входа:

>>> from huggingface_hub import notebook_login

>>> notebook_login()

Загрузить набор данных OPUS Books

Начните с загрузки англо-французского подмножества набора данных OPUS Books из библиотеки 🤗 Datasets:

>>> from datasets import load_dataset

>>> books = load_dataset("Helsinki-NLP/opus_books", "en-fr")

Разделите набор данных на обучающую и тестовую выборки с помощью метода train_test_split:

>>> books = books["train"].train_test_split(test_size=0.2)

Теперь рассмотрим пример:

>>> books["train"][0]
{'id': '90560',
 'translation': {'en': 'But this lofty plateau measured only a few fathoms, and soon we reentered Our Element.',
  'fr': 'Mais ce plateau élevé ne mesurait que quelques toises, et bientôt nous fûmes rentrés dans notre élément.'}}

translation: перевод текста с английского на французский.

Предобработка

Следующий шаг — загрузить токенизатор T5 для обработки пар языков «английский — французский»:

>>> from transformers import AutoTokenizer

>>> checkpoint = "google-t5/t5-small"
>>> tokenizer = AutoTokenizer.from_pretrained(checkpoint)

Функция предобработки, которую вы хотите создать, должна:

  1. Добавьте в начало входных данных подсказку, чтобы T5 понимал, что перед ним задача перевода. Некоторые модели, способные выполнять несколько NLP-задач, требуют специальных подсказок для конкретных задач.
  2. Укажите целевой язык (французский) в параметре text_target, чтобы токенизатор корректно обрабатывал целевой текст. Если не задать text_target, токенизатор будет обрабатывать целевой текст как английский.
  3. Обрезайте последовательности так, чтобы их длина не превышала максимальную длину, заданную параметром max_length.
>>> source_lang = "en"
>>> target_lang = "fr"
>>> prefix = "translate English to French: "


>>> def preprocess_function(examples):
...     inputs = [prefix + example[source_lang] for example in examples["translation"]]
...     targets = [example[target_lang] for example in examples["translation"]]
...     model_inputs = tokenizer(inputs, text_target=targets, max_length=128, truncation=True)
...     return model_inputs

Чтобы применить функцию предобработки ко всему набору данных, используйте метод map библиотеки 🤗 Datasets. Вы можете ускорить работу функции map, установив batched=True, чтобы обрабатывать несколько элементов набора данных одновременно:

>>> tokenized_books = books.map(preprocess_function, batched=True)

Теперь создайте пакет примеров с помощью DataCollatorForSeq2Seq. При сборке пакета эффективнее динамически дополнять предложения до максимальной длины в пакете, чем дополнять весь датасет до максимальной длины.

>>> from transformers import DataCollatorForSeq2Seq

>>> data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=checkpoint)

Оценка

Добавление метрики в процесс обучения часто помогает оценить качество модели. Вы можете быстро загрузить метод оценки с помощью библиотеки 🤗 Evaluate. Для этой задачи загрузите метрику SacreBLEU (ознакомьтесь с кратким обзором 🤗 Evaluate, чтобы узнать больше о загрузке и вычислении метрик):

>>> import evaluate

>>> metric = evaluate.load("sacrebleu")

Затем создайте функцию, которая передаёт ваши предсказания и метки в compute для вычисления оценки SacreBLEU:

>>> import numpy as np


>>> def postprocess_text(preds, labels):
...     preds = [pred.strip() for pred in preds]
...     labels = [[label.strip()] for label in labels]

...     return preds, labels


>>> def compute_metrics(eval_preds):
...     preds, labels = eval_preds
...     if isinstance(preds, tuple):
...         preds = preds[0]
...     decoded_preds = tokenizer.batch_decode(preds, skip_special_tokens=True)

...     labels = np.where(labels != -100, labels, tokenizer.pad_token_id)
...     decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True)

...     decoded_preds, decoded_labels = postprocess_text(decoded_preds, decoded_labels)

...     result = metric.compute(predictions=decoded_preds, references=decoded_labels)
...     result = {"bleu": result["score"]}

...     prediction_lens = [np.count_nonzero(pred != tokenizer.pad_token_id) for pred in preds]
...     result["gen_len"] = np.mean(prediction_lens)
...     result = {k: round(v, 4) for k, v in result.items()}
...     return result

Ваша функция compute_metrics готова, и вы вернётесь к ней при настройке обучения.

Обучение

Если вы не знакомы с дообучением модели с помощью Trainer, загляните в базовое руководство здесь!

Теперь вы готовы приступить к обучению модели! Загрузите T5 с помощью AutoModelForSeq2SeqLM:

>>> from transformers import AutoModelForSeq2SeqLM, Seq2SeqTrainingArguments, Seq2SeqTrainer

>>> model = AutoModelForSeq2SeqLM.from_pretrained(checkpoint)

На этом этапе осталось выполнить только три шага:

  1. Определите гиперпараметры обучения в Seq2SeqTrainingArguments. Единственный обязательный параметр — output_dir, который указывает, куда сохранять модель. Вы загрузите эту модель на Hub, установив push_to_hub=True (для загрузки модели необходимо войти в аккаунт Hugging Face). В конце каждой эпохи Trainer вычислит метрику SacreBLEU и сохранит контрольную точку обучения.
  2. Передайте аргументы обучения в Seq2SeqTrainer вместе с моделью, набором данных, токенизатором, data collator и функцией compute_metrics.
  3. Вызовите train(), чтобы дообучить модель.
>>> training_args = Seq2SeqTrainingArguments(
...     output_dir="my_awesome_opus_books_model",
...     eval_strategy="epoch",
...     learning_rate=2e-5,
...     per_device_train_batch_size=16,
...     per_device_eval_batch_size=16,
...     weight_decay=0.01,
...     save_total_limit=3,
...     num_train_epochs=2,
...     predict_with_generate=True,
...     fp16=True, #change to bf16=True for XPU
...     push_to_hub=True,
... )

>>> trainer = Seq2SeqTrainer(
...     model=model,
...     args=training_args,
...     train_dataset=tokenized_books["train"],
...     eval_dataset=tokenized_books["test"],
...     processing_class=tokenizer,
...     data_collator=data_collator,
...     compute_metrics=compute_metrics,
... )

>>> trainer.train()

После завершения обучения используйте метод push_to_hub(), чтобы опубликовать модель на Hub и дать всем возможность её использовать:

>>> trainer.push_to_hub()

Более подробный пример дообучения модели для перевода можно найти в соответствующем ноутбуке PyTorch.

Вывод

Отлично, теперь, когда вы дообучили модель, вы можете использовать её для инференса!

Придумайте какой-нибудь текст, который вы хотели бы перевести на другой язык. Для T5 необходимо добавлять префикс к входным данным в зависимости от выполняемой задачи. Для перевода с английского на французский префикс должен быть таким, как показано ниже:

>>> text = "translate English to French: Legumes share resources with nitrogen-fixing bacteria."

Токенизируйте текст и верните input_ids в виде тензоров PyTorch:

>>> from transformers import AutoTokenizer

>>> tokenizer = AutoTokenizer.from_pretrained("username/my_awesome_opus_books_model")
>>> inputs = tokenizer(text, return_tensors="pt").input_ids

Используйте метод generate() для создания перевода. Дополнительные сведения о различных стратегиях генерации текста и параметрах управления процессом генерации вы найдёте в API Text Generation.

>>> from transformers import AutoModelForSeq2SeqLM

>>> model = AutoModelForSeq2SeqLM.from_pretrained("username/my_awesome_opus_books_model")
>>> outputs = model.generate(inputs, max_new_tokens=40, do_sample=True, top_k=30, top_p=0.95)

Декодировать сгенерированные идентификаторы токенов обратно в текст:

>>> tokenizer.decode(outputs[0], skip_special_tokens=True)
'Les lignées partagent des ressources avec des bactéries enfixant l'azote.'
Update on GitHub