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


En este instructivo, se muestra cómo entrenar un modelo de Keras ResNet-RS en Cloud TPU con tf.distribute.TPUStrategy. Para obtener más información sobre ResNet-RS, consulta Revisión de ResNets: estrategias mejoradas de entrenamiento y escalamiento.

Si no estás familiarizado con Cloud TPU, te recomendamos que revises la quickstart para obtener información sobre cómo crear una TPU y una VM de Compute Engine.

Objetivos

  • Crear un bucket de Cloud Storage para almacenar el resultado de tu modelo y tu conjunto de datos
  • Preparar un conjunto de datos imagenet falso que sea similar al conjunto de datos ImageNet
  • 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

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.

Configura tus recursos

En esta sección, se proporciona información sobre cómo configurar el bucket de Cloud Storage, la VM y los recursos de Cloud TPU para instructivos.

  1. Abre una ventana de Cloud Shell.

    Abra 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 deseas crear Cloud TPU.

    gcloud config set project ${PROJECT_ID}
    

    La primera vez que ejecutes este comando en una VM de Cloud Shell nueva, se mostrará la 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.

    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 europe-west4 gs://bucket-name
    

    Este bucket de Cloud Storage almacena los datos que usas para entrenar tu modelo y los resultados del entrenamiento. Con la herramienta gcloud compute tpus execution-groups 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.

    La ubicación del bucket debe estar en la misma región que tu Compute Engine (VM) y tu nodo de Cloud TPU.

  6. Inicia una VM de Compute Engine con el comando gcloud.

    $ gcloud compute tpus execution-groups create \
     --vm-only \
     --name=resnet-rs-tutorial \
     --zone=europe-west4-a \
     --disk-size=300 \
     --machine-type=n1-standard-16 \
     --tf-version=2.12.0
     

    Descripciones de las marcas de comandos

    vm-only
    Crea solo una VM, no una TPU.
    name
    Es el nombre de la TPU que se creará.
    zone
    La zona en la que se crea la Cloud TPU.
    disk-size
    El tamaño del disco duro en GB de la VM que creó el comando gcloud compute tpus execution-groups.
    machine-type
    El tipo de máquina de la VM de Compute Engine que se creará.

    Para obtener más información sobre el comando de gcloud, consulta la Referencia de gcloud.

  7. Cuando se te solicite, presiona y a fin de crear tus recursos de Cloud TPU.

    Cuando el comando gcloud compute tpus execution-groups termine de ejecutarse, verifica que el indicador de shell haya cambiado de username@projectname a username@vm-name. Este cambio indica que accediste a tu VM de Compute Engine.

    gcloud compute ssh resnet-rs-tutorial --zone=europe-west4-a
    

    Mientras sigues estas instrucciones, ejecuta cada comando que comience con (vm)$ en tu instancia de Compute Engine.

  8. Instala los paquetes necesarios.

    $ pip3 install tensorflow-text==2.8.1 --no-deps

Configura las variables de bucket de Cloud Storage

Configura las variables de entorno siguientes y reemplaza bucket-name por el nombre del depósito de Cloud Storage:

(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/resnet-rs-2x
(vm)$ export IMAGENET_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
(vm)$ export PYTHONPATH=/usr/share/models
(vm)$ export TPU_NAME=resnet-rs-tutorial

La aplicación de entrenamiento espera que tus datos de entrenamiento sean accesibles en Cloud Storage. La aplicación de entrenamiento también usa tu bucket de Cloud Storage para almacenar puntos de control durante el entrenamiento.

Entrenamiento y evaluación de dispositivo único de Cloud TPU

ImageNet es una base de datos de imágenes. Las imágenes de la base de datos están organizadas en forma jerárquica, y cada nodo está representado por cientos y miles de imágenes.

En este instructivo, se usa una versión de demostración del conjunto de datos completo de ImageNet, denominado fake_imagenet. Esta versión de demostración permite probar el instructivo, a la vez que se reducen los requisitos de almacenamiento y tiempo que se suelen asociar con la ejecución de un modelo en el conjunto de datos completo de ImageNet.

El conjunto de datos fake_imagenet se encuentra en esta ubicación de Cloud Storage:

gs://cloud-tpu-test-datasets/fake_imagenet

El conjunto de datos fake_imagenet solo es útil para comprender cómo usar una Cloud TPU y validar el rendimiento de extremo a extremo. Los números de exactitud y el modelo guardado no serán significativos.

Para obtener información sobre cómo descargar y procesar el conjunto de datos de ImageNet completo, consulta la página sobrecómo descargar, preprocesar y subir el conjunto de datos de ImageNet.

  1. Crea una Cloud TPU con el comando gcloud.

    $ gcloud compute tpus execution-groups create \
     --tpu-only \
     --accelerator-type=v3-8  \
     --name=resnet-rs-tutorial \
     --zone=europe-west4-a \
     --tf-version=2.12.0

    Descripciones de las marcas de comandos

    tpu-only
    Crea solo una TPU, no una VM.
    accelerator-type
    El tipo de Cloud TPU que se creará.
    name
    Es el nombre de la TPU que se creará.
    zone
    La zona en la que se crea la Cloud TPU.
    tf-version
    La versión de TensorFlow instalada en la VM.
  2. Establece la variable de nombre TPU_NAME.

    (vm)$ export TPU_NAME=resnet-rs-tutorial
    
  3. Ejecuta la secuencia de comandos de entrenamiento.

    (vm)$ python3 /usr/share/models/official/vision/beta/train.py \
    --experiment=resnet_rs_imagenet \
    --mode=train_and_eval \
    --model_dir=$MODEL_DIR \
    --tpu=$TPU_NAME \
    --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs50_i160.yaml \
    --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*, trainer.train_steps=100"
    

    Descripciones de las marcas de comandos

    experiment
    Es el nombre del experimento que se ejecutará.
    mode
    Es el modo en el que se ejecuta la secuencia de comandos. Los valores válidos son “train”, “eval” o “train_and_eval”.
    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.
    tpu
    Es el nombre de la TPU que se usará.
    config_file
    Es la ruta de acceso a un archivo de configuración de secuencia de comandos.
    params_override
    Anula la configuración establecida en el archivo de configuración de la secuencia de comandos.

Esto entrenará a ResNet-RS por 100 pasos de entrenamiento y se completará en un nodo TPU v3-8 en menos de 5 minutos. El resultado de la secuencia de comandos de entrenamiento debe incluir texto como el siguiente:

{
  'train_loss': 1.435225,
  'train_accuracy': 0.00084427913
}

La secuencia de comandos de entrenamiento también realiza la evaluación. El resultado de la evaluación debe contener texto como el siguiente:

Run stats:
{
  'eval_loss': 0.861013,
  'eval_acc': 0.001,
  'train_loss': 1.435225,
  'train_acc': 0.00084427913,
  'step_timestamp_log': [
    'BatchTimestamp<batch_index: 0,
    timestamp: 1606330585.7613473>',
    'BatchTimestamp<batch_index: 500,
    timestamp: 1606330883.8486104>',
    'BatchTimestamp<batch_index: 1000,
    timestamp: 1606331119.515312>',
    'BatchTimestamp<batch_index: 1251,
    timestamp: 1606331240.7516596>'
  ],
  'train_finish_time': 1606331296.395158,
  'avg_exp_per_second': 1951.6983246161021
}

Para entrenar el modelo ResNet-RS para la convergencia, omite el argumento trainer.train_steps=100 como se muestra en la siguiente secuencia de comandos. El entrenamiento y la evaluación se realizan juntos.

(vm)$ python3 /usr/share/models/official/vision/beta/train.py \
  --experiment=resnet_rs_imagenet \
  --mode=train_and_eval \
  --model_dir=$MODEL_DIR \
  --tpu=$TPU_NAME \
  --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs50_i160.yaml \
  --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*"

Descripciones de las marcas de comandos

experiment
Es el nombre del experimento que se ejecutará.
mode
Es el modo en el que se ejecuta la secuencia de comandos. Los valores válidos son "train", "eval" o "train_and_eval".
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.
tpu
Es el nombre de la TPU que se usará.
config_file
Es la ruta de acceso a un archivo de configuración de secuencia de comandos.
params_override
Anula la configuración establecida en el archivo de configuración de la secuencia de comandos.

Debido a que el entrenamiento y la evaluación se realizaron en el conjunto de datos fake_imagenet, los resultados de salida no reflejan el resultado real que aparecería si el entrenamiento y la evaluación se realizaran en un conjunto de datos real.

En este punto, puedes finalizar este instructivo y limpiar tus recursos de Google Cloud, o puedes explorar con más detalle cómo ejecutar el modelo en pods de Cloud TPU.

Usa modelos más grandes

ResNet-RS proporciona una familia de modelos de diferentes tamaños, con modelos más grandes que suelen ser más precisos a costa de un mayor procesamiento. Para obtener más información, consulta Revisión de ResNets: estrategias mejoradas de entrenamiento y escalamiento.

Para elegir el tamaño del modelo que quieres entrenar, cambia el archivo config_file en el siguiente comando.

(vm)$ python3 /usr/share/models/official/vision/beta/train.py \
  --experiment=resnet_rs_imagenet \
  --mode=train_and_eval \
  --model_dir=$MODEL_DIR \
  --tpu=$TPU_NAME \
  --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs200_i256.yaml \
  --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*"

Los parámetros de configuración disponibles están en /usr/share/models/official/vision/beta/configs/experiments/ en tu VM.

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.

Puedes obtener resultados más rápidos si escalas tu modelo con pods de Cloud TPU. El modelo ResNet-50, que es compatible en su totalidad, puede trabajar con las porciones de pod siguientes:

  • v2-32
  • v3-32

Con los pods de Cloud TPU, el entrenamiento y la evaluación se realizan juntos.

Entrena con pods de Cloud TPU

  1. Borra el recurso de Cloud TPU que creaste a fin de entrenar el modelo en un solo dispositivo.

    (vm)$ gcloud compute tpus execution-groups delete resnet-rs-tutorial \
      --zone=europe-west4-a \
      --tpu-only
  2. Crea un recurso de Cloud TPU nuevo para el pod mediante el parámetro accelerator-type a fin de especificar la porción de pod que deseas usar. Por ejemplo, en el siguiente comando, se usa una porción de Pod v3-32.

    (vm)$ gcloud compute tpus execution-groups  create --name=resnet-rs-tutorial \
      --accelerator-type=v3-32  \
      --zone=europe-west4-a \
      --tf-version=2.12.0 \
      --tpu-only
    

    Descripciones de las marcas de comandos

    name
    Es el nombre de la Cloud TPU que se creará.
    accelerator-type
    El tipo de Cloud TPU que se creará.
    zone
    La zona en la que planeas crear tu Cloud TPU.
    tf-version
    La versión gcloud de TensorFlow se instala en la VM.
    tpu-only
    Crea una Cloud TPU sola. De forma predeterminada, el comando gcloud crea una VM y una Cloud TPU.
  3. Ejecuta la secuencia de comandos de entrenamiento.

    (vm)$ python3 /usr/share/models/official/vision/beta/train.py \
    --experiment=resnet_rs_imagenet \
    --mode=train_and_eval \
    --model_dir=$MODEL_DIR \
    --tpu=$TPU_NAME \
    --config_file=/usr/share/models/official/vision/beta/configs/experiments/image_classification/imagenet_resnetrs50_i160.yaml \
    --params_override="task.train_data.input_path=$IMAGENET_DIR/train*, task.validation_data.input_path=$IMAGENET_DIR/valid*, trainer.train_steps=100"
    

    Descripciones de las marcas de comandos

    experiment
    Es el nombre del experimento que se ejecutará.
    mode
    Es el modo en el que se ejecuta la secuencia de comandos. Los valores válidos son "train", "eval" o "train_and_eval".
    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.
    tpu
    Es el nombre de la TPU que se usará.
    config_file
    Es la ruta de acceso a un archivo de configuración de secuencia de comandos.
    params_override
    Anula la configuración establecida en el archivo de configuración de la secuencia de comandos.

Esto entrenará a ResNet-RS por 100 pasos de entrenamiento y se completará en un nodo TPU v3-8 en menos de 5 minutos. El resultado de la secuencia de comandos de entrenamiento debe incluir texto como el siguiente:

{
  'train_loss': 1.435225,
  'train_accuracy': 0.00084427913
}

La secuencia de comandos de entrenamiento también realiza la evaluación. El resultado de la evaluación debe contener texto como el siguiente:

Run stats:
{
  'eval_loss': 0.861013,
  'eval_acc': 0.001,
  'train_loss': 1.435225,
  'train_acc': 0.00084427913,
  'step_timestamp_log': [
    'BatchTimestamp<batch_index: 0,
    timestamp: 1606330585.7613473>',
    'BatchTimestamp<batch_index: 500,
    timestamp: 1606330883.8486104>',
    'BatchTimestamp<batch_index: 1000,
    timestamp: 1606331119.515312>',
    'BatchTimestamp<batch_index: 1251,
    timestamp: 1606331240.7516596>'
  ],
  'train_finish_time': 1606331296.395158,
  'avg_exp_per_second': 1951.6983246161021
}

El entrenamiento y la evaluación se realizan juntos. Cada ciclo de entrenamiento tiene 1251 pasos, lo que da un total de 112,590 pasos de entrenamiento y 48 pasos de evaluación.

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. En Cloud Shell, usa el siguiente comando para borrar tu VM de Compute Engine y Cloud TPU:

    $ gcloud compute tpus execution-groups delete resnet-rs-tutorial \
      --zone=europe-west4-a
    
  3. Ejecuta gcloud compute tpus execution-groups list para verificar que los recursos se hayan borrado. La eliminación puede tardar varios minutos. Una respuesta como la que se muestra a continuación indica que tus instancias se borraron de forma correcta.

    $ gcloud compute tpus execution-groups list \
     --zone=europe-west4-a
    

    Deberías ver una lista vacía de TPU como la siguiente:

       NAME             STATUS
    
  4. Borra el bucket de Cloud Storage con gsutil como se muestra a continuación. Reemplaza bucket-name por el nombre de tu bucket de Cloud Storage.

    $ 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.