{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Transformers installation\n", "! pip install transformers datasets evaluate accelerate\n", "# To install from source instead of the last release, comment the command above and uncomment the following one.\n", "# ! pip install git+https://github.com/huggingface/transformers.git" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Modelos multilingües para inferencia" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Existen varios modelos multilingües en 🤗 Transformers y su uso para inferencia difiere de los modelos monolingües. Sin embargo, no *todos* los usos de los modelos multilingües son diferentes. Algunos modelos, como [google-bert/bert-base-multilingual-uncased](https://huggingface.co/google-bert/bert-base-multilingual-uncased), pueden utilizarse igual que un modelo monolingüe. Esta guía te enseñará cómo utilizar modelos multilingües cuyo uso difiere en la inferencia." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## XLM" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "XLM tiene diez checkpoints diferentes de los cuales solo uno es monolingüe. Los nueve checkpoints restantes del modelo pueden dividirse en dos categorías: los checkpoints que utilizan language embeddings y los que no." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### XLM con language embeddings" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Los siguientes modelos XLM usan language embeddings para especificar el lenguaje utilizado en la inferencia:\n", "\n", "- `FacebookAI/xlm-mlm-ende-1024` (Masked language modeling, English-German)\n", "- `FacebookAI/xlm-mlm-enfr-1024` (Masked language modeling, English-French)\n", "- `FacebookAI/xlm-mlm-enro-1024` (Masked language modeling, English-Romanian)\n", "- `FacebookAI/xlm-mlm-xnli15-1024` (Masked language modeling, XNLI languages)\n", "- `FacebookAI/xlm-mlm-tlm-xnli15-1024` (Masked language modeling + translation, XNLI languages)\n", "- `FacebookAI/xlm-clm-enfr-1024` (Causal language modeling, English-French)\n", "- `FacebookAI/xlm-clm-ende-1024` (Causal language modeling, English-German)\n", "\n", "Los language embeddings son representados como un tensor de la mismas dimensiones que los `input_ids` pasados al modelo. Los valores de estos tensores dependen del idioma utilizado y se identifican mediante los atributos `lang2id` y `id2lang` del tokenizador.\n", "\n", "En este ejemplo, carga el checkpoint `FacebookAI/xlm-clm-enfr-1024` (Causal language modeling, English-French):" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import torch\n", "from transformers import XLMTokenizer, XLMWithLMHeadModel\n", "\n", "tokenizer = XLMTokenizer.from_pretrained(\"FacebookAI/xlm-clm-enfr-1024\")\n", "model = XLMWithLMHeadModel.from_pretrained(\"FacebookAI/xlm-clm-enfr-1024\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El atributo `lang2id` del tokenizador muestra los idiomas de este modelo y sus ids:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'en': 0, 'fr': 1}" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "print(tokenizer.lang2id)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A continuación, crea un input de ejemplo:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "input_ids = torch.tensor([tokenizer.encode(\"Wikipedia was used to\")]) # batch size of 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Establece el id del idioma, por ejemplo `\"en\"`, y utilízalo para definir el language embedding. El language embedding es un tensor lleno de `0` ya que es el id del idioma para inglés. Este tensor debe ser del mismo tamaño que `input_ids`." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "language_id = tokenizer.lang2id[\"en\"] # 0\n", "langs = torch.tensor([language_id] * input_ids.shape[1]) # torch.tensor([0, 0, 0, ..., 0])\n", "\n", "# We reshape it to be of size (batch_size, sequence_length)\n", "langs = langs.view(1, -1) # is now of shape [1, sequence_length] (we have a batch size of 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora puedes pasar los `input_ids` y el language embedding al modelo:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "outputs = model(input_ids, langs=langs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "El script [run_generation.py](https://github.com/huggingface/transformers/tree/master/examples/pytorch/text-generation/run_generation.py) puede generar texto con language embeddings utilizando los checkpoints `xlm-clm`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### XLM sin language embeddings" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Los siguientes modelos XLM no requieren language embeddings durante la inferencia:\n", "\n", "- `FacebookAI/xlm-mlm-17-1280` (modelado de lenguaje enmascarado, 17 idiomas)\n", "- `FacebookAI/xlm-mlm-100-1280` (modelado de lenguaje enmascarado, 100 idiomas)\n", "\n", "Estos modelos se utilizan para representaciones genéricas de frases a diferencia de los anteriores checkpoints XLM." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## BERT" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Los siguientes modelos de BERT pueden utilizarse para tareas multilingües:\n", "\n", "- `google-bert/bert-base-multilingual-uncased` (modelado de lenguaje enmascarado + predicción de la siguiente oración, 102 idiomas)\n", "- `google-bert/bert-base-multilingual-cased` (modelado de lenguaje enmascarado + predicción de la siguiente oración, 104 idiomas)\n", "\n", "Estos modelos no requieren language embeddings durante la inferencia. Deben identificar la lengua a partir del\n", "contexto e inferir en consecuencia." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## XLM-RoBERTa" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Los siguientes modelos de XLM-RoBERTa pueden utilizarse para tareas multilingües:\n", "\n", "- `FacebookAI/xlm-roberta-base` (modelado de lenguaje enmascarado, 100 idiomas)\n", "- `FacebookAI/xlm-roberta-large` (Modelado de lenguaje enmascarado, 100 idiomas)\n", "\n", "XLM-RoBERTa se entrenó con 2,5 TB de datos CommonCrawl recién creados y depurados en 100 idiomas. Proporciona fuertes ventajas sobre los modelos multilingües publicados anteriormente como mBERT o XLM en tareas posteriores como la clasificación, el etiquetado de secuencias y la respuesta a preguntas." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## M2M100" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Los siguientes modelos de M2M100 pueden utilizarse para traducción multilingüe:\n", "\n", "- `facebook/m2m100_418M` (traducción)\n", "- `facebook/m2m100_1.2B` (traducción)\n", "\n", "En este ejemplo, carga el checkpoint `facebook/m2m100_418M` para traducir del chino al inglés. Puedes establecer el idioma de origen en el tokenizador:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from transformers import M2M100ForConditionalGeneration, M2M100Tokenizer\n", "\n", "en_text = \"Do not meddle in the affairs of wizards, for they are subtle and quick to anger.\"\n", "chinese_text = \"不要插手巫師的事務, 因為他們是微妙的, 很快就會發怒.\"\n", "\n", "tokenizer = M2M100Tokenizer.from_pretrained(\"facebook/m2m100_418M\", src_lang=\"zh\")\n", "model = M2M100ForConditionalGeneration.from_pretrained(\"facebook/m2m100_418M\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tokeniza el texto:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "encoded_zh = tokenizer(chinese_text, return_tensors=\"pt\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "M2M100 fuerza el id del idioma de destino como el primer token generado para traducir al idioma de destino.. Establece el `forced_bos_token_id` a `en` en el método `generate` para traducir al inglés:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'Do not interfere with the matters of the witches, because they are delicate and will soon be angry.'" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "generated_tokens = model.generate(**encoded_zh, forced_bos_token_id=tokenizer.get_lang_id(\"en\"))\n", "tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## MBart" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Los siguientes modelos de MBart pueden utilizarse para traducción multilingüe:\n", "\n", "- `facebook/mbart-large-50-one-to-many-mmt` (traducción automática multilingüe de uno a muchos, 50 idiomas)\n", "- `facebook/mbart-large-50-many-to-many-mmt` (traducción automática multilingüe de muchos a muchos, 50 idiomas)\n", "- `facebook/mbart-large-50-many-to-one-mmt` (traducción automática multilingüe muchos a uno, 50 idiomas)\n", "- `facebook/mbart-large-50` (traducción multilingüe, 50 idiomas)\n", "- `facebook/mbart-large-cc25`\n", "\n", "En este ejemplo, carga el checkpoint `facebook/mbart-large-50-many-to-many-mmt` para traducir del finlandés al inglés. Puedes establecer el idioma de origen en el tokenizador:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from transformers import AutoTokenizer, AutoModelForSeq2SeqLM\n", "\n", "en_text = \"Do not meddle in the affairs of wizards, for they are subtle and quick to anger.\"\n", "fi_text = \"Älä sekaannu velhojen asioihin, sillä ne ovat hienovaraisia ja nopeasti vihaisia.\"\n", "\n", "tokenizer = AutoTokenizer.from_pretrained(\"facebook/mbart-large-50-many-to-many-mmt\", src_lang=\"fi_FI\")\n", "model = AutoModelForSeq2SeqLM.from_pretrained(\"facebook/mbart-large-50-many-to-many-mmt\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Tokeniza el texto:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "encoded_en = tokenizer(en_text, return_tensors=\"pt\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "MBart fuerza el id del idioma de destino como el primer token generado para traducirlo. Establece el `forced_bos_token_id` a `en` en el método `generate` para traducir al inglés:" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"Don't interfere with the wizard's affairs, because they are subtle, will soon get angry.\"" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "generated_tokens = model.generate(**encoded_en, forced_bos_token_id=tokenizer.lang_code_to_id(\"en_XX\"))\n", "tokenizer.batch_decode(generated_tokens, skip_special_tokens=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si estás usando el checkpoint `facebook/mbart-large-50-many-to-one-mmt` no necesitas forzar el id del idioma de destino como el primer token generado, de lo contrario el uso es el mismo." ] } ], "metadata": {}, "nbformat": 4, "nbformat_minor": 4 }