BERT Fine Tuning con Cloud TPU: Tareas de clasificación de oraciones y pares de oraciones (TF 2.x)


En este instructivo, se muestra cómo entrenar el modelo "Representaciones de codificador bidireccional de transformadores" (BERT) en Cloud TPU.

BERT es un método para realizar un entrenamiento previo de representaciones lingüísticas. El entrenamiento previo se refiere a la manera en que BERT se entrena primero en una gran fuente de texto, como Wikipedia. A continuación, puedes aplicar los resultados del entrenamiento a otras tareas de procesamiento de lenguaje natural (PLN), como respuesta a preguntas y análisis de opiniones. Con BERT y Cloud TPU, puedes entrenar una variedad de modelos de PLN en alrededor de 30 minutos.

Para obtener más información sobre BERT, consulta los siguientes recursos:

Objetivos

  • Crear un bucket de Cloud Storage para almacenar el resultado de tu modelo y tu conjunto de datos
  • 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
  • Cloud Storage

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

En esta sección, se proporciona información sobre cómo configurar el bucket de Cloud Storage y una VM de Compute Engine.

  1. Abre una ventana de Cloud Shell.

    Abrir Cloud Shell

  2. Crea una variable para el ID de tu proyecto.

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

    gcloud config set project ${PROJECT_ID}
  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 con el siguiente comando:

    gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=us-central1

    En este bucket de Cloud Storage se almacenan los datos que usas para entrenar tu modelo y los resultados del entrenamiento. El comando que usas para crear una TPU, gcloud compute tpus tpu-vm create, configura 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.

    La ubicación del bucket debe estar en la misma región que la TPU (VM).

  6. Inicia una VM de TPU con gcloud. Para obtener más información, consulta la Referencia de gcloud.

    $ gcloud compute tpus tpu-vm create bert-tutorial \
      --zone=us-central1-b \
      --accelerator-type=v3-8 \
      --version=tpu-vm-tf-2.17.0-se

    Descripciones de las marcas de comandos

    zone
    Es la zona en la que deseas crear la Cloud TPU.
    accelerator-type
    El tipo de acelerador especifica la versión y el tamaño de la Cloud TPU que deseas crear. Para 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.
  7. Conéctate a la instancia de VM de TPU con SSH. Cuando te conectas a la VM, El indicador de shell cambia de username@projectname a username@vm-name:

    gcloud compute tpus tpu-vm ssh bert-tutorial --zone=us-central1-b
  8. Crea una variable de entorno para el nombre de la TPU.

    (vm)$ export TPU_NAME=local

Prepara el conjunto de datos

  1. Define el bucket de almacenamiento necesario para almacenar el modelo y el conjunto de datos:

    (vm)$ export STORAGE_BUCKET=gs://bucket-name
  2. Copia el punto de control y los archivos de vocabulario previamente entrenados en tu bucket de almacenamiento:

      (vm)$ curl https://storage.googleapis.com/tf_model_garden/nlp/bert/v3/uncased_L-12_H-768_A-12.tar.gz -o uncased_L-12_H-768_A-12.tar.gz
      (vm)$ mkdir -p uncased_L-12_H-768_A-12
      (vm)$ tar -xvf uncased_L-12_H-768_A-12.tar.gz
      (vm)$ gcloud storage cp uncased_L-12_H-768_A-12 ${STORAGE_BUCKET} --recursive

Entrenar el modelo

  1. Define varios valores de parámetros necesarios cuando entrenar y evaluar el modelo:

      (vm)$ export INIT_CHECKPOINT=${STORAGE_BUCKET}/uncased_L-12_H-768_A-12/bert_model.ckpt
      (vm)$ export TFDS_DIR=${STORAGE_BUCKET}/tfds
      (vm)$ export VOCAB_FILE=${STORAGE_BUCKET}/uncased_L-12_H-768_A-12/vocab.txt
      (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/bert-output
      (vm)$ export TASK=mnli
      

  2. Instala los requisitos de TensorFlow.

    (vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
  3. Configura la variable de entorno PYTHONPATH.

    (vm)$ export PYTHONPATH=/usr/share/tpu/models
  4. Ve al directorio en el que se almacena el modelo:

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

    (vm)$ python3 official/nlp/train.py \
      --tpu=${TPU_NAME} \
      --experiment=bert/sentence_prediction_text \
      --mode=train_and_eval \
      --model_dir=${MODEL_DIR} \
      --config_file=official/nlp/configs/experiments/glue_mnli_text.yaml \
      --params_override="runtime.distribution_strategy=tpu, task.init_checkpoint=${INIT_CHECKPOINT}, task.train_data.tfds_data_dir=${TFDS_DIR}, task.train_data.vocab_file=${VOCAB_FILE}, task.validation_data.tfds_data_dir=${TFDS_DIR}, task.validation_data.vocab_file=${VOCAB_FILE}, trainer.train_steps=2000"

    Descripciones de las marcas de comandos

    tpu
    El nombre de Cloud TPU que se usará para el entrenamiento.
    mode
    Uno de train, eval, train_and_eval, o predict.
    model_dir
    La ruta de acceso de Cloud Storage en la que se almacenan puntos de control y resúmenes durante el entrenamiento de modelos. Puedes reutilizar una carpeta existente para cargar puntos de control generados con anterioridad y almacenar puntos de control adicionales siempre que los puntos de control anteriores se hayan creado mediante un Cloud TPU del mismo tamaño y versión de TensorFlow.

    La secuencia de comandos se entrena para 2,000 pasos y, luego, ejecuta 307 pasos de evaluación. En una TPU v3-8, después de aproximadamente 5 minutos, la secuencia de comandos de entrenamiento debería completarse y mostrar resultados similares a los siguientes:

    I0719 00:47:52.683979 140297079573568 controller.py:457] train | step:   2000 | steps/sec:   26.3 | output:
    {'cls_accuracy': 0.7249375,
     'learning_rate': 1.4670059e-05,
     'training_loss': 0.6740678}
    train | step:   2000 | steps/sec:   26.3 | output:
    {'cls_accuracy': 0.7249375,
     'learning_rate': 1.4670059e-05,
     'training_loss': 0.6740678}
    I0719 00:47:53.184051 140297079573568 controller.py:277]  eval | step:   2000 | running 307 steps of evaluation...
    eval | step:   2000 | running 307 steps of evaluation...
    

Limpia

  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 bert-tutorial \
      --zone=us-central1-b
  3. Ejecuta gcloud compute tpus tpu-vm list para verificar que los recursos se hayan borrado. La eliminación puede tardar varios minutos. El resultado del siguiente comando no debe incluir ninguno de los recursos creados en este instructivo:

    $ gcloud compute tpus tpu-vm list --zone=us-central1-b
  4. Borra el bucket de Cloud Storage con gcloud CLI como se muestra en el siguiente ejemplo. Reemplaza bucket-name por el nombre de tu bucket de Cloud Storage.

    $ gcloud storage rm gs://bucket-name --recursive

¿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 la inferencia. Para usar un modelo para inferencia, puedes entrenar los datos en un modelo conjunto de datos o uno propio. Modelos de TensorFlow entrenados con Cloud TPU generalmente requieren que los conjuntos de datos estén 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 en formato TFRecord. Si no usas un modelo de clasificación de imágenes, deberás convertir tú mismo el conjunto de datos en 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 los hiperparámetros del modelo. Puedes encontrar información sobre los hiperparámetros comunes a todos Los modelos compatibles con TPU en GitHub: La información sobre los hiperparámetros específicos del modelo se puede encontrar en la fuente de la aplicación para cada un modelo de responsabilidad compartida. Para obtener más información sobre el ajuste de hiperparámetros, consulta Descripción general de ajuste de hiperparámetros y ajustes hiperparámetros.

Inferencia

Una vez que hayas entrenado tu modelo, puedes usarlo para inferencias (también denominado predicciones). Puedes usar el conversor de inferencia de Cloud TPU de desarrollo de software para preparar y optimizar un Modelo de TensorFlow para inferencias en Cloud TPU v5e. Para ver más información sobre la inferencia en Cloud TPU v5e, consulta Inferencia de Cloud TPU v5e introducción.