Marian Conversion Script
Author: ahmedkobtan
Pull request: no
Labels: name: marian

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 


Comments:
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
```bash
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


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

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 

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.

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




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 !