Entrena a un transformador en Cloud TPU (TF 2.x)


Si no estás familiarizado con Cloud TPU, te recomendamos que consultes la quickstart para aprender a crear una VM de TPU.

En este instructivo, se muestra cómo entrenar un modelo Transformer en Cloud TPU. Transformer es una arquitectura de red neuronal que resuelve problemas de secuencia a secuencia mediante mecanismos de atención. A diferencia de los modelos tradicionales de SQL seq2seq, Transformer no incluye conexiones recurrentes. El mecanismo de atención aprende las dependencias entre los tokens en dos secuencias. Dado que las ponderaciones de atención se aplican a todos los tokens en las secuencias, el modelo Transformer puede capturar fácilmente las dependencias de larga distancia.

La estructura general de un transformador sigue el patrón de codificador-decodificador estándar. El codificador usa la autoatención para calcular una representación de la secuencia de entrada. El decodificador genera la secuencia de salida de un token a la vez, y toma la salida del codificador y los tokens de salida anteriores del decodificador como entradas.

El modelo también aplica incorporaciones en los tokens de entrada y salida, y agrega una codificación posicional constante. La codificación posicional agrega información sobre la posición de cada token.

Objetivos

  • Crear un bucket de Cloud Storage para almacenar el resultado de tu modelo y tu conjunto de datos
  • Descarga y procesa previamente el conjunto de datos que se usó para entrenar el modelo.
  • Ejecutar el trabajo de entrenamiento
  • Verificar los resultados de salida

Costos

En este documento, usarás los siguientes componentes facturables de Google Cloud:

  • Compute Engine
  • Cloud TPU

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios. Es posible que los usuarios nuevos de Google Cloud califiquen para obtener una prueba gratuita.

Antes de comenzar

Antes de comenzar este instructivo, verifica que tu proyecto de Google Cloud esté configurado correctamente.

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  5. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  6. En esta explicación, se usan componentes facturables de Google Cloud. Consulta la página de precios de Cloud TPU para calcular los costos. Asegúrate de limpiar los recursos que crees cuando hayas terminado de usarlos para evitar cargos innecesarios.

Entrena con un solo dispositivo de Cloud TPU

En esta sección, se proporciona información sobre cómo configurar un bucket de Cloud Storage y una VM de TPU para el entrenamiento de dispositivos únicos.

  1. Abre una ventana de Cloud Shell.

    Abra Cloud Shell

  2. Crea una variable de entorno para tu ID del proyecto.

    export PROJECT_ID=project-id
    
  3. Configura Google Cloud CLI para usar el proyecto de Google Cloud en el que deseas crear una Cloud TPU.

    gcloud config set project ${PROJECT_ID}
    

    La primera vez que ejecutes este comando en una VM nueva de Cloud Shell, se mostrará una página Authorize Cloud Shell. Haz clic en Authorize en la parte inferior de la página para permitir que gcloud realice llamadas a la API de Google Cloud con tus credenciales.

  4. Crea una cuenta de servicio para el proyecto de Cloud TPU.

    Las cuentas de servicio permiten que el servicio de Cloud TPU acceda a otros servicios de Google Cloud.

    $ gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
    

    El comando muestra una cuenta de servicio de Cloud TPU con el siguiente formato:

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    

  5. Crea un bucket de Cloud Storage con el siguiente comando:

    $ gsutil mb -p ${PROJECT_ID} -c standard -l us-central2 gs://bucket-name
    

    En este bucket de Cloud Storage se almacenan los datos que usas para entrenar tu modelo y los resultados del entrenamiento. El comando gcloud que se usa en este instructivo a fin de configurar la TPU también establece permisos predeterminados para la cuenta de servicio de Cloud TPU que configuraste en el paso anterior. Si quieres contar con permisos más detallados, revisa los permisos de nivel de acceso.

Entrena el modelo Transformer en una sola Cloud TPU

  1. Inicia una VM de Cloud TPU con el comando gcloud.

      $ gcloud compute tpus tpu-vm create transformer-tutorial \
         --zone=us-central2-b \
         --accelerator-type=v4-8 \
         --version=tpu-vm-tf-2.16.1-pjrt
    

    Descripciones de las marcas de comandos

    zone
    La zona en la que planeas crear tu Cloud TPU.
    accelerator-type
    El tipo de acelerador especifica la versión y el tamaño de la Cloud TPU que quieres crear. Si quieres obtener más información sobre los tipos de aceleradores compatibles con cada versión de TPU, consulta Versiones de TPU.
    version
    La versión de software de Cloud TPU.
  2. Conéctate a la VM de Cloud TPU mediante la ejecución del siguiente comando ssh.

    gcloud compute tpus tpu-vm ssh transformer-tutorial --zone=us-central2-b
    
  3. Exporta las variables de entorno.

      (vm)$ export STORAGE_BUCKET=gs://bucket-name
      (vm)$ export SENTENCEPIECE_MODEL=sentencepiece
      (vm)$ export SENTENCEPIECE_MODEL_PATH=${STORAGE_BUCKET}/${SENTENCEPIECE_MODEL}.model
      (vm)$ export TFDS_DIR=${STORAGE_BUCKET}/tfds
      (vm)$ export PARAM_SET=big
      (vm)$ export TPU_NAME=local
      (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/transformer/model_${PARAM_SET}
      (vm)$  export PYTHONPATH="/usr/share/tpu/models:$PYTHONPATH"
    
  4. Cuando creas tu TPU, si estableces el parámetro --version en una versión que termina en -pjrt, configura las siguientes variables de entorno para habilitar el entorno de ejecución de PJRT:

      (vm)$ export NEXT_PLUGGABLE_DEVICE_USE_C_API=true
      (vm)$ export TF_PLUGGABLE_DEVICE_LIBRARY_PATH=/lib/libtpu.so
    
  5. Instalar los requisitos de TensorFlow

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
    
  6. Descarga y realiza el procesamiento previo del conjunto de datos

      (vm)$ python3 -c "import tensorflow_datasets as tfds; tfds.load('wmt14_translate/de-en', split='train+validation', shuffle_files=True, download=True)"
      (vm)$ python3 /usr/share/tpu/models/official/nlp/data/train_sentencepiece.py --output_model_path=${SENTENCEPIECE_MODEL}
    
  7. Copia el conjunto de datos en el bucket de Cloud Storage

      (vm)$ gsutil -m cp ${SENTENCEPIECE_MODEL}.model ${STORAGE_BUCKET}
      (vm)$ gsutil -m cp ${SENTENCEPIECE_MODEL}.vocab ${STORAGE_BUCKET}
      (vm)$ gsutil -m cp -r tensorflow_datasets/wmt14_translate ${TFDS_DIR}/wmt14_translate
    
  8. Navega al directorio de entrenamiento

    (vm)$ cd /usr/share/tpu/models/
    
  9. Ejecuta la secuencia de comandos de entrenamiento

    (vm)$ python3 official/nlp/train.py \
      --tpu=${TPU_NAME} \
      --experiment=wmt_transformer/large \
      --mode=train_and_eval \
      --model_dir=${MODEL_DIR} \
      --params_override="runtime.distribution_strategy=tpu, task.train_data.tfds_data_dir=${TFDS_DIR}, task.validation_data.tfds_data_dir=${TFDS_DIR}, task.sentencepiece_model_path=${SENTENCEPIECE_MODEL_PATH}, trainer.train_steps=10000, trainer.validation_interval=10000"
    

    Descripciones de las marcas de comandos

    tpu
    El nombre de Cloud TPU. Para ello, especifica la variable de entorno (TPU_NAME).
    experiment
    El modelo que se entrenará.
    mode
    Es el modo en el que se ejecuta la secuencia de comandos.
    model_dir
    El bucket de Cloud Storage, en el que se almacenan los puntos de control y los resúmenes durante el entrenamiento. Puedes usar una carpeta existente para cargar puntos de control generados con anterioridad creados en una TPU del mismo tamaño y versión de TensorFlow.
    params_override
    Establece los parámetros del modelo.

    De forma predeterminada, el modelo se evaluará después de cada 10,000 pasos. Puedes aumentar la cantidad de pasos de entrenamiento o especificar la frecuencia con la que se deben ejecutar las evaluaciones si estableces estos parámetros:

    • train.train_steps: La cantidad total de pasos de entrenamiento que se ejecutarán.
    • trainer.validation_interval: La cantidad de pasos de entrenamiento que se ejecutarán entre evaluaciones.

    El entrenamiento y la evaluación tardan alrededor de 20 minutos en una Cloud TPU v4-8. Cuando se completan el entrenamiento y la evaluación, aparece un mensaje similar al siguiente:

    I0208 20:57:19.309512 140039467895872 controller.py:310]  eval | step:  10000 | eval time:   69.2 sec | output:
    {'bleu_score': 19.204771518707275,
     'sacrebleu_score': 18.307039308307356,
     'validation_loss': 2.0654342}
     eval | step:  10000 | eval time:   69.2 sec | output:
    {'bleu_score': 19.204771518707275,
     'sacrebleu_score': 18.307039308307356,
     'validation_loss': 2.0654342}
    

    Completaste la capacitación para usar con un solo dispositivo. Usa los siguientes pasos para borrar tus recursos de TPU de dispositivo único.

  10. Desconéctate de la instancia de Compute Engine:

    (vm)$ exit
    

    El mensaje ahora debería mostrar username@projectname, que indica que estás en Cloud Shell.

  11. Borra el recurso TPU.

      $ gcloud compute tpus tpu-vm delete transformer-tutorial \
        --zone=us-central2-b
      

    Descripciones de las marcas de comandos

    zone
    La zona donde residió tu Cloud TPU.

En este punto, puedes finalizar este instructivo y realizar una limpieza o puedes continuar y explorar la ejecución del modelo en los Pods de Cloud TPU.

Escala tu modelo con pods de Cloud TPU

El entrenamiento de tu modelo en pods de Cloud TPU puede requerir algunos cambios en la secuencia de comandos de entrenamiento. Para obtener más información, consulta Entrenamiento en pods de TPU.

Entrenamiento de Pods de TPU

  1. Abre una ventana de Cloud Shell.

    Abra Cloud Shell

  2. Crea una variable para tu ID del proyecto.

    export PROJECT_ID=project-id
    
  3. Configura Google Cloud CLI para usar el proyecto en el que deseas crear una Cloud TPU.

    gcloud config set project ${PROJECT_ID}
    

    La primera vez que ejecutes este comando en una VM nueva de Cloud Shell, se mostrará una página Authorize Cloud Shell. Haz clic en Authorize en la parte inferior de la página para permitir que gcloud realice llamadas a la API con tus credenciales.

  4. Crea una cuenta de servicio para el proyecto de Cloud TPU.

    gcloud beta services identity create --service tpu.googleapis.com --project $PROJECT_ID
    

    El comando muestra una cuenta de servicio de Cloud TPU con el siguiente formato:

    service-PROJECT_NUMBER@cloud-tpu.iam.gserviceaccount.com
    

  5. Crea un bucket de Cloud Storage mediante el siguiente comando o usa un bucket que hayas creado antes para tu proyecto:

    gsutil mb -p ${PROJECT_ID} -c standard -l us-central1 gs://bucket-name
    

    Este bucket de Cloud Storage almacena los datos que usas para entrenar tu modelo y los resultados del entrenamiento. Con el comando gcloud que se usa en este instructivo, se configuran los permisos predeterminados para la cuenta de servicio de Cloud TPU que configuraste en el paso anterior. Si quieres contar con permisos más detallados, revisa los permisos de nivel de acceso.

Inicia los recursos de VM de TPU

  1. Inicia un Pod de VM de TPU con el comando gcloud. En este instructivo, se especifica un Pod v4-32. Para ver otras opciones de pod, consulta la página de tipos de TPU disponibles sobre tipos de TPU.

    $ gcloud compute tpus tpu-vm create transformer-tutorial \
      --zone=us-central2-b \
      --accelerator-type=v3-32 \
      --version=tpu-vm-tf-2.16.1-pod-pjrt
    

    Descripciones de las marcas de comandos

    zone
    La zona en la que planeas crear tu Cloud TPU.
    accelerator-type
    El tipo de acelerador especifica la versión y el tamaño de la Cloud TPU que quieres crear. Si quieres obtener más información sobre los tipos de aceleradores compatibles con cada versión de TPU, consulta Versiones de TPU.
    version
    La versión de software de Cloud TPU.
  2. Conéctate a la VM de TPU mediante la ejecución del siguiente comando ssh. Cuando accedas a la VM, el indicador de shell cambiará de username@projectname a username@vm-name:

    gcloud compute tpus tpu-vm ssh transformer-tutorial --zone=us-central2-b
    
  3. Instala los requisitos de TensorFlow.

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
    

Configura y, luego, inicia el entrenamiento de Pods

  1. Exporta las variables de configuración de Cloud TPU:

    (vm)$ export PYTHONPATH="/usr/share/tpu/models:$PYTHONPATH"
    (vm)$ export STORAGE_BUCKET=gs://bucket-name
    (vm)$ export SENTENCEPIECE_MODEL=sentencepiece
    (vm)$ export SENTENCEPIECE_MODEL_PATH=${STORAGE_BUCKET}/${SENTENCEPIECE_MODEL}.model
    (vm)$ export TFDS_DIR=${STORAGE_BUCKET}/tfds
    (vm)$ export TPU_NAME=transformer-tutorial
    (vm)$ export PARAM_SET=big
    (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/transformer/model_${PARAM_SET}
    (vm)$ export TPU_LOAD_LIBRARY=0
    
  2. Descarga el conjunto de datos

    (vm)$ python3 -c "import tensorflow_datasets as tfds; tfds.load('wmt14_translate/de-en', split='train+validation', shuffle_files=True, download=True)"
    (vm)$ python3 /usr/share/tpu/models/official/nlp/data/train_sentencepiece.py --output_model_path=${SENTENCEPIECE_MODEL}

  3. Copia el conjunto de datos en el bucket de Cloud Storage

    (vm)$ gsutil -m cp ${SENTENCEPIECE_MODEL}.model ${STORAGE_BUCKET}
    (vm)$ gsutil -m cp ${SENTENCEPIECE_MODEL}.vocab ${STORAGE_BUCKET}
    (vm)$ gsutil -m cp -r tensorflow_datasets/wmt14_translate ${TFDS_DIR}/wmt14_translate
    
  4. Cambie al directorio de entrenamiento:

    (vm)$ cd /usr/share/tpu/models/
  5. Ejecuta la secuencia de comandos de entrenamiento:

    (vm)$ python3 official/nlp/train.py 
    --tpu=${TPU_NAME}
    --experiment=wmt_transformer/large
    --mode=train_and_eval
    --model_dir=${MODEL_DIR}
    --params_override="runtime.distribution_strategy=tpu, task.train_data.tfds_data_dir=${TFDS_DIR}, task.validation_data.tfds_data_dir=${TFDS_DIR}, task.sentencepiece_model_path=${SENTENCEPIECE_MODEL_PATH}, trainer.train_steps=10000, trainer.validation_interval=10000"

    Command flag descriptions

    tpu
    The name of the Cloud TPU. This is set by specifying the environment variable (TPU_NAME).
    experiment
    The model to train.
    mode
    The mode in which to run the script.
    model_dir
    The Cloud Storage bucket where checkpoints and summaries are stored during training. You can use an existing folder to load previously generated checkpoints created on a TPU of the same size and TensorFlow version.
    params_override
    Set model parameters.

De forma predeterminada, el modelo se evaluará después de cada 10,000 pasos. Para entrenar para convergencia, cambia train_steps a 200000. Puedes aumentar la cantidad de pasos de entrenamiento o especificar la frecuencia con la que se deben ejecutar las evaluaciones si estableces estos parámetros:

  • trainer.train_steps: Configura la cantidad total de pasos de entrenamiento que se deben ejecutar.
  • trainer.validation_interval: Establece la cantidad de pasos de entrenamiento que se ejecutarán entre evaluaciones.

El entrenamiento y la evaluación tardan alrededor de 14 minutos en una Cloud TPU v4-32. Cuando se complete el entrenamiento y la evaluación, aparecerán mensajes similares a los siguientes:

I0209 22:19:49.143219 139751309618240 controller.py:310]  eval | step:  10000 | eval time:   73.6 sec | output:
    {'bleu_score': 19.401752948760986,
     'sacrebleu_score': 18.442741330886378,
     'validation_loss': 2.0558002}
 eval | step:  10000 | eval time:   73.6 sec | output:
    {'bleu_score': 19.401752948760986,
     'sacrebleu_score': 18.442741330886378,
     'validation_loss': 2.0558002}

Esta secuencia de comandos de entrenamiento entrena para 20,000 pasos y ejecuta la evaluación cada 2,000 pasos. Este entrenamiento y evaluación en particular demoran aproximadamente 8 minutos en un pod de Cloud TPU v3-32. Cuando se completan el entrenamiento y la evaluación, aparece un mensaje similar al siguiente:

INFO:tensorflow:Writing to file /tmp/tmpdmlanxcf
I0218 21:09:19.100718 140509661046592 translate.py:184] Writing to file /tmp/tmpdmlanxcf
I0218 21:09:28.043537 140509661046592 transformer_main.py:118] Bleu score (uncased): 1.799112930893898
I0218 21:09:28.043911 140509661046592 transformer_main.py:119] Bleu score (cased): 1.730366237461567

Para entrenar hasta la convergencia, cambia train_steps a 200000. Puedes aumentar la cantidad de pasos de entrenamiento o especificar la frecuencia con la que se deben ejecutar las evaluaciones si configuras estos parámetros:

  • --train_steps: Configura la cantidad total de pasos de entrenamiento que se deben ejecutar.
  • --steps_between_evals: Cantidad de pasos de entrenamiento para ejecutar entre evaluaciones.

Cuando se completan el entrenamiento y la evaluación, aparece un mensaje similar al siguiente:

0509 00:27:59.984464 140553148962624 translate.py:184] Writing to file /tmp/tmp_rk3m8jp
I0509 00:28:11.189308 140553148962624 transformer_main.py:119] Bleu score (uncased): 1.3239131309092045
I0509 00:28:11.189623 140553148962624 transformer_main.py:120] Bleu score (cased): 1.2855342589318752

Limpia

Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.

  1. Desconéctate de la instancia de Compute Engine, si aún no lo hiciste:

    (vm)$ exit
    

    El mensaje ahora debería mostrar username@projectname, que indica que estás en Cloud Shell.

  2. Borra tus recursos de Cloud TPU y Compute Engine.

    $ gcloud compute tpus tpu-vm delete transformer-tutorial \
      --zone=us-central2-b
    
  3. Ejecuta gsutil como se muestra y reemplaza bucket-name por el nombre del depósito de Cloud Storage que creaste para este instructivo:

    $ gsutil rm -r gs://bucket-name
    
    

¿Qué sigue?

Los instructivos de TensorFlow Cloud TPU suelen entrenar el modelo con un conjunto de datos de muestra. Los resultados de este entrenamiento no se pueden usar para inferencias. Si quieres usar un modelo para la inferencia, puedes entrenar los datos en tu propio conjunto de datos o en un conjunto de datos disponible públicamente. Por lo general, los modelos de TensorFlow entrenados con Cloud TPU requieren que los conjuntos de datos estén en formato TFRecord.

Puedes usar la muestra de la herramienta de conversión de conjuntos de datos para convertir un conjunto de datos de clasificación de imágenes al formato TFRecord. Si no usas un modelo de clasificación de imágenes, deberás convertir tu conjunto de datos al formato TFRecord. Para obtener más información, consulta TFRecord y tf.Example.

Ajuste de hiperparámetros

Para mejorar el rendimiento del modelo con tu conjunto de datos, puedes ajustar sus hiperparámetros. Puedes encontrar información sobre los hiperparámetros comunes de todos los modelos compatibles con TPU en GitHub. La información sobre los hiperparámetros específicos del modelo se puede encontrar en el código fuente de cada modelo. Para obtener más información sobre el ajuste de hiperparámetros, consulta Descripción general del ajuste de hiperparámetros y Ajusta hiperparámetros.

Inferencia

Una vez que hayas entrenado tu modelo, puedes usarlo para la inferencia (también llamada predicción). Puedes usar la herramienta de conversión de inferencias de Cloud TPU para preparar y optimizar un modelo de TensorFlow para la inferencia en Cloud TPU v5e. Para obtener más información sobre la inferencia en Cloud TPU v5e, consulta Introducción a la inferencia con Cloud TPU v5e.