Gestire un modello con una singola GPU in GKE


Questo tutorial mostra come eseguire il deployment e pubblicare un modello linguistico di grandi dimensioni (LLM) utilizzando le GPU su Google Kubernetes Engine (GKE) con NVIDIA Triton Inference Server e TensorFlow Serving Questo fornisce una base per comprendere ed esplorare l'implementazione pratica di LLM per l'inferenza in un ambiente Kubernetes gestito. Esegui il deployment di un container predefinito in un cluster GKE con una singola GPU L4 Tensor Core e prepari l'infrastruttura GKE per eseguire l'inferenza online.

Questo tutorial è rivolto a machine learning engineer, amministratori e operatori di piattaforme e specialisti di dati e AI che vogliono ospitare un modello di machine learning (ML) preaddestrato su un cluster GKE. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui viene fatto riferimento nei contenuti di Google Cloud, consulta la pagina Ruoli utente e attività comuni di GKE Enterprise.

Prima di leggere questa pagina, assicurati di avere familiarità con quanto segue:

Obiettivi

  1. Crea un cluster GKE Autopilot o Standard.
  2. Configura un bucket Cloud Storage in cui si trova il modello pre-addestrato.
  3. Esegui il deployment del framework di inferenza online che selezioni.
  4. Invia 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 l'addebito di ulteriori costi eliminando le risorse create. Per ulteriori informazioni, vedi Pulizia.

Prima di iniziare

Configura il progetto

  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, click Create project to begin creating a new Google Cloud project.

    Go to project selector

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

  4. Enable the GKE API.

    Enable the API

  5. In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.

    Go to project selector

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

  7. Enable the GKE API.

    Enable the API

  8. Impostare i valori predefiniti per Google Cloud CLI

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

    2. Scarica il codice sorgente di 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 Google Cloud ID progetto.
      • COMPUTE_REGION: la regione 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 vengono scalate 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 Workload Identity Federation for GKE

    Per consentire al cluster di accedere al bucket Cloud Storage, procedi nel seguente modo:

    1. Crea un Google Cloud service account.
    2. Crea un ServiceAccount Kubernetes nel cluster.
    3. Associa il service account Kubernetes al service account Google Cloud .

    Crea un Google Cloud service account

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

      Vai a Crea service account

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

    3. Fai clic su Crea e continua.

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

    5. Fai clic su Aggiungi un altro ruolo.

    6. Nell'elenco Seleziona un ruolo, seleziona il ruolo Cloud Storage > Storage Object Admin.

    7. Fai clic su Continua, poi su Fine.

    Crea un ServiceAccount Kubernetes nel tuo cluster

    In Cloud Shell:

    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 il service account Kubernetes al service account Google Cloud

    In Cloud Shell, esegui questi comandi:

    1. Aggiungi un binding IAM al service account 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 il service account 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 a seconda del framework che vuoi utilizzare:

    Triton

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

      gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursive
      
    2. Esegui il deployment del framework utilizzando un deployment. Un deployment è un oggetto API Kubernetes che consente di eseguire più repliche di pod distribuite tra i nodi di un cluster:

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

    TF Serving

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

      gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursive
      
    2. Esegui il deployment del framework utilizzando un deployment. Un deployment è un oggetto API Kubernetes che consente di eseguire più repliche di pod distribuite tra i nodi di un cluster:

      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

    Triton

    1. Crea un ambiente virtuale Python in Cloud Shell.

      python -m venv ./mnist_client
      source ./mnist_client/bin/activate
      
    2. Installa 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 corrispondente all'immagine che vuoi testare. Puoi utilizzare le immagini archiviate in src/client/images.

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

      Calling Triton HTTP Service      ->      Prediction result: 7
      

    TF Serving

    1. Crea un ambiente virtuale Python in Cloud Shell.

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

      pip install -r src/client/tfserve-requirements.txt
      
    3. Testa 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 utilizzare le immagini archiviate in src/client/images.

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

      Calling TensorFlow Serve HTTP Service    ->      Prediction result: 5
    

    Osserva le prestazioni del modello

    Triton

    Per osservare le prestazioni del modello, puoi utilizzare l'integrazione della dashboard Triton in Cloud Monitoring. Con questa dashboard puoi visualizzare metriche sul rendimento critiche come il throughput dei token, la latenza delle richieste e i tassi di errore.

    Per utilizzare la dashboard Triton, devi abilitare Google Cloud Managed Service per Prometheus, che raccoglie le metriche da Triton, nel tuo cluster GKE. Triton espone le metriche nel formato Prometheus per impostazione predefinita, non è necessario installare un esportatore aggiuntivo.

    Puoi quindi visualizzare le metriche utilizzando la dashboard Triton. Per informazioni sull'utilizzo di Google Cloud Managed Service per Prometheus per raccogliere le metriche dal modello, consulta le indicazioni sull'osservabilità di Triton nella documentazione di Cloud Monitoring.

    TF Serving

    Per osservare il rendimento del modello, puoi utilizzare l'integrazione della dashboard TF Serving in Cloud Monitoring. Con questa dashboard puoi visualizzare metriche sul rendimento critiche come il throughput dei token, la latenza delle richieste e i tassi di errore.

    Per utilizzare la dashboard TF Serving, devi abilitare Google Cloud Managed Service per Prometheus, che raccoglie le metriche da TF Serving, nel tuo cluster GKE.

    Puoi quindi visualizzare le metriche utilizzando la dashboard TF Serving. Per informazioni sull'utilizzo di Google Cloud Managed Service per Prometheus per raccogliere metriche dal tuo modello, consulta le indicazioni sull'osservabilità di TF Serving nella documentazione di Cloud Monitoring.

    Esegui la pulizia

    Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse che hai creato in questa guida, procedi in uno dei seguenti modi:

    • Mantieni il cluster GKE: elimina le risorse Kubernetes nel cluster e le risorse Google Cloud
    • Mantieni 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:

    Triton

    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
    

    TF Serving

    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 per PROJECT_ID-gke-bucket.

      3. Fai clic su Elimina.

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

    2. Elimina il service account Google Cloud :

      1. Vai alla pagina Service Accounts:

        Vai ad Account di servizio

      2. Seleziona il progetto.

      3. Seleziona la casella di controllo per 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 Google Cloud risorse

    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 per PROJECT_ID-gke-bucket.

      3. Fai clic su Elimina.

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

    3. Elimina il service account Google Cloud :

      1. Vai alla pagina Service Accounts:

        Vai ad Account di servizio

      2. Seleziona il progetto.

      3. Seleziona la casella di controllo per 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. 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