huggingface / transformers

🤗 Transformers: State-of-the-art Machine Learning for Pytorch, TensorFlow, and JAX.
https://huggingface.co/transformers
Apache License 2.0
134.68k stars 26.93k forks source link

Marian Conversion Script #5783

Closed Ahmedkoptan closed 4 years ago

Ahmedkoptan commented 4 years ago

I want to utilize and train the machine translation models posted on Github: https://github.com/Helsinki-NLP/OPUS-MT-train/tree/master/models on my own corpus. These models are C++ based.

Are these models exactly the same as the ones posted by Hugging Face’s website: https://huggingface.co/Helsinki-NLP ?

If they are, what is the transformers conversion script that loads these Github models and transforms them to models that are loadable via transformers (for example utilizing: transformers.AutoTokenizer.from_pretrained(‘path’), transformers.AutoModelWithLMHead.from_pretrained(‘path’))?

@sshleifer @jackalhan

sshleifer commented 4 years ago

The script you want is at src/transformers/convert_marian_to_pytorch.py It requires you to download the marian model you wish to convert and also to clone

git clone git@github.com:Helsinki-NLP/Opus-MT-train.git

you may have to adjust some paths in the script (like repo_path) based on where things are. https://github.com/huggingface/transformers/blob/448c467256332e4be8c122a159b482c1ef039b98/src/transformers/convert_marian_to_pytorch.py#L189

sshleifer commented 4 years ago

Also note that we have ported 1000+ of them, and some were renamed. Which one are you looking for?

ronaldvelzen commented 3 years ago

I have trained a Transformer model to translate from Italian to Dutch with Marian based on https://github.com/marian-nmt/marian-examples/tree/master/transformer and data from OPUS. The model is using BPE for tokenization. I have the itnl.bpe, vocab file, model.npz file, etc. on my computer.

The example with the conver_marian_to_pytorch.py is using the model files from the Helsinki-NLP/Opus-MT-train repo instead of local model files. So how can I use the local model files (that I trained with marian) to convert them to a pytorch model that can be used with huggingface?

@sshleifer

sshleifer commented 3 years ago

I don't think BPE tokenizer will work. To answer the local model question, you need to (roughly) (a) run the converter on a model from the repo and see what files get downloaded, (b) make your filesystem look like that (c) update the code to not download things and not make model cards.

baosiek commented 3 years ago

I am probably missing something here. I am trying to buid a grammar corrector using Marian NMT generated model with Huggingface's transformer. Source language is the text with erros and target language the text without. I have trained the model following this example (https://github.com/marian-nmt/marian-examples/tree/master/transformer). As it does not generate source and target spm files, I created both of them them using "build/spm_train" provided with Marian implementation and, of course, using for each one their respective training files, the same used for training the model.

The commands to generate spm files are: ../../build/spm_train --input data/src_sentences_dev.txt --model_prefix=source --vocab_size=16000 --character_coverage=1.0 ../../build/spm_train --input data/ref_sentences_dev.txt --model_prefix=target --vocab_size=16000 --character_coverage=1.0

After that I proceeded with the convertion to pythorch using https://github.com/huggingface/transformers/blob/master/src/transformers/models/marian/convert_marian_to_pytorch.py. This convertion went fine. The problem is that when I use this model in Huggingface's transformer.MarianMTModel and MarianTokenizer (from_pretrained) I get weired results.

So to mitigate that I tried to perform another convertion, this time using en-de files downloaded from https://github.com/Helsinki-NLP/OPUS-MT-train/tree/master/models/en-de. Convertion went fine, unfortunately with the same weired results, example at the bottom, as with the model I created for grammar correction.

I further downloaded the required files from https://huggingface.co/Helsinki-NLP/opus-mt-en-de/tree/main and substituted the ones genereated by convert_marian_to_pytorch.py above with these and, as expected, the translation went fine.

The converter, to my knowledge, requires 4 files: source.spm, target.spm, vocab.yml and model.npz. As these weired results raises after I use the converter, both with my model and the en-de downloaded from https://github.com/Helsinki-NLP/OPUS-MT-train/tree/master/models/en-de, I guess I am missing a piece of info that I cannot identify.

It is worth noting that my grammar corrector model works correctly with marian_decoder.

Any help will be very much appreciated! @sshleifer ?

Cheers

Example of English -> German translation: Source: "Today is Sunday" Translation: ▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Nachricht▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Nachricht▁Rumänien▁Rumänien▁Nachricht▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁Nachricht▁Rumänien▁Rumänien▁Rumänien▁Rumänien▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige▁verdächtige

seelebrn commented 1 year ago

I hope it's not bad practice to necro an issue but since I can't seem to link it in a new one, I'd like to add that I'm encountering th same behaviour using the script.

The conversion went fine, but the generation output is, for me :

??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

or, sometimes

linkage linkage linkage linkage linkage linkage linkage linkage linkage linkage linkage linkage linkage linkage linkage linkage linkage linkage linkage linkage linkage linkage linkage (ad lib).

I should note that I have used OPUS-CAT to fine tune an OPUS-MT model, and that it performs relatively well inside the app. Also conversion with the script went on without issues.

Like the OP, if I replace the model files with the original ones (in my case,Helsinki-NLP/opus-mt-zh-en), everything is fixed, so I don't think this is a pure script/params issue.

Thanks in advance !