En este instructivo, se muestra cómo entrenar un modelo EfficientNet de Keras en Cloud TPU
usando tf.distribute.TPUStrategy
.
Si no estás familiarizado con Cloud TPU, te recomendamos revisa la guía de inicio rápido para aprender a crear un Cloud TPU y 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.
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.
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 dispositivo único de Cloud TPU
En esta sección, se describe cómo configurar los recursos de Cloud TPU y entrenar el modelo EfficientNet con un dispositivo único 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 quieres 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 almacenarás 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 te permite probar el instructivo y, al mismo tiempo, reducir los requisitos de almacenamiento y tiempo que se asocia típicamente con la ejecución de un modelo en la base de datos completa 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.Conectarse a la instancia de Compute Engine mediante 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=${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 creas tu TPU, si estableces el parámetro
--version
en una versión que termina en-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 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 necesarias:
(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. Se establece en el conjunto de datos fake_imagenet en este ejemplo.
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 anteriormente 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
- 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
.
Se entrenará EfficientNet durante 1 ciclo y se completará en la versión v3-8 de Cloud TPU en aproximadamente 40 minutos. Cuando la secuencia de comandos de entrenamiento se complete, aparecerá 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 EfficientNet hasta la convergencia en el conjunto de datos de ImageNet, ejecútalo para 90 ciclos de entrenamiento, como se muestra en la siguiente secuencia de comandos. Se completaron el entrenamiento y la evaluación. entre sí. Cada ciclo de entrenamiento 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
- 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. Se establece en el conjunto de datos fake_imagenet en este ejemplo.
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 anteriormente 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 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
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
- La zona en la que Cloud TPU su lugar de residencia.
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
Entrenar tu modelo en pods de Cloud TPU puede requerir algunos cambios al guion de entrenamiento. Para obtener más información, consulta Entrenamiento 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 quieres 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 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.
Conectarse a la instancia de Compute Engine mediante 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 que se especifica en la variable TPU_NAME.
data_dir
- especifica la ruta de Cloud Storage para la entrada de entrenamiento. Se establece en el conjunto de datos fake_imagenet en este ejemplo.
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 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 un total de 12 pasos de entrenamiento y 12 pasos de evaluación). Este entrenamiento dura alrededor de 2 minutos en una Cloud TPU v3-32. Cuando el entrenamiento y la evaluación se complete, aparecerá 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 debería incluir ninguno de los recursos 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 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 herramienta de conversión de conjuntos de datos muestra para convertir una imagen de clasificación de datos en formato TFRecord. Si no usas una imagen de clasificación de datos, tendrás que convertir tu conjunto de datos a Formato TFRecord tú mismo. 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 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.
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 el conversor de datos de clasificación de imágenes secuencia de comandos de ejemplo para convertir un conjunto de datos sin procesar para la clasificación de imágenes en Los modelos de TensorFlow para Cloud TPU pueden usar TFRecords.
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.