212 lines
8.0 KiB
Markdown
212 lines
8.0 KiB
Markdown
<!---
|
|
Copyright 2020 The HuggingFace Team. All rights reserved.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
-->
|
|
|
|
## Translation
|
|
|
|
This directory contains examples for finetuning and evaluating transformers on translation tasks.
|
|
Please tag @patil-suraj with any issues/unexpected behaviors, or send a PR!
|
|
For deprecated `bertabs` instructions, see [`bertabs/README.md`](https://github.com/huggingface/transformers/blob/main/examples/research_projects/bertabs/README.md).
|
|
For the old `finetune_trainer.py` and related utils, see [`examples/legacy/seq2seq`](https://github.com/huggingface/transformers/blob/main/examples/legacy/seq2seq).
|
|
|
|
### Supported Architectures
|
|
|
|
- `BartForConditionalGeneration`
|
|
- `FSMTForConditionalGeneration` (translation only)
|
|
- `MBartForConditionalGeneration`
|
|
- `MarianMTModel`
|
|
- `PegasusForConditionalGeneration`
|
|
- `T5ForConditionalGeneration`
|
|
- `MT5ForConditionalGeneration`
|
|
|
|
`run_translation.py` is a lightweight examples of how to download and preprocess a dataset from the [🤗 Datasets](https://github.com/huggingface/datasets) library or use your own files (jsonlines or csv), then fine-tune one of the architectures above on it.
|
|
|
|
For custom datasets in `jsonlines` format please see: https://huggingface.co/docs/datasets/loading_datasets#json-files
|
|
and you also will find examples of these below.
|
|
|
|
|
|
## With Trainer
|
|
|
|
Here is an example of a translation fine-tuning with a MarianMT model:
|
|
|
|
```bash
|
|
python examples/pytorch/translation/run_translation.py \
|
|
--model_name_or_path Helsinki-NLP/opus-mt-en-ro \
|
|
--do_train \
|
|
--do_eval \
|
|
--source_lang en \
|
|
--target_lang ro \
|
|
--dataset_name wmt16 \
|
|
--dataset_config_name ro-en \
|
|
--output_dir /tmp/tst-translation \
|
|
--per_device_train_batch_size=4 \
|
|
--per_device_eval_batch_size=4 \
|
|
--overwrite_output_dir \
|
|
--predict_with_generate
|
|
```
|
|
|
|
MBart and some T5 models require special handling.
|
|
|
|
T5 models `google-t5/t5-small`, `google-t5/t5-base`, `google-t5/t5-large`, `google-t5/t5-3b` and `google-t5/t5-11b` must use an additional argument: `--source_prefix "translate {source_lang} to {target_lang}"`. For example:
|
|
|
|
```bash
|
|
python examples/pytorch/translation/run_translation.py \
|
|
--model_name_or_path google-t5/t5-small \
|
|
--do_train \
|
|
--do_eval \
|
|
--source_lang en \
|
|
--target_lang ro \
|
|
--source_prefix "translate English to Romanian: " \
|
|
--dataset_name wmt16 \
|
|
--dataset_config_name ro-en \
|
|
--output_dir /tmp/tst-translation \
|
|
--per_device_train_batch_size=4 \
|
|
--per_device_eval_batch_size=4 \
|
|
--overwrite_output_dir \
|
|
--predict_with_generate
|
|
```
|
|
|
|
If you get a terrible BLEU score, make sure that you didn't forget to use the `--source_prefix` argument.
|
|
|
|
For the aforementioned group of T5 models it's important to remember that if you switch to a different language pair, make sure to adjust the source and target values in all 3 language-specific command line argument: `--source_lang`, `--target_lang` and `--source_prefix`.
|
|
|
|
MBart models require a different format for `--source_lang` and `--target_lang` values, e.g. instead of `en` it expects `en_XX`, for `ro` it expects `ro_RO`. The full MBart specification for language codes can be found [here](https://huggingface.co/facebook/mbart-large-cc25). For example:
|
|
|
|
```bash
|
|
python examples/pytorch/translation/run_translation.py \
|
|
--model_name_or_path facebook/mbart-large-en-ro \
|
|
--do_train \
|
|
--do_eval \
|
|
--dataset_name wmt16 \
|
|
--dataset_config_name ro-en \
|
|
--source_lang en_XX \
|
|
--target_lang ro_RO \
|
|
--output_dir /tmp/tst-translation \
|
|
--per_device_train_batch_size=4 \
|
|
--per_device_eval_batch_size=4 \
|
|
--overwrite_output_dir \
|
|
--predict_with_generate
|
|
```
|
|
|
|
And here is how you would use the translation finetuning on your own files, after adjusting the
|
|
values for the arguments `--train_file`, `--validation_file` to match your setup:
|
|
|
|
```bash
|
|
python examples/pytorch/translation/run_translation.py \
|
|
--model_name_or_path google-t5/t5-small \
|
|
--do_train \
|
|
--do_eval \
|
|
--source_lang en \
|
|
--target_lang ro \
|
|
--source_prefix "translate English to Romanian: " \
|
|
--dataset_name wmt16 \
|
|
--dataset_config_name ro-en \
|
|
--train_file path_to_jsonlines_file \
|
|
--validation_file path_to_jsonlines_file \
|
|
--output_dir /tmp/tst-translation \
|
|
--per_device_train_batch_size=4 \
|
|
--per_device_eval_batch_size=4 \
|
|
--overwrite_output_dir \
|
|
--predict_with_generate
|
|
```
|
|
|
|
The task of translation supports only custom JSONLINES files, with each line being a dictionary with a key `"translation"` and its value another dictionary whose keys is the language pair. For example:
|
|
|
|
```json
|
|
{ "translation": { "en": "Others have dismissed him as a joke.", "ro": "Alții l-au numit o glumă." } }
|
|
{ "translation": { "en": "And some are holding out for an implosion.", "ro": "Iar alții așteaptă implozia." } }
|
|
```
|
|
Here the languages are Romanian (`ro`) and English (`en`).
|
|
|
|
If you want to use a pre-processed dataset that leads to high BLEU scores, but for the `en-de` language pair, you can use `--dataset_name stas/wmt14-en-de-pre-processed`, as following:
|
|
|
|
```bash
|
|
python examples/pytorch/translation/run_translation.py \
|
|
--model_name_or_path google-t5/t5-small \
|
|
--do_train \
|
|
--do_eval \
|
|
--source_lang en \
|
|
--target_lang de \
|
|
--source_prefix "translate English to German: " \
|
|
--dataset_name stas/wmt14-en-de-pre-processed \
|
|
--output_dir /tmp/tst-translation \
|
|
--per_device_train_batch_size=4 \
|
|
--per_device_eval_batch_size=4 \
|
|
--overwrite_output_dir \
|
|
--predict_with_generate
|
|
```
|
|
|
|
## With Accelerate
|
|
|
|
Based on the script [`run_translation_no_trainer.py`](https://github.com/huggingface/transformers/blob/main/examples/pytorch/translation/run_translation_no_trainer.py).
|
|
|
|
Like `run_translation.py`, this script allows you to fine-tune any of the models supported on a
|
|
translation task, the main difference is that this
|
|
script exposes the bare training loop, to allow you to quickly experiment and add any customization you would like.
|
|
|
|
It offers less options than the script with `Trainer` (for instance you can easily change the options for the optimizer
|
|
or the dataloaders directly in the script) but still run in a distributed setup, on TPU and supports mixed precision by
|
|
the mean of the [🤗 `Accelerate`](https://github.com/huggingface/accelerate) library. You can use the script normally
|
|
after installing it:
|
|
|
|
```bash
|
|
pip install git+https://github.com/huggingface/accelerate
|
|
```
|
|
|
|
then
|
|
|
|
```bash
|
|
python run_translation_no_trainer.py \
|
|
--model_name_or_path Helsinki-NLP/opus-mt-en-ro \
|
|
--source_lang en \
|
|
--target_lang ro \
|
|
--dataset_name wmt16 \
|
|
--dataset_config_name ro-en \
|
|
--output_dir ~/tmp/tst-translation
|
|
```
|
|
|
|
You can then use your usual launchers to run in it in a distributed environment, but the easiest way is to run
|
|
|
|
```bash
|
|
accelerate config
|
|
```
|
|
|
|
and reply to the questions asked. Then
|
|
|
|
```bash
|
|
accelerate test
|
|
```
|
|
|
|
that will check everything is ready for training. Finally, you can launch training with
|
|
|
|
```bash
|
|
accelerate launch run_translation_no_trainer.py \
|
|
--model_name_or_path Helsinki-NLP/opus-mt-en-ro \
|
|
--source_lang en \
|
|
--target_lang ro \
|
|
--dataset_name wmt16 \
|
|
--dataset_config_name ro-en \
|
|
--output_dir ~/tmp/tst-translation
|
|
```
|
|
|
|
This command is the same and will work for:
|
|
|
|
- a CPU-only setup
|
|
- a setup with one GPU
|
|
- a distributed training with several GPUs (single or multi node)
|
|
- a training on TPUs
|
|
|
|
Note that this library is in alpha release so your feedback is more than welcome if you encounter any problem using it.
|