Se usó la API de Cloud Translation para traducir esta página.
Switch to English

Entrena ResNet en Cloud TPU con GKE

Objetivos

En este instructivo, se enseña a entrenar el modelo ResNet-50 de TensorFlow en Cloud TPU y GKE.

En este instructivo, se explican los pasos para entrenar el modelo mediante un conjunto de datos falsos provisto con fines de prueba:

  • Crea un bucket 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.

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. Consulta más información acerca de la versión en la documentación del SDK.
  • Debes usar TensorFlow 1.15.3 o una versión posterior. Debes especificar la versión de TensorFlow que usa tu Cloud TPU en las especificaciones de tu pod de Kubernetes, como se describe a continuación.
  • 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 modelos y datos de entrenamiento en la misma región que el clúster de GKE. En este instructivo, se usa la zona us-central1-b.
  • Cada contenedor puede solicitar, como máximo, una Cloud TPU. Sin embargo, 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.
  • Tu clúster debe ser un clúster nativo de la VPC.

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 del selector de proyectos de Google Cloud Console, selecciona o crea un proyecto de Google Cloud.

    Ir a la página del selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Cloud. Descubre cómo confirmar que tienes habilitada la facturación en un 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:

Cree una cuenta de servicio y un depósito de Cloud Storage

Necesitas un bucket de Cloud Storage para almacenar los resultados del entrenamiento del modelo de aprendizaje automático.

  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. 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
    
  4. Ve a la página de Cloud Storage en Cloud Console.

    Ve a la página de Cloud Storage

  5. Crea un bucket nuevo y especifica las siguientes opciones:

    • Un nombre único de tu elección
    • Tipo de ubicación: region
    • Ubicación: us-central1
    • Clase de almacenamiento predeterminada: Standard
    • Control de acceso: fine-grained

    Antes de usar el depósito de almacenamiento, debes autorizar el acceso de la cuenta de servicio de Cloud TPU al depósito. Usa el vínculo Control de acceso que se muestra arriba para establecer LCA detalladas para tu cuenta de servicio de Cloud TPU.

Crea un clúster de GKE compatible con Cloud TPU

Puedes habilitar la asistencia de Cloud TPU en un clúster GKE nuevo.

Crea un clúster nuevo compatible con Cloud TPU

Puedes crear un clúster compatible con Cloud TPU mediante Cloud Console o la herramienta 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. Especifica un Nombre para tu clúster. El nombre debe ser único dentro del proyecto y la zona.

  4. En Tipo de ubicación, selecciona zonal y, luego, la zona deseada en la que planeas usar un recurso de Cloud TPU. Para este instructivo, selecciona la zona us-central1-b.

  5. Asegúrate de que la Versión principal esté configurada como 1.13.4-gke.5 o una versión posterior a fin de que sea compatible con Cloud TPU.

  6. En el panel de navegación, debajo del grupo de nodos que deseas configurar, haz clic en Seguridad.

  7. Selecciona Permitir el acceso total a todas las API de Cloud. Esto garantiza que todos los nodos del clúster tengan acceso a tu bucket de Cloud Storage. El clúster y el bucket 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 deseas limitar el acceso según el pod, consulta la guía de GKE para autenticar con cuentas de servicio.

  8. En el panel de navegación, en Clúster, haz clic en Herramientas de redes.

  9. Selecciona Habilitar el enrutamiento de tráfico nativo de VPC (usa IP de alias), debes crear una red de VPC si no existe una para el proyecto actual.

  10. En el panel de navegación, en Clúster, haz clic en Funciones.

  11. Selecciona Habilitar Cloud TPU.

  12. Configura las opciones restantes para tu clúster según desees. Puedes dejar las opciones en sus valores predeterminados.

  13. Haga 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. Se mostrará el comando de gcloud a fin de que se ejecute en Cloud Shell para la conexión.

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. Instala los componentes de gcloud necesarios para ejecutar GKE con Cloud TPU:

    $ gcloud components install kubectl 
  2. Reemplaza gcloud por tu ID del proyecto de Google Cloud.

    $ gcloud config set project project-name
    

    Reemplaza project-name por el nombre del proyecto de Google Cloud.

    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 GCP con tus credenciales.

  3. Configura gcloud con la zona en la que planeas usar un recurso de Cloud TPU. Para este instructivo, usa la zona us-central1-b:

    $ gcloud config set compute/zone us-central1-b
    
  4. Usa el comando gcloud container clusters create para crear un clúster en GKE compatible con Cloud TPU. En el siguiente comando, reemplaza cluster-name por el nombre de clúster que desees:

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

    Descripciones de las marcas de comandos

    Versión del clúster
    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
    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 de Kubernetes 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 de Kubernetes que se ejecutan en el clúster el alcance de cloud-platform. Si deseas limitar el acceso según el pod, consulta la guía de GKE para autenticar 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.
    tpu-ipv4-cidr (opcional, no especificado anteriormente)
    Indica el rango CIDR que se usará para Cloud TPU. Especifica el IP_RANGE con el formato IP/20, como 10.100.0.0/20. Si no especificas esta marca, se asignará de forma automática un rango CIDR de tamaño /20.

    Cuando se crea el clúster, deberías ver un mensaje similar al siguiente:

    NAME             LOCATION       MASTER_VERSION    MASTER_IP     MACHINE_TYPE   NODE_VERSION      NUM_NODES  STATUS
    cluster-resnet  us-central1-b  1.16.15-gke.4901  34.71.245.25  n1-standard-1  1.16.15-gke.4901  3          RUNNING
    

Visualizar operaciones

Habilitar la compatibilidad con Cloud TPU inicia una operación de actualización. En cuanto a los clústeres zonales, esta operación tarda alrededor de 5 minutos, y para los clústeres regionales, esta operación tarda alrededor de 15 minutos, según la región del clúster.

Para obtener una lista de cada operación en ejecución o completada en tu clúster, ejecuta el siguiente comando:

   $ gcloud container operations list
   

Para obtener más información sobre una operación en particular, ejecuta el siguiente comando:

   $ gcloud container operations describe operation-id
   

Reemplaza operation-id por el ID de la operación específica.

especificaciones del trabajo de GKE y ResNet

Las especificaciones de trabajo que se usan en este instructivo (que se muestran a continuación) solicitan un dispositivo de Cloud TPU v2 interrumpible con TensorFlow 2.3. También inicia un proceso de proceso de TensorBoard.

La vida útil de los nodos de Cloud TPU está vinculada a los pods que los solicitan. Cloud TPU se crea a demanda cuando se programa el pod y se recicla cuando este se borra.

apiVersion: batch/v1
kind: Job
metadata:
  name: resnet-tpu
spec:
  template:
    metadata:
      annotations:
        # The Cloud TPUs that will be created for this Job will support
        # TensorFlow 2.3. This version MUST match the
        # TensorFlow version that your model is built on.
        tf-version.cloud-tpus.google.com: "2.3"
    spec:
      restartPolicy: Never
      containers:
      - name: resnet-tpu
        # The official TensorFlow 2.3.0 image.
        # https://hub.docker.com/r/tensorflow/tensorflow
        image: tensorflow/tensorflow:2.3.0
        command:
        - bash
        - -c
        - |
          pip install tf-models-official==2.3.0
          python3 -m official.vision.image_classification.resnet.resnet_ctl_imagenet_main \
            --tpu=$(KUBE_GOOGLE_CLOUD_TPU_ENDPOINTS) \
            --distribution_strategy=tpu \
            --steps_per_loop=500 \
            --log_steps=500 \
            --use_synthetic_data=true \
            --dtype=fp32 \
            --enable_tensorboard=true \
            --train_epochs=90 \
            --epochs_between_evals=1 \
            --batch_size=1024 \
            --model_dir=gs://bucket-name/resnet
        resources:
          limits:
            # Request a single Preemptible v2-8 Cloud TPU device to train the
            # model. A single v2-8 Cloud TPU device consists of 4 chips, each of
            # which has 2 cores, so there are 8 cores in total.
            cloud-tpus.google.com/preemptible-v2: 8
      - name: tensorboard
        image: tensorflow/tensorflow:2.2.0
        command:
        - bash
        - -c
        - |
          pip install tensorboard-plugin-profile==2.3.0 cloud-tpu-client
          tensorboard --logdir=gs://bucket-name/resnet --port=6006
        ports:
        - containerPort: 6006

Crea el trabajo

Sigue estos pasos para crear el trabajo en el clúster de GKE:

  1. Con un editor de texto, crea una especificación de trabajo, example-job.yaml, y copia y pega en la especificación del trabajo que se muestra arriba. Asegúrate de reemplazar la variable bucket-name en el parámetro --model_dir y en el comando Tensorboard con el nombre de tu depósito de almacenamiento.

  2. Ejecuta el trabajo:

    $ kubectl create -f example-job.yaml
    

    Este comando crea el trabajo que programa el pod de forma automática y debe mostrar el siguiente resultado.

    job "resnet-tpu" created
  3. Verifica la programación del pod y el aprovisionamiento de los nodos Cloud TPU. Un pod que solicita nodos de Cloud TPU puede permanecer pendiente durante 5 minutos antes de ejecutarse. Verás un resultado similar al siguiente hasta que se programe el pod.

    $ kubectl get pods -w
    
    Debería mostrarse un resultado inicial:
    
    NAME               READY     STATUS    RESTARTS   AGE
    resnet-tpu-cmvlf   0/1       Pending   0          1m
    

    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. Cuando STATUS muestra running, se inició el entrenamiento. Escribe CTRL-C para salir del proceso kubectl get pods -w.

Ver los registros y el estado del contenedor de Cloud TPU y TensorBoard

Sigue estos pasos para verificar el estado y ver los registros de las instancias de Cloud TPU y TensorBoard que usan tus pods de Kubernetes.

  1. Crea las especificaciones de la implementación y el servicio con los siguientes pasos:

    Ir a la página de GKE

  2. En la barra de navegación de la izquierda, haga clic en Cargas de trabajo.

  3. Selecciona tu trabajo. Esto te lleva a una página que incluye un encabezado Pods administrados.

  4. En Pods administrados, selecciona tu pod de Kubernetes. Esto lo llevará a una página que incluye un encabezado Contenedores.

  5. En Contenedores, se muestra una lista de contenedores. La lista incluye todas las instancias de Cloud TPU y TensorBoard. Para cada contenedor, se muestra la siguiente información:

    1. El estado de ejecución
    2. Vínculo a los registros de contenedores

Usa TensorBoard para ver métricas y analizar el rendimiento

TensorBoard es un conjunto de herramientas diseñadas para presentar los datos de TensorFlow de forma visual. TensorBoard puede servir para identificar cuellos de botella en el procesamiento y sugerir formas de mejorar el rendimiento.

TensorFlow Profiler es un complemento de TensorBoard con el que puedes capturar un perfil de una Cloud TPU individual o un pod de Cloud TPU y verlo en TensorBoard. Consulta la documentación sobre las herramientas de TPU para obtener detalles sobre las herramientas de visualización y qué información se puede capturar.

Sigue estos pasos para ejecutar TensorBoard en el clúster de GKE:

  1. Sigue los pasos para visualizar el estado de TensorBoard a fin de verificar que la instancia de TensorBoard se ejecute en un contenedor.

  2. Reenvíe el proxy al pod de Kubernetes de TensorBoard:

    $ kubectl port-forward pod/resnet-tpu-pod-id 6006
    

    donde pod-id es el último conjunto de dígitos del nombre del pod de GKE que se muestra en Console: Kubernetes Engine > Cargas de trabajo > Pods administrados. Por ejemplo: resnet-tpu-wxskc.

  3. En la parte superior derecha de la barra de Cloud Shell, haz clic en el botón Vista previa de la Web y abre el puerto 6006 para ver el resultado de TensorBoard. La IU de TensorBoard aparecerá como una pestaña en el navegador.

  4. Selecciona PROFILE en el menú desplegable en la parte superior derecha de la página de TensorBoard.

  5. Haz clic en el botón CAPTURAR PERFIL en la página PERFIL.

  6. En el menú emergente, selecciona el tipo de dirección del nombre de TPU y, luego, ingresa el nombre de TPU. El nombre del TPU aparece en Cloud Console en la página Compute Engine > TPU con el formato siguiente:

    gke-cluster-name-cluster-id-tpu-tpu-id
    
    Por ejemplo:
    gke-demo-cluster-25cee208-tpu-4b90f4c5

  7. Selecciona el botón CAPTURE en el menú emergente cuando estés listo para comenzar a generar el perfil y espera unos segundos para que se complete el perfil.

  8. Actualiza el navegador para ver los datos de seguimiento en la pestaña Perfil de TensorBoard.

Para obtener más información sobre cómo capturar y, además, interpretar perfiles, consulta la guía de generación de perfiles de TensorFlow.

Limpia

Una vez que termines con Cloud TPU en GKE, limpia los recursos a fin de evitar que se apliquen cargos adicionales a la cuenta de facturación.

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 bucket de Cloud Storage que creaste durante este instructivo:

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

    Ve a la página de Cloud Storage

  2. Selecciona la casilla de verificación ubicada junto al bucket 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

  1. Ejecuta el siguiente comando para borrar tu clúster de GKE y reemplazar cluster-name por el nombre de tu clúster y project-name por el nombre de tu proyecto de Google Cloud:

    $ gcloud container clusters delete cluster-name --zone=us-central1-b --project=project-name
    

    Este comando borra el clúster, el contenedor y la Cloud TPU.

  2. Cuando termines de examinar los datos, usa el comando gsutil para borrar el depósito de Cloud Storage que creaste durante este instructivo. Reemplaza bucket-name por el nombre de tu depósito de Cloud Storage.

    $ gsutil rm -r gs://bucket-name
    

    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?

  • Ejecuta más modelos y trabajos de recuperación de conjuntos de datos mediante una de las siguientes especificaciones de trabajos: