Gestisci un modello con una singola GPU in GKE


Questo tutorial mostra come gestire un modello semplice con GPU in modalità Google Kubernetes Engine (GKE). Questo tutorial crea un cluster GKE che utilizza una singola GPU L4 Tensor Core e prepara l'infrastruttura GKE per l'inferenza online. Questo tutorial utilizza due dei framework più utilizzati per la pubblicazione online:

Obiettivi

Questo tutorial è destinato a ingegneri dell'infrastruttura, MLOps engineer, DevOps engineer o amministratori di cluster che vogliono ospitare un modello di machine learning (ML) preaddestrato in un cluster GKE.

Questo tutorial illustra i seguenti passaggi:

  1. Creare un cluster GKE Autopilot o Standard.
  2. Configurare un bucket Cloud Storage in cui si trova il modello preaddestrato.
  3. Esegui il deployment del framework di inferenza online selezionato.
  4. Effettua una richiesta di test al servizio di cui è stato eseguito il deployment.

Costi

Questo tutorial utilizza i seguenti componenti fatturabili di Google Cloud:

  • GKE
  • Cloud Storage
  • Acceleratori GPU L4
  • Traffico in uscita

Utilizza il Calcolatore prezzi per generare una stima dei costi in base all'utilizzo previsto.

Al termine di questo tutorial, puoi evitare di continuare la fatturazione eliminando le risorse che hai creato. Per ulteriori informazioni, consulta Pulizia.

Prima di iniziare

Configura il progetto

  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. Nella pagina del selettore di progetti della console Google Cloud, fai clic su Crea progetto per iniziare a creare un nuovo progetto Google Cloud.

    Vai al selettore progetti

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

  4. Attiva l'API GKE.

    Abilita l'API

  5. Nella pagina del selettore di progetti della console Google Cloud, fai clic su Crea progetto per iniziare a creare un nuovo progetto Google Cloud.

    Vai al selettore progetti

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

  7. Attiva l'API GKE.

    Abilita l'API

Configura i valori predefiniti per Google Cloud CLI

  1. Nella console Google Cloud, avvia un'istanza di Cloud Shell:
    Apri Cloud Shell

  2. Scarica il codice sorgente per questa app di esempio:

    git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
    cd kubernetes-engine-samples/ai-ml/gke-online-serving-single-gpu
    
  3. Imposta le variabili di ambiente predefinite:

    gcloud config set project PROJECT_ID
    gcloud config set compute/region COMPUTE_REGION
    

    Sostituisci i seguenti valori:

    • PROJECT_ID: il tuo ID progetto Google Cloud.
    • COMPUTE_REGION: la regione di Compute Engine che supporta il tipo di acceleratore che vuoi utilizzare, ad esempio us-central1 per la GPU L4.
  4. In Cloud Shell, crea le seguenti variabili di ambiente:

    export PROJECT_ID=$(gcloud config get project)
    export REGION=$(gcloud config get compute/region)
    export K8S_SA_NAME=gpu-k8s-sa
    export GSBUCKET=$PROJECT_ID-gke-bucket
    export MODEL_NAME=mnist
    export CLUSTER_NAME=online-serving-cluster
    

crea un cluster GKE

Puoi gestire modelli su una singola GPU in un cluster GKE Autopilot o Standard. Ti consigliamo di utilizzare un cluster Autopilot per un'esperienza Kubernetes completamente gestita. Con GKE Autopilot, le risorse scalano automaticamente in base alle richieste del modello.

Per scegliere la modalità operativa GKE più adatta ai tuoi carichi di lavoro, consulta Scegliere una modalità operativa GKE.

Autopilot

Esegui questo comando per creare un cluster GKE Autopilot:

  gcloud container clusters create-auto ${CLUSTER_NAME} \
      --region=${REGION} \
      --project=${PROJECT_ID} \
      --release-channel=rapid

GKE crea un cluster Autopilot con nodi CPU e GPU, come richiesto dai carichi di lavoro di cui è stato eseguito il deployment.

Standard

  1. Esegui questo comando per creare un cluster GKE Standard:

      gcloud container clusters create ${CLUSTER_NAME} \
        --project=${PROJECT_ID}  \
        --region=${REGION}  \
        --workload-pool=${PROJECT_ID}.svc.id.goog \
        --addons GcsFuseCsiDriver \
        --release-channel=rapid \
        --num-nodes=1
    

    La creazione del cluster potrebbe richiedere diversi minuti.

  2. Esegui questo comando per creare il pool di nodi:

      gcloud container node-pools create gpupool \
        --accelerator type=nvidia-l4,count=1,gpu-driver-version=latest \
        --project=${PROJECT_ID} \
        --location=${REGION} \
        --node-locations=${REGION}-a \
        --cluster=${CLUSTER_NAME} \
        --machine-type=g2-standard-8 \
        --num-nodes=1
    

    GKE crea un singolo pool di nodi contenente una GPU L4 per ogni nodo.

crea un bucket Cloud Storage

Crea un bucket Cloud Storage per archiviare il modello preaddestrato che verrà pubblicato.

In Cloud Shell, esegui questo comando:

gcloud storage buckets create gs://$GSBUCKET

Configura il cluster per accedere al bucket utilizzando la federazione delle identità per i carichi di lavoro per GKE

Per consentire al cluster di accedere al bucket Cloud Storage:

  1. Creare un account di servizio Google Cloud.
  2. Creare un ServiceAccount Kubernetes nel cluster.
  3. Associare Kubernetes ServiceAccount all'account di servizio Google Cloud.

Creare un account di servizio Google Cloud

  1. Nella console Google Cloud, vai alla pagina Crea account di servizio:

    Vai a Crea account di servizio

  2. Nel campo ID account di servizio, inserisci gke-ai-sa.

  3. Fai clic su Crea e continua.

  4. Nell'elenco Ruolo, seleziona il ruolo Cloud Storage > Servizio di raccolta Storage Insights.

  5. Fai clic su Aggiungi un altro ruolo.

  6. Nell'elenco Seleziona un ruolo, seleziona il ruolo Cloud Storage > Amministratore oggetti Storage.

  7. Fai clic su Continua e poi su Fine.

Crea un ServiceAccount Kubernetes nel tuo cluster

In Cloud Shell, segui questi passaggi:

  1. Crea uno spazio dei nomi Kubernetes:

    kubectl create namespace gke-ai-namespace
    
  2. Crea un ServiceAccount Kubernetes nello spazio dei nomi:

    kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
    

Associa l'account di servizio Kubernetes all'account di servizio Google Cloud

In Cloud Shell, esegui questi comandi:

  1. Aggiungi un'associazione IAM all'account di servizio Google Cloud:

    gcloud iam service-accounts add-iam-policy-binding gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com \
        --role roles/iam.workloadIdentityUser \
        --member "serviceAccount:PROJECT_ID.svc.id.goog[gke-ai-namespace/gpu-k8s-sa]"
    

    Il flag --member fornisce l'identità completa di Kubernetes ServiceAccount in Google Cloud.

  2. Annota l'account di servizio Kubernetes:

    kubectl annotate serviceaccount gpu-k8s-sa \
        --namespace gke-ai-namespace \
        iam.gke.io/gcp-service-account=gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com
    

esegui il deployment del server di inferenza online

Ogni framework di inferenza online prevede di trovare il modello ML preaddestrato in un formato specifico. La sezione seguente mostra come eseguire il deployment del server di inferenza in base al framework che vuoi utilizzare:

Tritone

  1. In Cloud Shell, copia il modello ML preaddestrato nel bucket Cloud Storage:

    gsutil cp -r src/triton-model-repository gs://$GSBUCKET
    
  2. Esegui il deployment del framework su Kubernetes:

    envsubst < src/gke-config/deployment-triton.yaml | kubectl --namespace=gke-ai-namespace apply -f -
    
  3. Verifica che GKE abbia eseguito il deployment del framework:

    kubectl get deployments --namespace=gke-ai-namespace
    

    Quando il framework è pronto, l'output è simile al seguente:

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    triton-deployment    1/1     1            1           5m29s
    
  4. Esegui il deployment dei servizi per accedere al deployment

    kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yaml
    
  5. Verifica che l'IP esterno sia assegnato:

    kubectl get services --namespace=gke-ai-namespace
    

    L'output è simile al seguente:

    NAME            TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                                        AGE
    kubernetes      ClusterIP      34.118.224.1     <none>          443/TCP                                        60m
    triton-server   LoadBalancer   34.118.227.176   35.239.54.228   8000:30866/TCP,8001:31035/TCP,8002:30516/TCP   5m14s
    

    Prendi nota dell'indirizzo IP per triton-server nella colonna EXTERNAL-IP.

  6. Verifica che il servizio e il deployment funzionino correttamente:

    curl -v EXTERNAL_IP:8000/v2/health/ready
    

    L'output è simile al seguente:

    ...
    < HTTP/1.1 200 OK
    < Content-Length: 0
    < Content-Type: text/plain
    ...
    

Pubblicazione TF

  1. In Cloud Shell, copia il modello ML preaddestrato nel bucket Cloud Storage:

    gsutil cp -r src/tfserve-model-repository gs://$GSBUCKET
    
  2. Esegui il deployment del framework su Kubernetes:

    envsubst < src/gke-config/deployment-tfserve.yaml | kubectl --namespace=gke-ai-namespace apply -f -
    
  3. Verifica che GKE abbia eseguito il deployment del framework:

    kubectl get deployments --namespace=gke-ai-namespace
    

    Quando il framework è pronto, l'output è simile al seguente:

    NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
    tfserve-deployment   1/1     1            1           5m29s
    
  4. Esegui il deployment dei servizi per accedere al deployment

    kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yaml
    
  5. Verifica che l'IP esterno sia assegnato:

    kubectl get services --namespace=gke-ai-namespace
    

    L'output è simile al seguente:

    NAME            TYPE           CLUSTER-IP       EXTERNAL-IP     PORT(S)                                        AGE
    kubernetes      ClusterIP      34.118.224.1     <none>          443/TCP                                        60m
    tfserve-server  LoadBalancer   34.118.227.176   35.239.54.228   8500:30003/TCP,8000:32194/TCP                  5m14s
    

    Prendi nota dell'indirizzo IP per tfserve-server nella colonna EXTERNAL-IP.

  6. Verifica che il servizio e il deployment funzionino correttamente:

    curl -v EXTERNAL_IP:8000/v1/models/mnist
    

    Sostituisci EXTERNAL_IP con il tuo indirizzo IP esterno.

    L'output è simile al seguente:

    ...
    < HTTP/1.1 200 OK
    < Content-Type: application/json
    < Date: Thu, 12 Oct 2023 19:01:19 GMT
    < Content-Length: 154
    <
    {
      "model_version_status": [
            {
            "version": "1",
            "state": "AVAILABLE",
            "status": {
              "error_code": "OK",
              "error_message": ""
            }
          }
        ]
    }
    

Pubblica il modello

Tritone

  1. Creare un ambiente virtuale Python in Cloud Shell.

    python -m venv ./mnist_client
    source ./mnist_client/bin/activate
    
  2. Installare i pacchetti Python richiesti.

    pip install -r src/client/triton-requirements.txt
    
  3. Testa il server di inferenza Triton caricando un'immagine:

    cd src/client
    python triton_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
    

    Sostituisci quanto segue:

    • EXTERNAL_IP: il tuo indirizzo IP esterno.
    • TEST_IMAGE: il nome del file che corrisponde all'immagine che vuoi testare. Puoi utilizzare le immagini archiviate in src/client/images.

    A seconda dell'immagine utilizzata, l'output è simile al seguente:

    Calling Triton HTTP Service      ->      Prediction result: 7
    

Pubblicazione TF

  1. Creare un ambiente virtuale Python in Cloud Shell.

    python -m venv ./mnist_client
    source ./mnist_client/bin/activate
    
  2. Installare i pacchetti Python richiesti.

    pip install -r src/client/tfserve-requirements.txt
    
  3. Esegui il test di TensorFlow Serving con alcune immagini.

    cd src/client
    python tfserve_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.png
    

Sostituisci quanto segue:

  • EXTERNAL_IP: il tuo indirizzo IP esterno.
  • TEST_IMAGE: un valore compreso tra 0 e 9. Puoi usare le immagini memorizzate nell'app src/client/images.

A seconda dell'immagine che utilizzi, otterrai un output simile a questo:

  Calling TensorFlow Serve HTTP Service    ->      Prediction result: 5

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse create in questa guida, esegui una delle seguenti operazioni:

  • Conserva il cluster GKE: elimina le risorse Kubernetes nel cluster e le risorse Google Cloud
  • Conserva il progetto Google Cloud: elimina il cluster GKE e le risorse Google Cloud
  • Eliminare il progetto

Elimina le risorse Kubernetes nel cluster e le risorse Google Cloud

  1. Elimina lo spazio dei nomi Kubernetes e i carichi di lavoro di cui hai eseguito il deployment:

Tritone

kubectl -n gke-ai-namespace delete -f src/gke-config/service-triton.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-triton.yaml
kubectl delete namespace gke-ai-namespace

Pubblicazione TF

kubectl -n gke-ai-namespace delete -f src/gke-config/service-tfserve.yaml
kubectl -n gke-ai-namespace delete -f src/gke-config/deployment-tfserve.yaml
kubectl delete namespace gke-ai-namespace
  1. Elimina il bucket Cloud Storage:

    1. Vai alla pagina Bucket:

      Vai a Bucket

    2. Seleziona la casella di controllo relativa a PROJECT_ID-gke-bucket.

    3. Fai clic su Elimina.

    4. Per confermare l'eliminazione, digita DELETE e fai clic su Elimina.

  2. Eliminare l'account di servizio Google Cloud:

    1. Vai alla pagina Account di servizio:

      Vai ad Account di servizio

    2. Seleziona il progetto.

    3. Seleziona la casella di controllo relativa a gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.

    4. Fai clic su Elimina.

    5. Per confermare l'eliminazione, fai clic su Elimina.

Elimina il cluster GKE e le risorse Google Cloud

  1. Elimina il cluster GKE:

    1. Vai alla pagina Cluster:

      Vai a Cluster

    2. Seleziona la casella di controllo per online-serving-cluster.

    3. Fai clic su Elimina.

    4. Per confermare l'eliminazione, digita online-serving-cluster e fai clic su Elimina.

  2. Elimina il bucket Cloud Storage:

    1. Vai alla pagina Bucket:

      Vai a Bucket

    2. Seleziona la casella di controllo relativa a PROJECT_ID-gke-bucket.

    3. Fai clic su Elimina.

    4. Per confermare l'eliminazione, digita DELETE e fai clic su Elimina.

  3. Eliminare l'account di servizio Google Cloud:

    1. Vai alla pagina Account di servizio:

      Vai ad Account di servizio

    2. Seleziona il progetto.

    3. Seleziona la casella di controllo relativa a gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com.

    4. Fai clic su Elimina.

    5. Per confermare l'eliminazione, fai clic su Elimina.

Elimina il progetto

  1. Nella console Google Cloud, vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
  3. Nella finestra di dialogo, digita l'ID del progetto e fai clic su Chiudi per eliminare il progetto.

Passaggi successivi