Gestisci LLM su GKE con una strategia di provisioning delle GPU con ottimizzazione dei costi e alta disponibilità

Questa guida mostra come ottimizzare i costi per i workload di servizio LLM su GKE. Questo tutorial utilizza una combinazione di VM con inizio flessibile, VM spot e ComputeClass per un'inferenza conveniente.

Questa guida utilizza Mixtral 8x7b come esempio di LLM che puoi eseguire il deployment.

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

Prezzi con avvio flessibile

L'avvio flessibile è consigliato se il tuo workload richiede risorse di cui viene eseguito il provisioning dinamico in base alle necessità, per un massimo di sette giorni con prenotazioni a breve termine, senza gestione complessa delle quote e con accesso conveniente. L'inizio flessibile è basato su Dynamic Workload Scheduler e viene fatturato in base ai prezzi di Dynamic Workload Scheduler:

  • Scontati (fino al 53%) per vCPU, GPU e TPU.
  • Paghi in base al consumo.

Sfondo

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

GPU

Le GPU (Graphics Processing Unit) ti consentono di accelerare carichi di lavoro specifici come machine learning ed elaborazione di dati. GKE offre nodi dotati di queste potenti GPU per ottimizzare le prestazioni delle attività di machine learning e trattamento dati. GKE offre una gamma di opzioni di tipo di macchina per la configurazione dei nodi, inclusi i tipi di macchina con GPU NVIDIA H100, A100 e L4.

Per saperne di più, consulta Informazioni sulle GPU in GKE.

Avvio flessibile

L'inizio flessibile, basato su Dynamic Workload Scheduler, è un'opzione di consumo di GPU in cui GKE mantiene la tua richiesta di GPU e esegue automaticamente il provisioning delle VM con inizio flessibile quando la capacità diventa disponibile. Valuta la possibilità di utilizzare l'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 saperne di più, consulta Avvio flessibile.

VM spot

Puoi utilizzare le GPU con le VM spot se i tuoi workload possono tollerare interruzioni frequenti dei nodi. L'utilizzo di VM spot o dell'avvio flessibile riduce il prezzo di esecuzione delle GPU. L'utilizzo delle VM spot in combinazione con l'avvio flessibile fornisce un'opzione di fallback quando la capacità delle VM spot non è disponibile.

Per saperne di più, consulta Utilizzo delle VM spot con i pool di nodi GPU.

ComputeClasses

Puoi richiedere GPU utilizzando ComputeClasses. Le ComputeClass ti consentono di definire una gerarchia di configurazioni dei nodi che GKE deve dare la priorità durante le decisioni di scalabilità dei nodi, in modo che i workload vengano eseguiti sull'hardware selezionato. Per maggiori informazioni, consulta Informazioni su ComputeClass personalizzate.

Prima di iniziare

  • 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 senza costi per l'esecuzione, il test e il deployment dei workload.
  • In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

  • Verify 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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator role (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

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

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

Crea un ComputeClass

In questa sezione, creerai una ComputeClass personalizzata. ComputeClasses definisce i tipi e le relazioni tra più risorse di calcolo utilizzate dal tuo workload.

  1. Nella console Google Cloud , 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 console Google Cloud .
  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 g2-standard-24 macchine con acceleratori L4. GKE utilizza ComputeClasses per dare la priorità prima alle VM spot e poi alle VM con inizio flessibile.

Esegui il deployment del carico di lavoro LLM

  1. Crea un secret Kubernetes che contenga 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:
      replicas: 1
      selector:
        matchLabels:
          app: llm
      template:
        metadata:
          labels:
            app: llm
        spec:
          nodeSelector:
            cloud.google.com/compute-class: dws-model-inference-class
          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 Deep Learning Container (DLC) per Text Generation Inference (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, il che attiva il gestore della scalabilità automaticapool di nodil 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 è stato eseguito correttamente, 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. Attendi il download del contenitore e l'inizio della distribuzione del modello:

    watch "kubectl logs $(kubectl get pods -l app=llm -o custom-columns=:metadata.name --no-headers) | tail"
    

    Per uscire dallo smartwatch, premi CTRL + C.

  6. Visualizza i node pool di cui è stato eseguito il provisioning da parte di 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    <none>   10m   v1.32.3-gke.1152000   nap-g2-standard-24-spot-gpu2-1gbdlbxz
      gke-flex-nap-zo-default-pool-09f6fe53-fzm8   Ready    <none>   32m   v1.32.3-gke.1152000   default-pool
      gke-flex-nap-zo-default-pool-09f6fe53-lv2v   Ready    <none>   32m   v1.32.3-gke.1152000   default-pool
      gke-flex-nap-zo-default-pool-09f6fe53-pq6m   Ready    <none>   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.

  7. Esporre il modello:

    kubectl expose deployment/inference-mixtral-ccc --port 8080 --name=llm-service
    

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 sul 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": "<s>[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. Nella console Google Cloud , vai alla pagina Gestisci risorse.

    Vai a Gestisci risorse

  2. Nell'elenco dei progetti, seleziona quello 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.

Elimina la singola risorsa

  1. Elimina le risorse Kubernetes che hai creato in 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