En este instructivo, se muestra cómo entrenar un modelo EfficientNet de Keras en Cloud TPU con tf.distribute.TPUStrategy
.
Si no estás familiarizado con Cloud TPU, te recomendamos que revises la guía de inicio rápido para obtener información sobre cómo crear una Cloud 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.
Antes de comenzar
Antes de comenzar este instructivo, verifica que tu proyecto de Google Cloud esté configurado correctamente.
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
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 de VM de TPU que crees cuando los hayas terminado para evitar cargos innecesarios.
Entrenamiento de un solo dispositivo de Cloud TPU
En esta sección, se describe cómo configurar los recursos de Cloud TPU y entrenar el modelo de EfficientNet con un solo dispositivo de Cloud TPU.
Abre una ventana de Cloud Shell.
Crea una variable para el ID de tu proyecto.
export PROJECT_ID=project-id
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 enAuthorize
en la parte inferior. de la página para permitir quegcloud
realice llamadas a la API con tus credenciales.Para obtener más información sobre el comando de
gcloud
, consulta la Referencia de gcloud.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
Exporta variables de configuración de TPU
Establece la zona en la que entrenarás el modelo y almacena los datos relacionados con el entrenamiento.
$ export ZONE=europe-west4-a
Crea un bucket de Cloud Storage con el siguiente comando:
gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=europe-west4
Este bucket de Cloud Storage almacena los datos que usas para entrenar tu modelo y los resultados del entrenamiento. Usas el comando gcloud compute tpus tpu-vm a fin de establecer permisos predeterminados para la cuenta de servicio de Cloud TPU que configuraste en el paso anterior. Si quieres permisos más detallados, revisa el 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.
Prepara tu conjunto de datos o usa fake_imagenet
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. La precisión los números y el modelo guardado no serán significativos.
Si deseas usar el conjunto de datos de ImageNet completo, consulta Descarga, preprocesa y sube el conjunto de datos de ImageNet.
Inicia los recursos de TPU con el comando de
gcloud
.$ gcloud compute tpus tpu-vm create efficientnet-tutorial \ --zone=${ZONE} \ --accelerator-type=v3-8 \ --version=tpu-vm-tf-2.17.0-pjrt
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.
Para obtener más información sobre el comando de
gcloud
, consulta la Referencia de gcloud.Conéctate a la instancia de Compute Engine con SSH. Cuando te conectes a la VM, el indicador de shell cambiará de
username@projectname
ausername@vm-name
:gcloud compute tpus tpu-vm ssh efficientnet-tutorial --zone=${ZONE}
Configura la variable de nombre de Cloud TPU.
(vm)$ export TPU_NAME=local
Configura las variables de bucket de Cloud Storage
Reemplaza el bucket-name por el nombre de tu bucket de Cloud Storage:
(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export MODEL_DIR=${STORAGE_BUCKET}/efficientnet-2x (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet
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.
Cuando crees tu TPU, si configuras el parámetro
--version
en una versión que finaliza con-pjrt
, establece 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
Instala los requisitos de TensorFlow.
(vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
La secuencia de comandos de entrenamiento de EfficientNet requiere paquetes adicionales. Instálalos ahora:
(vm)$ sudo pip3 install tensorflow-addons (vm)$ sudo pip3 install tensorflow-model-optimization>=0.1.3
Configura algunas variables de entorno obligatorias:
(vm)$ export PYTHONPATH="${PYTHONPATH}:/usr/share/tpu/models"
El modelo EfficientNet está preinstalado en tu VM de Cloud TPU.
Ve al directorio en el que se almacena el modelo:
(vm)$ cd /usr/share/tpu/models/official/legacy/image_classification
Entrena el modelo. Esto usa un conjunto de datos fake_imagenet y entrena EfficientNet durante un ciclo de entrenamiento.
(vm)$ python3 classifier_trainer.py \ --mode=train_and_eval \ --model_type=efficientnet \ --dataset=imagenet \ --tpu=${TPU_NAME} \ --data_dir=${DATA_DIR} \ --model_dir=${MODEL_DIR} \ --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \ --params_override="train.epochs=1, train_dataset.builder=records, validation_dataset.builder=records"
Descripciones de las marcas de comandos
mode
- Una de
train
,eval
, otrain_and_eval
. model_type
- El tipo de modelo. Por ejemplo,
efficientnet
dataset
- : El nombre del conjunto de datos. Por ejemplo,
imagenet
tpu
- El nombre de Cloud TPU para ejecutar el entrenamiento o la evaluación.
data_dir
- especifica la ruta de Cloud Storage para la entrada de entrenamiento. En este ejemplo, se establece como el conjunto de datos fake_imagenet.
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 previamente y almacenar puntos de control adicionales como siempre que los puntos de control anteriores se hayan creado con una Cloud TPU del mismo tamaño y con la misma versión de TensorFlow.
config_file
- La ruta de acceso al archivo JSON que contiene el modelo de EfficientNet previamente entrenado. Este archivo contiene la arquitectura del modelo.
params_override
- Una string JSON que anula parámetros de secuencia de comandos predeterminados. Para obtener más información sobre los parámetros de secuencias de comandos, consulta
/usr/share/models/official/legacy/detection/main.py
.
Se entrenará EfficientNet durante 1 época y se completará en un nodo v3-8 de Cloud TPU en aproximadamente 40 minutos. Cuando se completa la secuencia de comandos de entrenamiento, aparece un resultado similar al siguiente:
Run stats: { 'accuracy_top_1': 0.0010172526817768812, 'eval_loss': 7.104171276092529, 'loss': 7.113735675811768, 'training_accuracy_top_1': 0.0009773431811481714, 'step_timestamp_log': [ 'BatchTimestamp<batch_index: 0, timestamp: 1604960724.2224622>', 'BatchTimestamp<batch_index: 1251, timestamp: 1604961281.3745298>' ], 'train_finish_time': 1604961342.6359076, 'avg_exp_per_second': 2071.493269569079 }
Para entrenar a EfficientNet hasta la convergencia en el conjunto de datos de ImageNet, ejecútalo durante 90 épocas, como se muestra en la siguiente secuencia de comandos. El entrenamiento y la evaluación se realizan juntos. Cada época tiene 1,251 pasos para un total de 112,590 pasos de entrenamiento y 48 pasos de evaluación.
(vm)$ python3 classifier_trainer.py \ --mode=train_and_eval \ --model_type=efficientnet \ --dataset=imagenet \ --tpu=${TPU_NAME} \ --data_dir=${DATA_DIR} \ --model_dir=${MODEL_DIR} \ --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \ --params_override="train_dataset.builder=records, validation_dataset.builder=records"
Descripciones de las marcas de comandos
mode
- Uno de
train
,eval
otrain_and_eval
model_type
- Es el tipo de modelo. Por ejemplo,
efficientnet
dataset
- : El nombre del conjunto de datos. Por ejemplo,
imagenet
tpu
- El nombre de Cloud TPU para ejecutar el entrenamiento o la evaluación.
data_dir
- especifica la ruta de Cloud Storage para la entrada de entrenamiento. En este ejemplo, se establece como el conjunto de datos fake_imagenet.
model_dir
- La ruta de Cloud Storage en la que se almacenan los puntos de control y los resúmenes durante el entrenamiento de modelos. Puedes reutilizar una carpeta existente para cargar puntos de control generados previamente y almacenar puntos de control adicionales como siempre que los puntos de control anteriores se hayan creado con una Cloud TPU del mismo tamaño y con la misma versión de TensorFlow.
config_file
- La ruta de acceso al archivo JSON que contiene el modelo de EfficientNet previamente entrenado. Este archivo contiene la arquitectura del modelo.
params_override
- Una string JSON que anula parámetros de secuencia de comandos predeterminados. Para ver más
sobre los parámetros de secuencias de comandos, consulta
/usr/share/models/official/legacy/detection/main.py
Dado que el entrenamiento se realizó en el conjunto de datos fake_imagenet, el resultado Los resultados no reflejan el resultado real que aparecería si el entrenamiento que se realizan con un conjunto de datos real.
Completaste el entrenamiento en un solo dispositivo. Sigue estos pasos para borrar los recursos actuales de TPU de un solo dispositivo.
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.Borra el recurso TPU.
$ gcloud compute tpus tpu-vm delete efficientnet-tutorial \ --zone=${ZONE}
Descripciones de las marcas de comandos
zone
- Es la zona en la que reside 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
Es posible que entrenar tu modelo en pods de Cloud TPU requiera algunos cambios en tu secuencia de comandos de entrenamiento. Para obtener información, consulta Entrena en pods de TPU.
Entrenamiento de pods de Cloud TPU
En esta sección, se proporciona información sobre cómo configurar un bucket de Cloud Storage y recursos de Cloud TPU para el entrenamiento de pods.
Abre una ventana de Cloud Shell.
Crea una variable para el ID de tu proyecto.
export PROJECT_ID=project-id
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 enAuthorize
en la parte inferior de la página para permitir quegcloud
realice llamadas a la API de Google Cloud con tus credenciales.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
Crea un bucket de Cloud Storage mediante el siguiente comando o usa un bucket que hayas creado antes para tu proyecto:
gcloud storage buckets create gs://bucket-name --project=${PROJECT_ID} --location=europe-west4
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.La ubicación del bucket debe estar en la misma región que tu VM de TPU.
Exporta las variables de configuración de TPU
Establece la zona en la que entrenarás el modelo y almacenarás los datos de datos no estructurados.
$ export ZONE=europe-west4-a
Prepare your dataset or use fake_imagenet
ImageNet is an image database. The images in the database are organized into a hierarchy, with each node of the hierarchy depicted by hundreds and thousands of images.
The default Pod training accesses a demonstration version of the full ImageNet dataset, referred to as fake_imagenet. This demonstration version allows you to test Pod training, while reducing the storage and time requirements typically associated with training a model against the full ImageNet database.
The fake_imagenet dataset is only useful for understanding how to use a Cloud TPU and validating end-to-end performance. The accuracy numbers and saved model will not be meaningful.
If you want to use the full ImageNet dataset, see Downloading, preprocessing, and uploading the ImageNet dataset.
Launch your Cloud TPU resources using the
gcloud
command.For more information on the
gcloud
command, see the gcloud Reference. This tutorial specifies a v3-32 Pod. For other Pod options, see the available TPU types page.This tutorial specifies a v3-32 Pod. For other Pod options, see the available TPU types page.
$ gcloud compute tpus tpu-vm create efficientnet-tutorial \ --zone=${ZONE} \ --accelerator-type=v3-32 \ --version=tpu-vm-tf-2.17.0-pod-pjrt
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.
Conéctate a la instancia de Compute Engine con SSH. Cuando estés conectado a la VM, el símbolo del sistema de shell cambia de
username@projectname
ausername@vm-name
:gcloud compute tpus tpu-vm ssh efficientnet-tutorial --zone=europe-west4-a
Exporta las variables de configuración de TPU:
(vm)$ export STORAGE_BUCKET=gs://bucket-name
(vm)$ export TPU_NAME=efficientnet-tutorial (vm)$ export DATA_DIR=gs://cloud-tpu-test-datasets/fake_imagenet (vm)$ export MODEL_DIR=${STORAGE_BUCKET}/efficientnet-2x-pod
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.
Instala los requisitos de TensorFlow.
(vm)$ pip3 install -r /usr/share/tpu/models/official/requirements.txt
Configura algunas variables de entorno necesarias:
(vm)$ export PYTHONPATH="/usr/share/tpu/models:${PYTHONPATH}" (vm)$ export TPU_LOAD_LIBRARY=0
Ve al directorio en el que se almacena el modelo:
(vm)$ cd /usr/share/tpu/models/official/legacy/image_classification/
Entrena el modelo.
(vm)$ python3 classifier_trainer.py \ --mode=train_and_eval \ --model_type=efficientnet \ --dataset=imagenet \ --tpu=${TPU_NAME} \ --data_dir=${DATA_DIR} \ --model_dir=${MODEL_DIR} \ --config_file=configs/examples/efficientnet/imagenet/efficientnet-b0-tpu.yaml \ --params_override="train.epochs=1, train_dataset.builder=records, validation_dataset.builder=records"
Descripciones de las marcas de comandos
mode
- Cuando se establece en
train_and_eval
, esta secuencia de comandos entrena y evalúa el modelo. Cuando se establece enexport_only
, esta secuencia de comandos exporta un modelo guardado. model_type
- El tipo de modelo. Por ejemplo,
efficientnet
dataset
- : El nombre del conjunto de datos. Por ejemplo,
imagenet
tpu
- Usa el nombre especificado en la variable TPU_NAME.
data_dir
- especifica la ruta de Cloud Storage para la entrada de entrenamiento. En este ejemplo, se establece como el conjunto de datos fake_imagenet.
model_dir
- La ruta de Cloud Storage en la que se almacenan los puntos de control y los resúmenes durante el entrenamiento de modelos. Puedes volver a usar una carpeta existente para cargarla anteriormente puntos de control generados y almacenar puntos de control adicionales siempre que el puntos de control anteriores se crearon con una Cloud TPU de la del mismo tamaño y con una versión de TensorFlow.
config_file
- Es la ruta de acceso al archivo json que contiene el recurso EfficientNet previamente entrenado un modelo de responsabilidad compartida. Este archivo contiene la arquitectura del modelo.
params_override
- Una string JSON que anula parámetros de secuencia de comandos predeterminados. Para ver más
información sobre los parámetros de secuencia de comandos, consulta
/usr/share/models/official/legacy/detection/main.py
.
El procedimiento entrena el modelo en el conjunto de datos fake_imagenet en 1 ciclo de entrenamiento (312 pasos de entrenamiento en total y 12 pasos de evaluación). Este entrenamiento tarda alrededor de 2 minutos en una Cloud TPU v3-32. Cuando se completan el entrenamiento y la evaluación, aparece un mensaje similar al siguiente:
Run stats:
{
'accuracy_top_1': 0.0009969075908884406,
'eval_loss': 7.105168342590332,
'loss': 7.114983081817627,
'training_accuracy_top_1': 0.0010031675919890404,
'step_timestamp_log': [
'BatchTimestamp<batch_index: 0,
timestamp: 1605041621.4997303>',
'BatchTimestamp<batch_index: 312,
timestamp: 1605041970.8633356>'
],
'train_finish_time': 1605042032.2274444,
'avg_exp_per_second': 3111.5120716536226
}
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.
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.Borra tus recursos de Cloud TPU y Compute Engine.
$ gcloud compute tpus tpu-vm delete efficientnet-tutorial \ --zone=${ZONE}
Ejecuta
gcloud compute tpus execution-groups 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 de TPU creados en este instructivo:$ gcloud compute tpus execution-groups list --zone=${ZONE}
Borra el bucket de Cloud Storage con gcloud CLI como se muestra a continuación 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 esta capacitación no se pueden usar para la inferencia. Para usar un modelo de inferencia, puedes entrenar los datos en un conjunto de datos disponible públicamente o en tu propio conjunto de datos. Por lo general, los modelos de TensorFlow entrenados en Cloud TPU requieren que los conjuntos de datos tengan el 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 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 la hiperparámetros. Puedes encontrar información sobre hiperparámetros comunes para 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 la herramienta del convertidor de inferencia 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 la Introducción a la inferencia de Cloud TPU v5e.
Obtén información sobre cómo entrenar y evaluar mediante tus propios datos en lugar de los conjuntos de datos fake_imagenet o ImageNet mediante el instructivo de conversión del conjunto de datos. En el instructivo, se explica cómo usar la secuencia de comandos de ejemplo del convertidor de datos de clasificación de imágenes para convertir un conjunto de datos sin procesar para la clasificación de imágenes en TFRecords que pueden usar los modelos de TensorFlow de Cloud TPU.
Ejecuta un colab de Cloud TPU que muestre cómo ejecutar un modelo de clasificación de imágenes con tus propios datos de imagen.
Explora los otros instructivos de Cloud TPU.
Aprende a usar las herramientas de supervisión de TPU en TensorBoard.