Ejecuta aplicaciones de Cloud TPU en GKE

En esta guía, se describe cómo hacer las siguientes acciones:

Para obtener más información sobre las arquitecturas de las VM de TPU, consulta Arquitectura del sistema. En esta guía, solo se puede usar con la arquitectura de nodos de TPU.

Beneficios de ejecutar aplicaciones de Cloud TPU en GKE

Las aplicaciones de entrenamiento de Cloud TPU se pueden configurar para que se ejecuten en contenedores de GKE dentro de Pods de GKE. Cuando lo hacen, observas los siguientes beneficios:

  • Configuración y administración mejoradas del flujo de trabajo: GKE administra ciclo de vida de las TPU. Una vez que se configuran la inicialización y el entrenamiento de Cloud TPU con GKE, GKE puede repetir y administrar tus cargas de trabajo, incluida la recuperación de fallas de trabajo.

  • Costo optimizado: Solo pagas por la TPU mientras el trabajo está activo. GKE crea y borra TPU de forma automática según los requisitos de recursos de un Pod.

  • Uso flexible: Un cambio pequeño en la especificación del pod es suficiente para solicitar un acelerador de hardware diferente (CPU, GPU o TPU):

    kind: Pod
    metadata:
      name: example-tpu
      annotations:
        # The Cloud TPUs that will be created for this Job will support
        # TensorFlow 2.12.1. This version MUST match the
        # TensorFlow version that your model is built on.
        tf-version.cloud-tpus.google.com: "2.12.1"
    spec:
      containers:
      - name: example-container
        resources:
          limits:
            cloud-tpus.google.com/v2: 8
            # See the line above for TPU, or below for CPU / GPU.
            # cpu: 2
            # nvidia.com/gpu: 1
    
  • Escalabilidad: GKE proporciona las APIs (Trabajo y Implementación) que pueden escalar a cientos de Pods de GKE y nodos de TPU.

  • Tolerancia a errores: API de trabajo de GKE junto con el mecanismo de punto de control de TensorFlow, semántica de ejecución hasta finalización. Tus trabajos de entrenamiento se volverán a ejecutar automáticamente con la última lectura del estado del punto de control si se producen fallas en las instancias de VM o en los nodos Cloud TPU.

Requisitos y limitaciones de la configuración de Cloud TPU y GKE

Cuando definas la configuración, ten en cuenta la información que figura a continuación de GKE:

  • Cloud TPU no es compatible con los grupos de nodos de Windows Server.
  • 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. Consulta el documento de tipos y zonas para obtener una lista de las zonas disponibles.
  • Debes usar direcciones IP que cumplan con RFC 1918 para tus clústeres de GKE. Para ver más consulta Herramientas de redes de GKE.
  • Cada contenedor puede solicitar, como máximo, una Cloud TPU, pero varios contenedores de un pod pueden solicitar una Cloud TPU cada uno.

Antes de comenzar

  1. 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.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  5. Make sure that billing is enabled for your Google Cloud project.

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

  7. Habilita las siguientes APIs en la consola de Google Cloud:

Crea un clúster nuevo compatible con Cloud TPU

Usa las siguientes instrucciones para configurar tu entorno y crear un clúster de GKE compatible con Cloud TPU, con gcloud CLI:

  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 Google Cloud con tu credenciales.

  3. Configura gcloud por la zona en la que planeas usar un recurso de Cloud TPU. En este ejemplo, se usa us-central1-b, pero tú puedes usar una TPU en cualquier zona compatible.

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

    $ gcloud container clusters create cluster-name \
      --release-channel=stable \
      --scopes=cloud-platform \
      --enable-ip-alias \
      --enable-tpu

    Descripciones de las marcas de comandos

    Canal de versiones
    Los canales de versiones brindan una forma de administrar las actualizaciones automáticas en tus clústeres. Cuando crear un clúster nuevo, puedes elegir su canal de versiones. Tu clúster solo se actualizará a las versiones ofrecidas en ese canal.
    permisos
    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 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 ejecuta en el clúster el permiso cloud-platform. Si si quieres limitar el acceso por Pod, consulta el 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. Especificar el IP_RANGE en el formato de 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 cree 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-name  us-central1-b  1.16.15-gke.4901  34.71.245.25  n1-standard-1  1.16.15-gke.4901  3          RUNNING

Solicita una Cloud TPU en las especificaciones de tu pod de Kubernetes

En las especificaciones de tu Pod de Kubernetes, haz lo siguiente:

  • Debes compilar tus modelos en tus contenedores con la misma versión de TensorFlow. Consulta las versiones compatibles.

  • Especifica el recurso de Cloud TPU en la sección limits debajo de Campo resource en la especificación del contenedor.

    Ten en cuenta que la unidad del recurso de Cloud TPU es el número de núcleos de Cloud TPU. En la siguiente tabla, se enumeran ejemplos de solicitudes de recursos válidas. Consulta Tipos y zonas de TPU para obtener una lista completa de los recursos de TPU válidos.

    Si el recurso que quieres usar es un pod de Cloud TPU, solicita cuota, ya que la cuota predeterminada para un pod de Cloud TPU es cero.

    Solicitud de recurso Tipo de Cloud TPU
    cloud-tpus.google.com/v2: 8 Un dispositivo de Cloud TPU v2 (8 núcleos)
    cloud-tpus.google.com/preemptible-v2: 8 Un dispositivo de Cloud TPU v2 interrumpible (8 núcleos)
    cloud-tpus.google.com/v3: 8 Un dispositivo de Cloud TPU v3 (8 núcleos)
    cloud-tpus.google.com/preemptible-v3: 8 Un dispositivo de Cloud TPU v3 interrumpible (8 núcleos)
    cloud-tpus.google.com/v2: 32 Un pod de Cloud TPU v2-32 (32 núcleos)
    cloud-tpus.google.com/v3: 32 Un pod de Cloud TPU v3-32 (32 núcleos)

    Si deseas obtener más información acerca de cómo especificar recursos y límites en las especificaciones del pod, consulta la documentación de Kubernetes.

En la siguiente especificación de pod de muestra, se solicita una TPU Cloud TPU v2-8 preemptible con TensorFlow 2.12.1.

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: v1
kind: Pod
metadata:
  name: gke-tpu-pod
  annotations:
     # The Cloud TPUs that will be created for this Job will support
     # TensorFlow 2.12.1. This version MUST match the
     # TensorFlow version that your model is built on.
     tf-version.cloud-tpus.google.com: "2.12.1"
spec:
  restartPolicy: Never
  containers:
  - name: gke-tpu-container
    # The official TensorFlow 2.12.1 image.
    # https://hub.docker.com/r/tensorflow/tensorflow
    image: tensorflow/tensorflow:2.12.1
    command:
    - python
    - -c
    - |
      import tensorflow as tf
      print("Tensorflow version " + tf.__version__)

      tpu = tf.distribute.cluster_resolver.TPUClusterResolver('$(KUBE_GOOGLE_CLOUD_TPU_ENDPOINTS)')
      print('Running on TPU ', tpu.cluster_spec().as_dict()['worker'])

      tf.config.experimental_connect_to_cluster(tpu)
      tf.tpu.experimental.initialize_tpu_system(tpu)
      strategy = tf.distribute.TPUStrategy(tpu)

      @tf.function
      def add_fn(x,y):
          z = x + y
          return z

      x = tf.constant(1.)
      y = tf.constant(1.)
      z = strategy.run(add_fn, args=(x,y))
      print(z)
    resources:
      limits:
        # Request a single Preemptible v2-8 Cloud TPU device to train the model.
        cloud-tpus.google.com/preemptible-v2: 8

Crea el trabajo

Sigue estos pasos para crear el trabajo en el clúster de GKE: y que instale kubectl

  1. Con un editor de texto, crea una especificación de pod, example-job.yaml, y copia y pega la especificación del pod que se mostró antes.

  2. Ejecuta el trabajo:

    $ kubectl create -f example-job.yaml
    pod "gke-tpu-pod" created

    Con este comando, se crea el trabajo que programa el pod de forma automática.

  3. Verifica si se programó el Pod de GKE y que Cloud TPU se aprovisionaron nodos. Un Pod de GKE que solicita Los nodos de Cloud TPU pueden estar pendientes durante 5 minutos antes de ejecutarse. Verás un resultado similar al siguiente hasta que se programe el pod de GKE.

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

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

    NAME          READY     STATUS              RESTARTS   AGE
    gke-tpu-pod   0/1       Pending             0          21s
    gke-tpu-pod   0/1       Pending             0          2m18s
    gke-tpu-pod   0/1       Pending             0          2m18s
    gke-tpu-pod   0/1       ContainerCreating   0          2m18s
    gke-tpu-pod   1/1       Running             0          2m48s
    gke-tpu-pod   0/1       Completed           0          3m8s
    

    Debes usar Ctrl C para salir del comando "kubectl get".

    Puedes imprimir información de registro y recuperar información más detallada sobre cada pod de GKE con los siguientes comandos kubectl. Por ejemplo, a fin de ver el resultado del registro del pod de GKE, usa el siguiente comando:

    $ kubectl logs gke-tpu-pod

    Debería ver un resultado similar al siguiente:

    2021-09-24 18:55:25.400699: I tensorflow/core/platform/cpu_feature_guard.cc:142]
    This TensorFlow binary is optimized with oneAPI Deep Neural Network Library
    (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 FMA
    To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
    2021-09-24 18:55:25.405947: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272]
    Initialize GrpcChannelCache for job worker -> {0 -> 10.0.16.2:8470}
    2021-09-24 18:55:25.406058: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272]
    Initialize GrpcChannelCache for job localhost -> {0 -> localhost:32769}
    2021-09-24 18:55:28.091729: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272]
    Initialize GrpcChannelCache for job worker -> {0 -> 10.0.16.2:8470}
    2021-09-24 18:55:28.091896: I tensorflow/core/distributed_runtime/rpc/grpc_channel.cc:272]
    Initialize GrpcChannelCache for job localhost -> {0 -> localhost:32769}
    2021-09-24 18:55:28.092579: I tensorflow/core/distributed_runtime/rpc/grpc_server_lib.cc:427]
    Started server with target: grpc://localhost:32769
    Tensorflow version 2.12.1
    Running on TPU  ['10.0.16.2:8470']
    PerReplica:{
      0: tf.Tensor(2.0, shape=(), dtype=float32),
      1: tf.Tensor(2.0, shape=(), dtype=float32),
      2: tf.Tensor(2.0, shape=(), dtype=float32),
      3: tf.Tensor(2.0, shape=(), dtype=float32),
      4: tf.Tensor(2.0, shape=(), dtype=float32),
      5: tf.Tensor(2.0, shape=(), dtype=float32),
      6: tf.Tensor(2.0, shape=(), dtype=float32),
      7: tf.Tensor(2.0, shape=(), dtype=float32)
    }
    

    Si deseas ver una descripción completa del Pod de GKE, usa el siguiente comando:

    $ kubectl describe pod gke-tpu-pod

    Consulta Inspección y depuración de la aplicación para obtener más detalles.

Crea y organiza tu modelo en contenedores en la imagen de Docker

Consulta cómo compilar y organizar tu propio modelo en contenedores para obtener más detalles sobre este proceso.

Habilita la compatibilidad con Cloud TPU en un clúster existente

Habilitar la compatibilidad con Cloud TPU en un clúster de GKE existente clúster, realiza los siguientes pasos en Google Cloud CLI:

  1. Habilita la compatibilidad con Cloud TPU:

    gcloud beta container clusters update cluster-name --enable-tpu
    

    Reemplaza cluster-name por el nombre del clúster.

  2. Actualiza la entrada de kubeconfig:

    gcloud container clusters get-credentials cluster-name
    

Configura un rango CIDR personalizado

De forma predeterminada, GKE asigna un bloque CIDR con un tamaño de /20 para las TPU aprovisionadas por el clúster. Puedes especificar un rango de CIDR personalizado para Cloud TPU mediante la ejecución del siguiente comando:

gcloud beta container clusters update cluster-name \
  --enable-tpu \
  --tpu-ipv4-cidr 10.100.0.0/20

Reemplaza lo siguiente:

  • cluster-name: Es el nombre del clúster existente.
  • 10.100.0.0/20: Es rango de CIDR personalizado.

Usa rangos CIDR existentes con la VPC compartida

Sigue la guía sobre TPU en clústeres de GKE con una VPC compartida para verificar la configuración correcta de tu VPC compartida.

Inhabilita Cloud TPU en un clúster

Para inhabilitar la compatibilidad con Cloud TPU en un clúster de GKE existente, realiza los siguientes pasos en Google Cloud CLI:

  1. Verifica que ninguna de tus cargas de trabajo use Cloud TPU:

    $ kubectl get tpu
  2. Inhabilita la compatibilidad con Cloud TPU en tu clúster:

    $ gcloud beta container clusters update cluster-name --no-enable-tpu

    Reemplaza cluster-name por el nombre del clúster.

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

  3. Una vez que se completan las operaciones sin errores, puedes verificar que se hayan quitado las TPU aprovisionadas por el clúster:

    $ gcloud compute tpus list

    Los nombres de las TPU que crea Cloud TPU tienen el siguiente formato:

    $ gke-cluster-name-cluster-id-tpu-tpu-id

    Reemplaza lo siguiente:

    • cluster-name: Es el nombre del clúster existente.
    • cluster-id: Es el ID de tu clúster existente.
    • tpu-id: Es el ID de la Cloud TPU.

    Si aparece alguna TPU, puedes borrarla de forma manual si ejecutas el siguiente comando:

    $ gcloud compute tpus delete gke-cluster-name-cluster-id-tpu-tpu-id

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 de Cloud

  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 \
    --project=project-name --zone=us-central1-b
  2. Cuando hayas terminado de examinar los datos, usa gcloud CLI para borrar el bucket de Cloud Storage que creaste. Reemplaza el bucket-name por el nombre de tu bucket de Cloud Storage:

    $ gcloud storage rm gs://bucket-name --recursive