Esegui il deployment di un carico di lavoro di machine learning in batch


Questo tutorial mostra come utilizzare Google Kubernetes Engine (GKE) per gestire carichi di lavoro batch tolleranti agli errori mantenendo bassi i costi. Segui questo tutorial per scoprire come utilizzare Job e Spot Pod ottimizzati per i costi, nonché come configurare una coda di job Redis in-cluster su GKE.

Sfondo

Un carico di lavoro batch è un processo in genere progettato per avere un punto di inizio e un punto di completamento. Devi prendere in considerazione i carichi di lavoro batch su GKE se la tua architettura prevede l'importazione, l'elaborazione e l'output dei dati anziché l'utilizzo di dati non elaborati. Aree come il machine learning, l'intelligenza artificiale e il computing ad alte prestazioni (HPC) presentano diversi tipi di carichi di lavoro batch, come l'addestramento di modelli offline, la previsione in batch, l'analisi dei dati, la simulazione di sistemi fisici e l'elaborazione video.

Progettando carichi di lavoro batch containerizzati, puoi sfruttare i seguenti vantaggi di GKE:

  • Uno standard aperto, una community ampia e un servizio gestito.
  • Efficienza dei costi grazie all'orchestrazione efficace di carichi di lavoro e infrastrutture e risorse di calcolo specializzate.
  • Isolamento e portabilità della containerizzazione, che consente l'utilizzo del cloud come capacità di overflow mantenendo la sicurezza dei dati.
  • Disponibilità della capacità burst, seguita da una rapida fare lo scale down delle dimensioni dei cluster GKE.

Obiettivi

Questo tutorial è rivolto ai machine learning engineer o ai data scientist che vogliono imparare a eseguire carichi di lavoro batch di machine learning su GKE, sull'architettura scalabile ed economica seguente:

Questo tutorial illustra i seguenti passaggi:

  1. Creare un cluster GKE Autopilot. In alternativa, puoi utilizzare un cluster GKE Standard per questo tutorial.
  2. Crea un volume Filestore NFS.
  3. Creare una coda di job Redis nel cluster.
  4. Trasferire i set di dati nel volume NFS e accodarli per l'utilizzo da parte del carico di lavoro.
  5. Esegui un carico di lavoro batch di machine learning di esempio nel cluster GKE.

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

I nuovi utenti di Google Cloud potrebbero avere diritto a una prova gratuita.


Per seguire le indicazioni dettagliate per questa attività direttamente nella Google Cloud console, fai clic su Procedura guidata:

Procedura guidata


Prima di iniziare

  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. Verify that billing is enabled for your Google Cloud project.

  4. Enable the Compute Engine, GKE, and Filestore APIs.

    Enable the APIs

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

    Go to project selector

  6. Verify that billing is enabled for your Google Cloud project.

  7. Enable the Compute Engine, GKE, and Filestore APIs.

    Enable the APIs

  8. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  9. Prepara l'ambiente

    1. Clona il repository di esempio utilizzato in questo tutorial:

      git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
      cd kubernetes-engine-samples/batch/aiml-workloads
      
    2. Crea un cluster GKE Autopilot:

      gcloud container clusters create-auto batch-aiml \
          --location=us-central1
      

      Il completamento di questo passaggio può richiedere fino a 5 minuti.

    Configurare l'archiviazione del set di dati con un Network File System (NFS)

    Il workload di machine learning richiede una soluzione di archiviazione per i set di dati e i file di output. In questa sezione, creerai un'istanza Filestore e fornirai l'accesso all'istanza utilizzando un PersistentVolume e un PersistentVolumeClaim.

    Per saperne di più, consulta come progettare una strategia di archiviazione ottimale e come accedere alle istanze Filestore dai cluster GKE.

    Crea un'istanza di Filestore

    1. Crea un'istanza di Filestore:

      gcloud filestore instances create batch-aiml-filestore \
          --zone=us-central1-b \
          --tier=BASIC_HDD \
          --file-share=name="NFSVol",capacity=1TB \
          --network=name="default"
      

      Questo comando specifica le seguenti opzioni:

      • tier: il livello di servizio per l'istanza Filestore. Questo esempio utilizza il livello di base. Per scoprire le altre opzioni, consulta Livelli di servizio.

      • network=name: il nome della rete Virtual Private Cloud (VPC) per l'istanza Filestore. Il cluster GKE deve trovarsi nella stessa rete VPC dell'istanza Filestore.

      • capacity: la dimensione desiderata del volume. Specifica il valore di archiviazione in una delle unità supportate descritte in Quantità di risorse.

    2. Verifica che l'istanza Filestore sia stata sottoposta a deployment:

      gcloud filestore instances list \
          --project=PROJECT_ID \
          --zone=us-central1-b
      

      Sostituisci PROJECT_ID con l'ID del tuo progetto Google Cloud.

      L'output è simile al seguente:

      INSTANCE_NAME: batch-aiml-filestore
      LOCATION: us-central1-b
      TIER: BASIC_HDD
      CAPACITY_GB: 1024
      FILE_SHARE_NAME: NFSVol
      IP_ADDRESS: 203.0.113.54
      STATE: READY
      CREATE_TIME: 2022-03-15T18:23:51
      
    3. Prendi nota del valore nel campo IP_ADDRESS da utilizzare nella sezione seguente.

    Crea un PersistentVolume

    Una specifica PersistentVolume di Kubernetes consente al cluster GKE di connettersi all'istanza Filestore.

    1. Aggiorna il file kubernetes-manifests/persistent-volume.yaml con l'indirizzo IP dell'istanza Filestore:

      sed -i "\
        s/<FILESTORE_IP_ADDRESS>/IP_ADDRESS/g" \
        kubernetes-manifests/persistent-volume.yaml
      

      Sostituisci IP_ADDRESS con l'indirizzo IP che hai annotato quando hai creato l'istanza Filestore nella sezione precedente.

    2. Esegui il deployment di PersistentVolume:

      kubectl apply -f kubernetes-manifests/persistent-volume.yaml
      

    Crea un PersistentVolumeClaim

    Una PersistentVolumeClaim di Kubernetes consente ai pod e ai job Kubernetes di accedere alle risorse di archiviazione di un PersistentVolume.

    Esegui il deployment di PersistentVolumeClaim:

    kubectl apply -f kubernetes-manifests/persistent-volume-claim.yaml
    

    Utilizza PersistentVolumeClaim

    Con PersistentVolume e PersistentVolumeClaim configurati sul cluster GKE, puoi configurare il server Redis e i job batch per utilizzare PersistentVolumeClaim. Viene visualizzato come un volume di archiviazione montabile.

    Esamina i file kubernetes-manifests/redis-pod.yaml e kubernetes-manifests/workload.yaml. Le configurazioni del manifest sono simili alle seguenti:

      spec:
      
      containers:
      - name: workload
        image: "us-central1-docker.pkg.dev/gke-batch-aiml/batch-aiml-docker-repo/workload"
        volumeMounts:
        - mountPath: /mnt/fileserver
          name: workload-pvc
      volumes:
      - name: workload-pvc
        persistentVolumeClaim:
          claimName: fileserver-claim
          readOnly: false
    

    In questo manifest:

    • spec.volumes specifica il PersistentVolumeClaim da utilizzare.
    • spec.containers.volumeMounts specifica il percorso del file locale in cui il pod può accedere alla condivisione file Filestore.

    Configura una coda di job Redis

    Il carico di lavoro elabora i dati in batch per addestrare in modo iterativo un modello di rilevamento di attività fraudolente. Per gestire i set di dati attualmente in fase di elaborazione o ancora in coda, esegui il deployment del server Redis nel cluster GKE.

    Per questo tutorial, avvii una singola istanza di Redis. Per eseguire il deployment di Redis in modo scalabile e ridondante, consulta Creare un'applicazione web multilivello con Redis e PHP.

    1. Esegui il deployment della specifica del server Redis.

      kubectl apply -f kubernetes-manifests/redis-pod.yaml
      
    2. Verifica che il pod sia in esecuzione:

      kubectl get pods
      

      L'output è simile al seguente:

      NAME           READY   STATUS    RESTARTS   AGE
      redis-leader   1/1     Running   0          118s
      

      L'avvio del pod potrebbe richiedere fino a due minuti.

    3. Trasferisci i file contenenti i set di dati di addestramento e test nel volume NFS.

      sh scripts/transfer-datasets.sh
      

      Questo script copia i file dal repository del codice campione alla directory /mnt/fileserver/datasets/ nel pod redis-leader.

    4. Popola la coda Redis.

      sh scripts/queue-jobs.sh
      

      Questo script esegue il push dei percorsi di file per i set di dati di addestramento in un elenco denominato datasets nel database Redis. Questa coda verrà utilizzata dal carico di lavoro per individuare il successivo set di dati da elaborare.

    5. Esegui il deployment del servizio per rendere il server Redis rilevabile all'interno del cluster GKE.

      kubectl apply -f ./kubernetes-manifests/redis-service.yaml
      

    Esegui il carico di lavoro batch

    A questo punto, hai preparato il cluster GKE, la coda di job Redis e la condivisione file. Ora puoi eseguire il carico di lavoro batch.

    In questa sezione utilizzi un'immagine container di un carico di lavoro di esempio per addestrare un modello di rilevamento di attività fraudolente utilizzando batch di dati di transazioni finanziarie. Il processo di addestramento può essere riassunto come segue:

    1. Un client Redis richiede i job (percorsi di file ai set di dati) nella coda Redis e al termine li rimuove dalla coda.

    2. La classe di gestione dell'addestramento di modelli FraudDetectionModelTrainer carica un nuovo batch di dati e, facoltativamente, lo stato salvato di un modello di machine learning. Il set di dati viene utilizzato per perfezionare il modello (un processo noto come addestramento"ad avvio lento").

    3. Il nuovo stato del modello e un report con i dettagli e i punteggi delle prestazioni del batch vengono salvati nel volume NFS Filestore, a cui è possibile accedere nel cluster GKE utilizzando una PersistentVolumeClaim.

    Per saperne di più, esplora il codice sorgente.

    Definisci il job

    Il seguente manifest descrive il job Kubernetes per l'immagine del workload batch. Un controller Job in Kubernetes crea uno o più pod e garantisce che eseguano correttamente un'attività specifica.

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: workload
    spec:
      parallelism: 1
      template:
        metadata:
          name: workload
        spec:
          nodeSelector:
            cloud.google.com/gke-spot: "true"
          containers:
          - name: workload
            image: "us-docker.pkg.dev/google-samples/containers/gke/batch-ml-workload"
            volumeMounts:
            - mountPath: /mnt/fileserver
              name: workload-pvc
          volumes:
          - name: workload-pvc
            persistentVolumeClaim:
              claimName: fileserver-claim
              readOnly: false
          restartPolicy: OnFailure

    Esegui il deployment del carico di lavoro

    1. Esegui il deployment del job:

      kubectl apply -f ./kubernetes-manifests/workload.yaml
      
    2. Controlla se lo stato del pod workload-XXX è Completed:

      watch kubectl get pods
      

      L'operazione potrebbe richiedere alcuni secondi. Puoi tornare alla riga di comando premendo Ctrl+C.

      L'output è simile al seguente:

      NAME             READY   STATUS      RESTARTS   AGE
      redis-leader     1/1     Running     0          16m
      workload-4p55d   0/1     Completed   0          83s
      
    3. Controlla i log del job workload:

      kubectl logs job/workload
      

      L'output è simile al seguente:

      Worker with sessionID: b50f9459-ce7f-4da8-9f84-0ab5c3233a72
      Initial queue state: empty=False
      Processing dataset: datasets/training/2018-04-04.pkl
      Processing dataset: datasets/training/2018-04-03.pkl
      Processing dataset: datasets/training/2018-04-02.pkl
      Processing dataset: datasets/training/2018-04-01.pkl
      Queue empty, exiting
      

      I file .pkl sono serializzazioni di set di dati contenenti un batch di transazioni con carta di credito, contrassegnate come valide o fraudolente. Il job workload esegue l'iterazione su questi file, decomprimendo i set di dati e utilizzandoli per addestrare il modello di machine learning, prima di rimuoverli dalla coda Redis. Il workload continua a elaborare i dati in batch, fino a quando la coda Redis non è vuota, prima di uscire con esito positivo.

    Esplora il volume NFS

    Durante il funzionamento, il workload crea file nel volume NFS montato, accessibili in tutto il cluster da altri job batch o applicazioni online.

    1. Elenca i file creati dal carico di lavoro:

      kubectl exec --stdin --tty redis-leader -- /bin/sh -c "ls -1 /mnt/fileserver/output"
      

      L'output dovrebbe essere simile all'esempio seguente:

      model_cpt_2018-04-01.pkl
      model_cpt_2018-04-02.pkl
      model_cpt_2018-04-03.pkl
      model_cpt_2018-04-04.pkl
      report.txt
      

      Nella directory /mnt/fileserver/output sul volume NFS sono stati creati i checkpoint per il modello addestrato (nomi di file come model_cpt_XXX.pkl) e un report sulle prestazioni del modello (report.txt).

    2. Esamina il report sulle prestazioni del modello:

      kubectl exec --stdin --tty redis-leader -- /bin/sh -c "cat /mnt/fileserver/output/report.txt"
      

      Di seguito è riportato uno snippet dell'output:

      Report generated on: 2022-02-09 14:19:42.303619
      Training dataset: 2018-04-04.pkl
      Model checkpoint: model_cpt_2018-04-04.pkl
      ---
      Accuracy on training data: 0.9981112277019937
      Accuracy on testing data: 0.9977204434773599
      

      Il file contiene le voci che descrivono nel dettaglio la data/ora di addestramento, il set di dati utilizzato, l'accuratezza raggiunta e il nome file del checkpoint del modello associato all'addestramento.

    Per saperne di più sui volumi NFS, consulta le guide di Filestore.

    Esegui la pulizia

    Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

    Rimuovere singole risorse

    Per rimuovere le singole risorse create per questo tutorial, esegui i seguenti comandi.

    1. Elimina il cluster:

      gcloud container clusters delete batch-aiml \
          --location=us-central1
      
    2. Elimina l'istanza Filestore:

      gcloud filestore instances delete batch-aiml-filestore \
          --zone=us-central1-b
      

    Elimina il progetto

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    Passaggi successivi