Entrena ResNet con Cloud TPU y GKE

En este instructivo, se explica cómo entrenar el modelo ResNet-50 de TensorFlow en Cloud TPU y GKE.

En resumen, este instructivo hace un recorrido por los siguientes pasos para ejecutar el modelo mediante un conjunto de datos falsos provisto con fines de prueba:

  • Crea un depósito de Cloud Storage para almacenar el resultado de tu modelo.
  • Crea un clúster de GKE a fin de administrar tus recursos de Cloud TPU.
  • Descarga una especificación de un trabajo de Kubernetes que describa los recursos necesarios para entrenar ResNet-50 con TensorFlow en Cloud TPU.
  • Ejecuta el trabajo en tu clúster de GKE para comenzar a entrenar el modelo.
  • Verifica los registros y el resultado del modelo.

Antes de comenzar

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. En la página de selección de proyectos de Cloud Console, selecciona o crea un proyecto de Cloud.

    Ir a la página Selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud. Obtén información sobre cómo confirmar que tienes habilitada la facturación para tu proyecto.

  4. Cuando usas Cloud TPU con GKE, tu proyecto usa componentes facturables de Google Cloud. Consulta los precios de Cloud TPU y los precios de GKE a fin de calcular los costos, y sigue las instrucciones para limpiar los recursos una vez que termines de usarlos.

  5. Habilita las siguientes API en Cloud Console:

Elige un shell y, si es necesario, instala tus herramientas de línea de comandos

Puedes usar Cloud Shell o tu shell local para completar este instructivo. Cloud Shell viene preinstalado con las herramientas de línea de comandos de gcloud y kubectl. gcloud es la interfaz de línea de comandos para Google Cloud, y kubectl proporciona la interfaz de línea de comandos destinada a ejecutar comandos en clústeres de Kubernetes.

Si prefieres usar tu shell local, debes instalar las herramientas de línea de comandos de gcloud y kubectl en tu entorno.

Cloud Shell

Para iniciar Cloud Shell, sigue estos pasos:

  1. Ve a Google Cloud Console.

  2. Haz clic en el botón Activar Cloud Shell en la esquina superior derecha de la consola.

Se abrirá una sesión de Cloud Shell dentro de un marco en la parte inferior de la consola. Usa este shell para ejecutar los comandos de gcloud y kubectl.

Shell local

Si deseas instalar gcloud y kubectl, sigue los siguientes pasos:

  1. Instala el SDK de Google Cloud, que incluye la herramienta de línea de comandos de gcloud.

  2. Para instalar la herramienta de línea de comandos de kubectl, ejecuta el siguiente comando:

    $ gcloud components install kubectl
  3. Instala los componentes de gcloud, que necesitas para ejecutar GKE con Cloud TPU.

    $ gcloud components install

Requisitos y limitaciones

Ten en cuenta la información que figura a continuación cuando definas la configuración:

  • Debes usar GKE versión 1.13.4-gke.5 o superior. Para especificar la versión, agrega el parámetro --cluster-version al comando gcloud container clusters create, como se describe a continuación. Para obtener más información, consulta la documentación de SDK.
  • Debes usar TensorFlow 1.13 o una versión posterior. Puedes especificar la versión de TensorFlow en la especificación de tu pod de Kubernetes como la configuración de resnet.
  • Debes crear el clúster de GKE y los grupos de nodos en una zona donde tu Cloud TPU esté disponible. También debes crear los depósitos de Cloud Storage para alojar tus datos y modelos de entrenamiento en la misma región donde hayas creado el clúster de GKE. Las siguientes zonas están disponibles:

    EE.UU.

    Tipo de TPU (v2) Núcleos de TPU v2 Memoria total de TPU Región o zona
    v2-8 8 64 GiB us-central1-b
    us-central1-c
    us-central1-f
    v2-32 32 256 GiB us-central1-a
    v2-128 128 1 TiB us-central1-a
    v2-256 256 2 TiB us-central1-a
    v2-512 512 4 TiB us-central1-a
    Tipo de TPU (v3) Núcleos de TPU v3 Memoria total de TPU Zonas disponibles
    v3-8 8 128 GiB us-central1-a
    us-central1-b
    us-central1-f

    Europa

    Tipo de TPU (v2) Núcleos de TPU v2 Memoria total de TPU Región o zona
    v2-8 8 64 GiB europe-west4-a
    v2-32 32 256 GiB europe-west4-a
    v2-128 128 1 TiB europe-west4-a
    v2-256 256 2 TiB europe-west4-a
    v2-512 512 4 TiB europe-west4-a
    Tipo de TPU (v3) Núcleos de TPU v3 Memoria total de TPU Zonas disponibles
    v3-8 8 128 GiB europe-west4-a
    v3-32 32 512 GiB europe-west4-a
    v3-64 64 1 TiB europe-west4-a
    v3-128 128 2 TiB europe-west4-a
    v3-256 256 4 TiB europe-west4-a
    v3-512 512 8 TiB europe-west4-a
    v3-1024 1,024 16 TiB europe-west4-a
    v3-2048 2,048 32 TiB europe-west4-a

    Asia-Pacífico

    Tipo de TPU (v2) Núcleos de TPU v2 Memoria total de TPU Región o zona
    v2-8 8 64 GiB asia-east1-c
  • Cada contenedor puede solicitar, como máximo, una Cloud TPU, pero varios contenedores de un pod pueden solicitar una Cloud TPU cada uno.
  • El escalador automático del clúster es compatible con Cloud TPU en GKE 1.11.4-gke.12 y posterior.

Configura tus datos y tu depósito de almacenamiento

Puedes usar un conjunto de datos falsos proporcionado con este instructivo o todos los datos de ImageNet para entrenar tu modelo. De cualquier manera, debes configurar un depósito de Cloud Storage como se describe a continuación.

Usa el conjunto de datos falsos o el conjunto de datos de ImageNet

En las instrucciones que aparecen a continuación, se supone que deseas usar un conjunto de datos falsos generado de forma aleatoria para poner a prueba este modelo. También puedes seguir las instrucciones para usar el conjunto de datos de ImageNet completo.

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

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

Ten en cuenta que el conjunto de datos falsos solamente sirve para comprender cómo utilizar Cloud TPU y validar el rendimiento de extremo a extremo. Los números de exactitud y el modelo guardado no serán significativos.

Crea un depósito de Cloud Storage

Necesitas un depósito de Cloud Storage para almacenar los resultados del entrenamiento del modelo de aprendizaje automático. Si decides usar datos de entrenamiento reales en vez del conjunto de datos falsos proporcionado en este instructivo, puedes almacenar los datos en el mismo depósito.

  1. Ve a la página de Cloud Storage en Cloud Console.

    Ir a la página de Cloud Storage

  2. Crea un depósito nuevo y especifica las siguientes opciones:

    • Un nombre único de tu elección
    • Clase de almacenamiento predeterminada: Standard
    • Ubicación: us-central1

    La ubicación del depósito debe estar en la misma región que el recurso TPU aprovisionado en el clúster de GKE.

Autoriza el acceso de Cloud TPU a tu depósito de Cloud Storage

Necesitas otorgar a Cloud TPU acceso de lectura y escritura a los objetos de Cloud Storage. Para hacerlo, debes otorgar el acceso requerido a la cuenta de servicio que usa la Cloud TPU. Sigue esta guía para otorgar acceso a tu depósito de almacenamiento.

Crea un clúster en GKE

Puedes crear un clúster de GKE en Cloud Console o usar la herramienta de línea de comandos de gcloud. Selecciona una opción a continuación para ver las instrucciones correspondientes:

Console

Sigue estas instrucciones para crear un clúster de GKE compatible con Cloud TPU:

  1. Ve a la página de GKE en Cloud Console.

    Ir a la página de GKE

  2. Haz clic en Crear clúster.

  3. En la página de clústeres de GKE, especifica un Nombre para tu clúster. El nombre debe ser único dentro del proyecto y la zona. Por ejemplo, tpu-models-cluster.

  4. Especifica la Zona en la que planeas usar un recurso de Cloud TPU. Por ejemplo, selecciona la zona us-central1-b.

    Cloud TPU está disponible en las siguientes zonas:

    EE.UU.

    Tipo de TPU (v2) Núcleos de TPU v2 Memoria total de TPU Región o zona
    v2-8 8 64 GiB us-central1-b
    us-central1-c
    us-central1-f
    v2-32 32 256 GiB us-central1-a
    v2-128 128 1 TiB us-central1-a
    v2-256 256 2 TiB us-central1-a
    v2-512 512 4 TiB us-central1-a
    Tipo de TPU (v3) Núcleos de TPU v3 Memoria total de TPU Zonas disponibles
    v3-8 8 128 GiB us-central1-a
    us-central1-b
    us-central1-f

    Europa

    Tipo de TPU (v2) Núcleos de TPU v2 Memoria total de TPU Región o zona
    v2-8 8 64 GiB europe-west4-a
    v2-32 32 256 GiB europe-west4-a
    v2-128 128 1 TiB europe-west4-a
    v2-256 256 2 TiB europe-west4-a
    v2-512 512 4 TiB europe-west4-a
    Tipo de TPU (v3) Núcleos de TPU v3 Memoria total de TPU Zonas disponibles
    v3-8 8 128 GiB europe-west4-a
    v3-32 32 512 GiB europe-west4-a
    v3-64 64 1 TiB europe-west4-a
    v3-128 128 2 TiB europe-west4-a
    v3-256 256 4 TiB europe-west4-a
    v3-512 512 8 TiB europe-west4-a
    v3-1024 1,024 16 TiB europe-west4-a
    v3-2048 2,048 32 TiB europe-west4-a

    Asia-Pacífico

    Tipo de TPU (v2) Núcleos de TPU v2 Memoria total de TPU Región o zona
    v2-8 8 64 GiB asia-east1-c
  5. Verifica que tienes suficientes cuotas asignadas a tu nodo de Cloud TPU en la zona que especificaste en el paso anterior.

  6. Asegúrate de que la Versión del clúster esté configurada como 1.13.4-gke.5 o posterior, a fin de que sea compatible con Cloud TPU.

  7. Desplázate hasta casi el final de la página y haz clic en Más opciones.

  8. Configura Niveles de acceso como Permitir acceso completo a todas las API de Cloud. Esto garantiza que todos los nodos del clúster tengan acceso a tu depósito de Cloud Storage. El clúster y el depósito de almacenamiento deben estar en el mismo proyecto para que esto funcione. Ten en cuenta que los pods heredan, de forma predeterminada, los alcances de los nodos en los que se implementan. Si quieres limitar el acceso según el pod, consulta la guía de GKE Autenticar Cloud Platform con cuentas de servicio.

  9. En la parte inferior de la página, haz clic en Disponibilidad, redes, seguridad y funciones adicionales. Se abrirá una ventana en la misma página.

  10. Habilita VPC nativas (con un alias de IP).

  11. Habilita Cloud TPU.

  12. Configura las opciones restantes para tu clúster según desees. Puedes dejarlas con los valores predeterminados.

  13. Haz clic en Crear.

  14. Conéctate al clúster. Para ello, selecciona tu clúster en la página de clústeres de Kubernetes en Console y haz clic en el botón CONECTAR. Esto muestra el comando de gcloud que debes ejecutar en un shell de Cloud para conectar kubectl a este clúster nuevo.

gcloud

Sigue las instrucciones a continuación para configurar tu entorno y crear un clúster de GKE compatible con Cloud TPU mediante la herramienta de línea de comandos de gcloud:

  1. Especifica tu proyecto de Google Cloud:

    $ gcloud config set project YOUR-CLOUD-PROJECT
    

    En el ejemplo de código anterior, YOUR-CLOUD-PROJECT es el nombre de tu proyecto de Google Cloud.

  2. Especifica la zona en la que planeas usar un recurso de Cloud TPU. En este ejemplo, usa la zona us-central1-b:

    $ gcloud config set compute/zone us-central1-b
    

    Cloud TPU está disponible en las siguientes zonas:

    EE.UU.

    Tipo de TPU (v2) Núcleos de TPU v2 Memoria total de TPU Región o zona
    v2-8 8 64 GiB us-central1-b
    us-central1-c
    us-central1-f
    v2-32 32 256 GiB us-central1-a
    v2-128 128 1 TiB us-central1-a
    v2-256 256 2 TiB us-central1-a
    v2-512 512 4 TiB us-central1-a
    Tipo de TPU (v3) Núcleos de TPU v3 Memoria total de TPU Zonas disponibles
    v3-8 8 128 GiB us-central1-a
    us-central1-b
    us-central1-f

    Europa

    Tipo de TPU (v2) Núcleos de TPU v2 Memoria total de TPU Región o zona
    v2-8 8 64 GiB europe-west4-a
    v2-32 32 256 GiB europe-west4-a
    v2-128 128 1 TiB europe-west4-a
    v2-256 256 2 TiB europe-west4-a
    v2-512 512 4 TiB europe-west4-a
    Tipo de TPU (v3) Núcleos de TPU v3 Memoria total de TPU Zonas disponibles
    v3-8 8 128 GiB europe-west4-a
    v3-32 32 512 GiB europe-west4-a
    v3-64 64 1 TiB europe-west4-a
    v3-128 128 2 TiB europe-west4-a
    v3-256 256 4 TiB europe-west4-a
    v3-512 512 8 TiB europe-west4-a
    v3-1024 1,024 16 TiB europe-west4-a
    v3-2048 2,048 32 TiB europe-west4-a

    Asia-Pacífico

    Tipo de TPU (v2) Núcleos de TPU v2 Memoria total de TPU Región o zona
    v2-8 8 64 GiB asia-east1-c
  3. Usa el comando gcloud container clusters para crear un clúster en GKE compatible con Cloud TPU. Ten en cuenta que el clúster de GKE y sus grupos de nodos se deben crear en una zona en la que Cloud TPU esté disponible, como se describe en la sección sobre variables de entorno de esta documentación. El siguiente comando crea un clúster llamado tpu-models-cluster:

    $ gcloud container clusters create tpu-models-cluster \
      --cluster-version=1.16 \
      --scopes=cloud-platform \
      --enable-ip-alias \
      --enable-tpu
    

    En el comando anterior:

    • --cluster-version=1.16 indica que el clúster usará la última versión de Kubernetes 1.16. Debes usar la versión 1.13.4-gke.5 o una posterior.
    • --scopes=cloud-platform garantiza que todos los nodos del clúster tengan acceso a tu depósito de Cloud Storage en Google Cloud definido anteriormente como YOUR-CLOUD-PROJECT. El clúster y el depósito de almacenamiento deben estar en el mismo proyecto para que esto funcione. Ten en cuenta que los pods heredan, de forma predeterminada, los alcances de los nodos en los que se implementan. Por lo tanto, --scopes=cloud-platform otorga a todos los pods que se ejecutan en el clúster el alcance de cloud-platform. Si quieres limitar el acceso según el pod, consulta la guía de GKE Autenticar Cloud Platform con cuentas de servicio.
    • --enable-ip-alias indica que el clúster usa rangos de IP de alias. Esto es necesario para usar Cloud TPU en GKE.
    • --enable-tpu indica que el clúster debe ser compatible con Cloud TPU.

      Cuando el comando termine de ejecutarse, aparecerá un mensaje de confirmación similar al siguiente:

      kubeconfig entry generated for tpu-models-cluster. NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS tpu-models-cluster us-central1-b 1.10.4-gke.2 35.232.204.86 n1-standard-2 1.10.4-gke.2 3 RUNNING

Ejecuta el modelo ResNet-50

Todo está listo para que ejecutes el modelo ResNet-50 con Cloud TPU y GKE.

  1. Crea una especificación de un trabajo en un archivo llamado resnet_k8s.yaml:

    • Descarga o copia la especificación del trabajo preparada desde GitHub.
    • En la especificación del trabajo, cambia <my-model-bucket> por el nombre del depósito de Cloud Storage que creaste antes.

    Ten en cuenta que la especificación del trabajo hace referencia a los modelos de TPU de TensorFlow que están disponibles en el contenedor de Docker en gcr.io/tensorflow/tpu-models. (Esa ruta corresponde a una ubicación en Container Registry).

  2. Crea un trabajo en el clúster de GKE:

    $ kubectl create -f resnet_k8s.yaml
    job "resnet-tpu" created
  3. Espera que el trabajo se programe.

    $ kubectl get pods -w
    
    NAME               READY     STATUS    RESTARTS   AGE
    resnet-tpu-cmvlf   0/1       Pending   0          1m
    

    La vida útil de los nodos de Cloud TPU está vinculada con los Pods que los solicitan. Cloud TPU se crea según demanda cuando se programa el Pod y se recicla cuando este se borra.

    El pod tarda cerca de 5 minutos en hacer la programación.

    Después de 5 minutos, deberías ver algo como lo siguiente:

    NAME               READY     STATUS    RESTARTS   AGE
    resnet-tpu-cmvlf   1/1       Running   0          6m
    
  4. Verifica los registros del pod para ver cómo está el trabajo:

    $ kubectl logs resnet-tpu-cmvlf

    También puedes verificar el resultado en el panel de cargas de trabajo de GKE en Cloud Console.

    Ten en cuenta que las entradas no aparecerán de inmediato en los registros. Es posible que veas algo similar a lo siguiente:

    I0622 18:14:31.617954 140178400511808 tf_logging.py:116] Calling model_fn.
    I0622 18:14:40.449557 140178400511808 tf_logging.py:116] Create CheckpointSaverHook.
    I0622 18:14:40.697138 140178400511808 tf_logging.py:116] Done calling model_fn.
    I0622 18:14:44.004508 140178400511808 tf_logging.py:116] TPU job name worker
    I0622 18:14:45.254548 140178400511808 tf_logging.py:116] Graph was finalized.
    I0622 18:14:48.346483 140178400511808 tf_logging.py:116] Running local_init_op.
    I0622 18:14:48.506665 140178400511808 tf_logging.py:116] Done running local_init_op.
    I0622 18:14:49.135080 140178400511808 tf_logging.py:116] Init TPU system
    I0622 18:15:00.188153 140178400511808 tf_logging.py:116] Start infeed thread controller
    I0622 18:15:00.188635 140177578452736 tf_logging.py:116] Starting infeed thread controller.
    I0622 18:15:00.188838 140178400511808 tf_logging.py:116] Start outfeed thread controller
    I0622 18:15:00.189151 140177570060032 tf_logging.py:116] Starting outfeed thread controller.
    I0622 18:15:07.316534 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed.
    I0622 18:15:07.316904 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed.
    I0622 18:16:13.881397 140178400511808 tf_logging.py:116] Saving checkpoints for 100 into gs://<my-model-bucket>/resnet/model.ckpt.
    I0622 18:16:21.147114 140178400511808 tf_logging.py:116] loss = 1.589756, step = 0
    I0622 18:16:21.148168 140178400511808 tf_logging.py:116] loss = 1.589756, step = 0
    I0622 18:16:21.150870 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed.
    I0622 18:16:21.151168 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed.
    I0622 18:17:00.739207 140178400511808 tf_logging.py:116] Enqueue next (100) batch(es) of data to infeed.
    I0622 18:17:00.739809 140178400511808 tf_logging.py:116] Dequeue next (100) batch(es) of data from outfeed.
    I0622 18:17:36.598773 140178400511808 tf_logging.py:116] global_step/sec: 2.65061
    I0622 18:17:37.040504 140178400511808 tf_logging.py:116] examples/sec: 2698.56
    I0622 18:17:37.041333 140178400511808 tf_logging.py:116] loss = 2.63023, step = 200 (75.893 sec)
    
  5. Para ver el modelo entrenado, ingresa a gs://<my-model-bucket>/resnet/model.ckpt. Puedes ver tus depósitos en la página del navegador de Cloud Storage en Cloud Console.

Limpia

Cuando termines con Cloud TPU en GKE, limpia los recursos para evitar generar cargos adicionales en tu cuenta de Google Cloud.

Console

Borra tu clúster de GKE:

  1. Ve a la página de GKE en Cloud Console.

    Ir a la página de GKE

  2. Selecciona la casilla de verificación junto al clúster que deseas borrar.

  3. Haz clic en Borrar.

Una vez que hayas terminado de examinar los datos, borra el depósito de Cloud Storage que creaste durante este instructivo:

  1. Ve a la página de Cloud Storage en Cloud Console.

    Ir a la página de Cloud Storage

  2. Selecciona la casilla de verificación ubicada junto al depósito que deseas borrar.

  3. Haz clic en Borrar.

Consulta la guía de precios de Cloud Storage para obtener los límites de almacenamiento gratuito y otra información sobre precios.

gcloud

Si todavía no configuraste el proyecto y la zona para esta sesión, hazlo ahora. Consulta las instrucciones antes presentadas en esta guía. Luego, sigue este procedimiento de limpieza:

  1. Ejecuta el siguiente comando para borrar tu clúster de GKE, tpu-models-cluster, y reemplazar YOUR-PROJECT por el nombre de tu proyecto de Google Cloud:

    $ gcloud container clusters delete tpu-models-cluster --project=YOUR-PROJECT
    
  2. Cuando termines de examinar los datos, usa el comando de gsutil para borrar el depósito de Cloud Storage que creaste durante este instructivo. Reemplaza YOUR-BUCKET por el nombre del depósito de Cloud Storage.

    $ gsutil rm -r gs://YOUR-BUCKET
    

    Consulta la guía de precios de Cloud Storage para obtener los límites de almacenamiento gratuito y otra información sobre precios.

Qué sigue