Tutorial: fine‐tuning de los modelos NLLB con OpenNMT‐py - mtuoc/mtuoc.github.io GitHub Wiki
Introducción
En este tutorial se explica cómo hacer el fine-tuning de un modelo NLLB (No Language Left Behind) utilizando OpenNMT.py. Si todavía no tienes instalado OpenNMT lee el Tutorial: instalación de OpenNMT-py.
En este tutorial se explica cómo hacer el fine-tuning para una lengua existente. Si quieres ampliar los modelos NLLB con una nueva lengua mira el Tutorial: ampliar los modelos NLLB con una nueva lengua.
Lectura recomendada
Para saber más sobre los modelos NLLB puedes leer el siguiente artículo:
Marta R. Costa-jussà, James Cross, Onur Çelebi, Maha Elbayad, Kenneth Heafield, Kevin Heffernan, Elahe Kalbassi, Janice Lam, Daniel Licht, Jean Maillard, Anna Sun, Skyler Wang, Guillaume Wenzek, Al Youngblood, Bapi Akula, Loic Barrault, Gabriel Mejia Gonzalez, Prangthip Hansanti, John Hoffman, Semarley Jarrett, Kaushik Ram Sadagopan, Dirk Rowe, Shannon Spruit, Chau Tran, Pierre Andrews, Necip Fazil Ayan, Shruti Bhosale, Sergey Edunov, Angela Fan, Cynthia Gao, Vedanuj Goswami, Francisco Guzmán, Philipp Koehn, Alexandre Mourachko, Christophe Ropers, Safiyyah Saleem, Holger Schwenk, Jeff Wang (2022) No Language Left Behind: Scaling Human-Centered Machine Translation arXiv
Modelos y archivos necesarios
Además de disponer OpenNMT instalado necesitas los modelos NLLB convertidos a formato OpenNMT. Estos modelos se pueden descargar desde la web de OpenNMT:
- NLLB 200 3.3B - Transformer (download)
- NLLB 200 1.3B - Transformer (download)
- NLLB 200 1.3B distilled - Transformer (download)
- NLLB 200 600M - Transformer (download)
Fíjate que el modelo NLLB se distribuye en tres tamaños diferentes. El fine-tuning será muy similar para los tres tamaños, pero se tendrán que ajustar algunos parámetros, como indicaremos más adelante.
También es necesario disponer del modelo de sentencepiece, que se puede descargar en el siguiente enlace:
- SentencePiece model 515 - 200 languages
Además,necesitariemos también el vocabulario que utiliza NLLB:
Y también necesitarás un corpus de finetuning en formato Moses, es decir un archivo para la lengua de partida y otro para la lengua de llegada.
Finetuning
Aunque el proceso de finetuning es el mismo para los tres tamaños de corpus, algunos de los parámetros del archivo de configuración cambian de un tamaño a otro.
Finetuning de nllb-200_600M
Para realizar el finetuning necesitaremos el archivo de configuración config-finetuning-NLLB-600M.yaml. A continuación mostramos las partes del archivo que tendremos que ajustar para nuestro caso:
share_vocab: true
src_vocab: "shared_vocabulary.txt" #AQUÍ INDICAREMOS LA RUTA Y EL NOMBRE DEL ARCHIVO DE VOCABULARIO
src_words_min_frequency: 1
src_vocab_size: 256206 #SI HEMOS CAMBIADO EL TAMAÑO DEL VOCABULARIO SRC TENDREMOS QUE AJUSTARLO AQUÍ
tgt_vocab: "shared_vocabulary.txt" #AQUÍ INDICAREMOS LA RUTA Y EL NOMBRE DEL ARCHIVO DE VOCABULARIO
tgt_words_min_frequency: 1
tgt_vocab_size: 256206 #SI HEMOS CAMBIADO EL TAMAÑO DEL VOCABULARIO tgt TENDREMOS QUE AJUSTARLO AQUÍ
vocab_size_multiple: 1
decoder_start_token: '</s>'
#### Subword
src_subword_model: "flores200_sacrebleu_tokenizer_spm.model" #AQUÍ INDICAREMOS EL NOMBRE Y LA RUTA DEL MODELO DE SENTENCEPIECE
tgt_subword_model: "flores200_sacrebleu_tokenizer_spm.model" #AQUÍ INDICAREMOS EL NOMBRE Y LA RUTA DEL MODELO DE SENTENCEPIECE
...
# Corpus opts:
data:
corpus1: #HAY QUE TENER EN CUENTA QUE SE PUEDEN TENER DIVERSOS CORPUS COPIANDO ESTA SECCIÓN Y PUEDEN TENER CUALQUIER NOMBRE
path_src: "train.es" #RUTA Y NOMBRE DEL CORPUS PARA FINETUNING DE LA LENGUA DE PARTIDA
path_tgt: "train.hr" #RUTA Y NOMBRE DEL CORPUS PARA FINETUNING DE LA LENGUA DE LLEGADA
transforms: [sentencepiece, prefix, suffix, filtertoolong]
weight: 10 #SI TENEMOS MÁS DE UN CORPUS PODEMOS INDICAR PESOS DIFERENTES PARA CADA CORPUS DEPENDIENDO DE SU IMPORTANCIA
src_prefix: "spa_Latn" #EL CÓDIGO DE LA LENGUA DE PARTIDA
tgt_prefix: "hrv_Latn" #EL CÓDIGO DE LA LENGUA DE LLEGAA
src_suffix: "</s>"
tgt_suffix: ""
...
train_from: "nllb-200-600M-onmt.pt" #LA RUTA Y NOMBRE DEL MODELO DE PARTIDA
...
save_data: "./finetuned600M" #RUTA DONDE SE VAN A GUARDAR LOS DATOS
save_model: "./finetuned600M/nllb-200-600-FT-onmt" #RUTA DONDE SE VAN A GUARDAR EL MODELO
log_file: "./finetuned600M/nllb-200-600-FT-onmt.log" #NOMBRE Y RUTA DEL ARCHIVO DE LOG
...
# Model #LOS SIGUIENTES PARÁMETROS PUEDEN CAMBIAR DE UN TAMAÑO DE MODELO NLLB A OTRO
override_opts: true
encoder_type: transformer
decoder_type: transformer
enc_layers: 12
dec_layers: 12
heads: 16
hidden_size: 1024
word_vec_size: 1024
transformer_ff: 4096
...
Una vez tenemos todo configurado podemos iniciar el proceso de finuning escribiendo:
python3 train.py --config config-fintuning-NLLB-600M.yaml
Recuerda que si estás en un entorno virtual de Python tendrás que indicar la ruta completa a train.py
Una vez finalizado el proceso de finetuning en la ruta indicada en el parámetro save_model tendremos el modelo ajustado y otros modelos para cada uno de los pasos del finetuning.