Pubblica LLM su GKE con una strategia di provisioning GPU ottimizzata in termini di costi e ad alta disponibilità


Questa guida mostra come ottimizzare i costi del carico di lavoro quando esegui il deployment di un modello linguistico di grandi dimensioni (LLM). L'infrastruttura GKE utilizza una combinazione di modalità di provisioning con inizio flessibile, VM spot e profili di classi di calcolo personalizzate per ottimizzare i costi del carico di lavoro.

Questa guida utilizza Mixtral 8x7b come esempio di LLM che puoi implementare.

Questa guida è rivolta a ingegneri del machine learning (ML), amministratori e operatori della piattaforma e a specialisti di dati e IA interessati a utilizzare le funzionalità di orchestrazione dei container Kubernetes per la pubblicazione di LLM. Per ulteriori informazioni sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei Google Cloud contenuti, consulta Ruoli e attività utente comuni di GKE Enterprise.

Sfondo

Questa sezione descrive le tecniche disponibili che puoi utilizzare per ottenere risorse di calcolo, inclusi gli acceleratori GPU, in base ai requisiti dei tuoi carichi di lavoro di AI/ML. Queste tecniche sono chiamate strategie di reperibilità degli acceleratori in GKE.

GPU

Le GPU (unità di elaborazione grafica) ti consentono di accelerare carichi di lavoro specifici come il machine learning e l'elaborazione di dati. GKE offre nodi dotati di queste potenti GPU per ottimizzare le prestazioni delle attività di machine learning e di elaborazione dei dati. GKE offre una gamma di opzioni di tipi di macchine per la configurazione dei nodi, inclusi i tipi di macchine con GPU NVIDIA H100, A100 e L4.

Per ulteriori informazioni, consulta Informazioni sulle GPU in GKE.

Modalità di provisioning con avvio flessibile

La modalità di provisioning con avvio flessibile è un tipo di prenotazione di GPU in cui GKE mantiene la richiesta di GPU e esegue automaticamente il provisioning delle risorse quando la capacità diventa disponibile. Valuta la possibilità di utilizzare la modalità di provisioning con avvio flessibile per i carichi di lavoro che richiedono capacità GPU per un periodo di tempo limitato, fino a sette giorni, e non hanno una data di inizio fissa. Per ulteriori informazioni, consulta la modalità di provisioning flex-start.

VM spot

Puoi utilizzare le GPU con le VM spot se i tuoi carichi di lavoro possono tollerare interruzioni frequenti dei nodi. L'utilizzo di VM Spot o della modalità di provisioning con avvio flessibile riduce il prezzo delle GPU in esecuzione. L'utilizzo delle VM spot combinato con la modalità di provisioning con avvio flessibile offre un'opzione di riserva quando la capacità delle VM spot non è disponibile.

Per ulteriori informazioni, consulta Utilizzare le VM spot con i pool di nodi GPU.

Classi di calcolo personalizzate

Puoi richiedere GPU utilizzando classi di calcolo personalizzate. Le classi di calcolo personalizzate consentono di definire una gerarchia di configurazioni dei nodi per consentire a GKE di dare la priorità durante le decisioni di scalabilità dei nodi, in modo che i workload vengano eseguiti sull'hardware selezionato. Per ulteriori informazioni, consulta Informazioni sulle classi di calcolo personalizzate.

Prima di iniziare

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

    Go to project selector

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

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

    Go to project selector

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

  • Make sure that you have the following role or roles on the project:

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      Vai a IAM
    2. Seleziona il progetto.
    3. Fai clic su Concedi accesso.
    4. Nel campo Nuovi principali, inserisci il tuo identificatore utente. In genere si tratta dell'indirizzo email di un Account Google.

    5. Nell'elenco Seleziona un ruolo, seleziona un ruolo.
    6. Per concedere altri ruoli, fai clic su Aggiungi un altro ruolo e aggiungi ogni ruolo aggiuntivo.
    7. Fai clic su Salva.

Ottieni l'accesso al modello

Se non ne hai già uno, genera un nuovo token Hugging Face:

  1. Fai clic su Il tuo profilo > Impostazioni > Token di accesso.
  2. Seleziona Nuovo token.
  3. Specifica un nome a tua scelta e un ruolo di almeno Read.
  4. Seleziona Genera un token.

Creare un profilo della classe di calcolo personalizzato

In questa sezione, crei un profilo della classe di calcolo personalizzato. I profili delle classi di calcolo personalizzate definiscono i tipi e le relazioni tra più risorse di calcolo utilizzate dal tuo carico di lavoro.

  1. Nella Google Cloud console, avvia una sessione di Cloud Shell facendo clic su Icona di attivazione di Cloud Shell Attiva Cloud Shell nella Google Cloud console. Si apre una sessione nel riquadro inferiore della Google Cloud console.
  2. Crea un file manifest dws-flex-start.yaml:

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: dws-model-inference-class
    spec:
      priorities:
        - machineType: g2-standard-24
          spot: true
        - machineType: g2-standard-24
          flexStart:
            enabled: true
            nodeRecycling:
              leadTimeSeconds: 3600
      nodePoolAutoCreation:
        enabled: true
    
  3. Applica il manifest dws-flex-start.yaml:

    kubectl apply -f dws-flex-start.yaml
    

GKE esegue il deployment di macchine g2-standard-24 con acceleratori L4. GKE utilizza classi di calcolo per dare priorità alle VM spot e, in secondo luogo, alla modalità di provisioning flex-start.

Esegui il deployment del carico di lavoro LLM

  1. Crea un secret Kubernetes contenente il token Hugging Face utilizzando il seguente comando:

    kubectl create secret generic model-inference-secret \
        --from-literal=HUGGING_FACE_TOKEN=HUGGING_FACE_TOKEN \
        --dry-run=client -o yaml | kubectl apply -f -
    

    Sostituisci HUGGING_FACE_TOKEN con il tuo token di accesso Hugging Face.

  2. Crea un file denominato mixtral-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: inference-mixtral-ccc
    spec:
      nodeSelector:
        cloud.google.com/compute-class: dws-model-inference-class
      replicas: 1
      selector:
        matchLabels:
          app: llm
      template:
        metadata:
          labels:
            app: llm
        spec:
          containers:
          - name: llm
            image: us-docker.pkg.dev/deeplearning-platform-release/gcr.io/huggingface-text-generation-inference-cu124.2-3.ubuntu2204.py311
            resources:
              requests:
                cpu: "5"
                memory: "40Gi"
                nvidia.com/gpu: "2"
              limits:
                cpu: "5"
                memory: "40Gi"
                nvidia.com/gpu: "2"
            env:
            - name: MODEL_ID
              value: mistralai/Mixtral-8x7B-Instruct-v0.1
            - name: NUM_SHARD
              value: "2"
            - name: PORT
              value: "8080"
            - name: QUANTIZE
              value: bitsandbytes-nf4
            - name: HUGGING_FACE_HUB_TOKEN
              valueFrom:
                secretKeyRef:
                  name: model-inference-secret
                  key: HUGGING_FACE_TOKEN
            volumeMounts:
              - mountPath: /dev/shm
                name: dshm
              - mountPath: /tmp
                name: ephemeral-volume
          volumes:
            - name: dshm
              emptyDir:
                  medium: Memory
            - name: ephemeral-volume
              ephemeral:
                volumeClaimTemplate:
                  metadata:
                    labels:
                      type: ephemeral
                  spec:
                    accessModes: ["ReadWriteOnce"]
                    storageClassName: "premium-rwo"
                    resources:
                      requests:
                        storage: 100Gi
    

    In questo manifest, il campo mountPath è impostato su /tmp, perché è il percorso in cui è impostata la variabile di ambiente HF_HOME nel contenitore di deep learning (DLC) per l'inferenza di generazione di testo (TGI), anziché il percorso /data predefinito impostato nell'immagine predefinita di TGI. Il modello scaricato verrà archiviato in questa directory.

  3. Esegui il deployment del modello:

    kubectl apply -f  mixtral-deployment.yaml
    

    GKE pianifica il deployment di un nuovo pod, che attiva il gestore della scalabilità automatica del node pool per aggiungere un secondo nodo prima di eseguire il deployment della seconda replica del modello.

  4. Verifica lo stato del modello:

    watch kubectl get deploy inference-mixtral-ccc
    

    Se il deployment del modello è andato a buon fine, l'output è simile al seguente:

    NAME                   READY   UP-TO-DATE   AVAILABLE   AGE
    inference-mixtral-ccc  1/1     1            1           10m
    

    Per uscire dallo smartwatch, premi CTRL + C.

  5. Visualizza i node pool di cui è stato eseguito il provisioning da GKE:

    kubectl get nodes -L cloud.google.com/gke-nodepool
    

    L'output è simile al seguente:

      NAME                                                  STATUS   ROLES    AGE   VERSION               GKE-NODEPOOL
      gke-flex-na-nap-g2-standard--0723b782-fg7v   Ready       10m   v1.32.3-gke.1152000   nap-g2-standard-24-spot-gpu2-1gbdlbxz
      gke-flex-nap-zo-default-pool-09f6fe53-fzm8   Ready       32m   v1.32.3-gke.1152000   default-pool
      gke-flex-nap-zo-default-pool-09f6fe53-lv2v   Ready       32m   v1.32.3-gke.1152000   default-pool
      gke-flex-nap-zo-default-pool-09f6fe53-pq6m   Ready       32m   v1.32.3-gke.1152000   default-pool
    

    Il nome del pool di nodi creato indica il tipo di macchina. In questo caso, GKE ha eseguito il provisioning delle VM Spot.

Interagisci con il modello utilizzando curl

Questa sezione mostra come eseguire un test di inferenza di base per verificare il modello di cui è stato eseguito il deployment.

  1. Configura il port forwarding per il modello:

    kubectl port-forward service/llm-service 8080:8080
    

    L'output è simile al seguente:

    Forwarding from 127.0.0.1:8080 -> 8080
    
  2. In una nuova sessione del terminale, chatta con il tuo modello utilizzando curl:

    curl http://localhost:8080/v1/completions \
    -X POST \
    -H "Content-Type: application/json" \
    -d '{
        "model": "mixtral-8x7b-instruct-gptq",
        "prompt": "[INST]Who was the first president of the United States?[/INST]",
        "max_tokens": 40}'
    

    L'output è simile al seguente:

    George Washington was a Founding Father and the first president of the United States, serving from 1789 to 1797.
    

Esegui la pulizia

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

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.

Elimina la singola risorsa

  1. Elimina le risorse Kubernetes che hai creato da questa guida:

    kubectl delete deployment inference-mixtral-ccc
    kubectl delete service llm-service
    kubectl delete computeclass dws-model-inference-class
    kubectl delete secret model-inference-secret
    
  2. Elimina il cluster:

    gcloud container clusters delete CLUSTER_NAME
    

Passaggi successivi