Esegui applicazioni Cloud TPU su GKE

Questa guida spiega come:

Per ulteriori informazioni sulle architetture di VM TPU, vedi Architettura di sistema. Questa guida può essere utilizzata solo con l'architettura dei nodi TPU.

Vantaggi dell'esecuzione di applicazioni Cloud TPU su GKE

Le applicazioni di addestramento Cloud TPU possono essere configurate nei container GKE all'interno dei pod GKE. Quando lo saranno, vedrai i seguenti vantaggi:

  • Configurazione e gestione dei flussi di lavoro migliorate: GKE gestisce il ciclo di vita delle TPU. Dopo l'inizializzazione e l'addestramento di Cloud TPU configurati con GKE, i carichi di lavoro possono essere ripetuti gestite da GKE, incluso il ripristino da errori del job.

  • Costo ottimizzato: paghi per la TPU solo quando il job è attivo. GKE crea ed elimina automaticamente le TPU in base a un requisiti delle risorse del pod.

  • Utilizzo flessibile: è una piccola modifica alle specifiche del pod per richiedere un acceleratore hardware diverso (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
    
  • Scalabilità: GKE fornisce le API (Job e Deployment) che possono scalare fino a centinaia di di pod GKE e nodi TPU.

  • Tolleranza di errore:API Job di GKE, insieme al meccanismo di checkpoint TensorFlow, la semantica dalla corsa al completamento. I job di addestramento verranno eseguiti di nuovo automaticamente con l'ultimo stato letto dal checkpoint se si verificano errori sulle istanze VM o nodi Cloud TPU.

Requisiti e limitazioni di configurazione di Cloud TPU e GKE

Tieni presente quanto segue quando definisci la configurazione GKE:

  • Cloud TPU non è supportato nei pool di nodi Windows Server.
  • Devi creare il tuo cluster GKE e i pool di nodi in una zona in cui è disponibile Cloud TPU. Devi inoltre creare bucket Cloud Storage per conservare i tuoi dati e modelli di addestramento della stessa regione del cluster GKE. Consulta il documento su tipi e zone per un elenco delle le zone disponibili.
  • Devi utilizzare indirizzi IP conformi alla specifica RFC 1918 per i cluster GKE. Per ulteriori informazioni per ulteriori informazioni, consulta GKE Networking.
  • Ogni container può richiedere al massimo una Cloud TPU, ma più i container in un pod possono richiedere una Cloud TPU ciascuno.

Prima di iniziare

  1. Accedi al tuo account Google Cloud. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

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

    Go to project selector

  5. Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.

  6. Quando utilizzi Cloud TPU con GKE, il tuo progetto utilizza componenti fatturabili di Google Cloud. Controllo Prezzi di Cloud TPU e Prezzi di GKE per stimare i costi e seguire le istruzioni per pulire delle risorse quando hai finito.

  7. Abilita le seguenti API nella console Google Cloud:

Crea un nuovo cluster con il supporto di Cloud TPU

Segui queste istruzioni per configurare l'ambiente e creare Cluster GKE con supporto per Cloud TPU, utilizzando gcloud CLI:

  1. Installa i componenti gcloud, che ti servono esegui GKE con Cloud TPU:

    $ gcloud components install kubectl 
  2. Configura gcloud con il tuo ID progetto Google Cloud:

    $ gcloud config set project project-name
    

    Sostituisci project-name con il nome del tuo progetto Google Cloud.

    La prima volta che esegui questo comando in una nuova VM Cloud Shell, Pagina Authorize Cloud Shell visualizzata. Fai clic su Authorize in basso della pagina per consentire a gcloud di effettuare chiamate API Google Cloud con il tuo e credenziali.

  3. Configura gcloud con la zona in cui prevedi di utilizzare un risorsa Cloud TPU. In questo esempio viene utilizzato us-central1-b, ma può utilizzare una TPU in qualsiasi zona supportata.

    $ gcloud config set compute/zone us-central1-b
    
  4. Utilizza la gcloud container clusters create per creare un cluster su GKE con supporto per con Cloud TPU.

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

    Descrizioni flag di comando

    canale di rilascio
    Canali di rilascio consente di gestire gli upgrade automatici per i cluster. Quando creare un nuovo cluster, puoi scegliere il canale di rilascio. Il tuo cluster verrà eseguito l'upgrade solo alle versioni offerte in quel canale.
    ambiti
    garantisce che tutti i nodi nel cluster abbiano accesso nel bucket Cloud Storage. Il cluster e il bucket di archiviazione devono nello stesso progetto per far funzionare questa funzionalità. Tieni presente che i pod Kubernetes per impostazione predefinita ereditano gli ambiti dei nodi in cui viene eseguito il deployment. Di conseguenza, scopes=cloud-platform fornisce a tutti i pod Kubernetes in esecuzione nel cluster nell'ambito cloud-platform. Se limitare l'accesso per i singoli pod, consulta GKE guida all'autenticazione con gli account di servizio.
    enable-ip-alias
    Indica che il cluster utilizza intervalli IP alias. Questa operazione è necessaria per l'utilizzo di Cloud TPU su GKE.
    enable-tpu
    Indica che il cluster deve supportare Cloud TPU.
    tpu-ipv4-cidr (facoltativo, non specificato sopra)
    Indica l'intervallo CIDR da utilizzare per Cloud TPU. Specifica IP_RANGE sotto forma di IP/20, ad esempio 10.100.0.0/20. Se non specifichi questo flag, L'intervallo CIDR di /20 dimensioni viene allocato e assegnato automaticamente.

Una volta creato il cluster, dovresti visualizzare un messaggio simile al seguenti:

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

Richiedi una Cloud TPU nelle specifiche del tuo pod Kubernetes

Nella specifica del pod Kubernetes:

  • Devi creare i modelli nei container utilizzando lo stesso Versione TensorFlow. Vedi le versioni supportate.

  • Specifica la risorsa Cloud TPU nella sezione limits sotto la resource nella specifica del container.

    Tieni presente che l'unità della risorsa Cloud TPU è il numero Core Cloud TPU. La seguente tabella elenca degli esempi di richieste di risorse valide. Consulta Tipi e zone TPU per un elenco completo delle risorse TPU valide.

    Se la risorsa che deve essere utilizzata è un pod di Cloud TPU, quota poiché la quota predefinita Il pod di Cloud TPU è zero.

    Richiesta di risorse Tipo di Cloud TPU
    cloud-tpus.google.com/v2: 8 Un dispositivo Cloud TPU v2 (8 core)
    cloud-tpus.google.com/previous-v2: 8 Un dispositivo Cloud TPU v2 prerilasciabile (8 core)
    cloud-tpus.google.com/v3: 8 Un dispositivo Cloud TPU v3 (8 core)
    cloud-tpus.google.com/previous-v3: 8 Un dispositivo Cloud TPU v3 prerilasciabile (8 core)
    cloud-tpus.google.com/v2: 32 Un pod di Cloud TPU v2-32 (32 core)
    cloud-tpus.google.com/v3: 32 Un pod di Cloud TPU v3-32 (32 core)

    Per ulteriori informazioni su come specificare risorse e limiti nelle specifiche dei pod, consulta la documentazione di Kubernetes.

La seguente specifica del pod di esempio richiede una Cloud TPU prerilasciabile TPU v2-8 con TensorFlow 2.12.1.

La durata dei nodi Cloud TPU è associata ai pod Kubernetes che li richiedono. La Cloud TPU viene creata on demand quando Il pod Kubernetes viene pianificato e riciclato quando il pod Kubernetes viene eliminato.

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

Creazione del job

Segui questi passaggi per creare il job nel cluster GKE: e installare kubectl

  1. Con un editor di testo, crea una specifica del pod, example-job.yaml, quindi copia e incolla nella specifica del pod mostrata in precedenza.

  2. Esegui il job:

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

    Questo comando crea il job che pianifica automaticamente il pod.

  3. verifica che il pod GKE sia stato pianificato e che Cloud TPU è stato eseguito il provisioning dei nodi. Un pod GKE che richiede I nodi di Cloud TPU possono rimanere in attesa per 5 minuti prima dell'esecuzione. Tu vedrà un output simile al seguente fino a GKE Il pod è pianificato.

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

    Dopo circa 5 minuti, il risultato dovrebbe essere simile al seguente: .

    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
    

    Devi usare Ctrl-C per uscire da "kubectl get" .

    Puoi stampare le informazioni del log e recuperare informazioni più dettagliate di ogni cluster GKE usando i seguenti comandi kubectl. Ad esempio, per vedere l'output di log per il tuo pod GKE, utilizza:

    $ kubectl logs gke-tpu-pod

    Dovresti vedere un output simile al seguente:

    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)
    }
    

    Per vedere una descrizione completa del pod GKE, utilizza:

    $ kubectl describe pod gke-tpu-pod
    

    Consulta Introspezione e debug delle applicazioni per ulteriori dettagli.

Crea e containerizza il tuo modello nell'immagine Docker

Fai riferimento a Creare e containerizzare il tuo modello per maggiori dettagli su questa procedura.

Abilita il supporto di Cloud TPU su un cluster esistente

Per abilitare il supporto di Cloud TPU su un cluster GKE esistente esegui questi passaggi in Google Cloud CLI:

  1. Abilita il supporto di Cloud TPU:

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

    Sostituisci cluster-name con il nome del tuo cluster.

  2. Aggiorna la voce kubeconfig:

    gcloud container clusters get-credentials cluster-name
    

Impostazione di un intervallo CIDR personalizzato

Per impostazione predefinita, GKE alloca un blocco CIDR con la dimensione di /20 per le TPU di cui il cluster ha eseguito il provisioning. Puoi specificare un intervallo CIDR personalizzato esegui il comando seguente per la Cloud TPU:

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

Sostituisci quanto segue:

  • cluster-name: il nome del cluster esistente.
  • 10.100.0.0/20: il tuo intervallo CIDR personalizzato.

Utilizzo di intervalli CIDR esistenti con VPC condiviso

Segui la guida sulle TPU nei cluster GKE utilizzando un VPC condiviso per verificare che per il VPC condiviso.

Disabilitazione di Cloud TPU in un cluster

Per disabilitare il supporto di Cloud TPU su un cluster GKE esistente esegui questi passaggi in Google Cloud CLI:

  1. Verifica che nessuno dei tuoi carichi di lavoro utilizzi Cloud TPU:

    $ kubectl get tpu
    
  2. Disabilita il supporto di Cloud TPU nel tuo cluster:

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

    Sostituisci cluster-name con il nome del tuo cluster.

    Questa operazione richiede circa 5 minuti per i cluster di zona, mentre per i cluster a livello di regione questa operazione richiede circa 15 minuti, a seconda della configurazione regione.

  3. Quando le operazioni vengono completate senza errori, puoi verificare che le TPU di cui il cluster ha eseguito il provisioning:

    $ gcloud compute tpus list
    

    I nomi delle TPU create da Cloud TPU hanno il seguente formato:

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

    Sostituisci quanto segue:

    • cluster-name: il nome del cluster esistente.
    • cluster-id: l'ID del cluster esistente.
    • tpu-id: l'ID della Cloud TPU.

    Se vengono visualizzate TPU, puoi eliminarle manualmente eseguendo:

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

Esegui la pulizia

Quando hai finito di utilizzare Cloud TPU su GKE, eseguire la pulizia delle risorse per evitare addebiti aggiuntivi sul tuo fatturazione Cloud .

  1. Esegui questo comando per eliminare il cluster GKE: sostituendo cluster-name con il nome del tuo cluster e project-name con il tuo Nome progetto Google Cloud:

    $ gcloud container clusters delete cluster-name \
    --project=project-name --zone=us-central1-b
    
  2. Quando hai finito di esaminare i dati, usa lo gsutil per eliminare il bucket Cloud Storage che hai creato. Sostituisci bucket-name con il nome del tuo Bucket Cloud Storage:

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