Questo tutorial mostra come eseguire il deployment e pubblicare un modello linguistico di grandi dimensioni (LLM) utilizzando più GPU su GKE per un'inferenza efficiente e scalabile. Crea un cluster GKE che utilizza più GPU L4 e prepara l'infrastruttura per gestire uno dei seguenti modelli:
A seconda del formato dei dati del modello, il numero di GPU richiesto varia. In questo tutorial, ogni modello utilizza due GPU L4. Per saperne di più, consulta Calcolo della quantità di GPU.
Questo tutorial è rivolto a ingegneri di machine learning (ML), amministratori e operatori di piattaforme e a specialisti di dati e AI interessati a utilizzare le funzionalità di orchestrazione dei container Kubernetes per la pubblicazione di LLM. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui viene fatto riferimento nei contenuti di Google Cloud questa pagina, consulta Ruoli e attività comuni degli utenti GKE.
Prima di leggere questa pagina, assicurati di avere familiarità con quanto segue:
Obiettivi
In questo tutorial:
- Crea un cluster e i node pool.
- Prepara il workload.
- Esegui il deployment del workload.
- Interagisci con l'interfaccia LLM.
Prima di iniziare
Prima di iniziare, assicurati di aver eseguito le seguenti operazioni:
- Attiva l'API Google Kubernetes Engine. Attiva l'API Google Kubernetes Engine
- Se vuoi utilizzare Google Cloud CLI per questa attività,
installala e poi
inizializza
gcloud CLI. Se hai già installato gcloud CLI, scarica l'ultima
versione eseguendo il comando
gcloud components update. Le versioni precedenti di gcloud CLI potrebbero non supportare l'esecuzione dei comandi in questo documento.
Alcuni modelli hanno requisiti aggiuntivi. Assicurati di soddisfare i seguenti requisiti:
- Per accedere ai modelli di Hugging Face, utilizza un token HuggingFace.
- Per il modello Mixtral 8x7b, accetta le condizioni per il modello Mistral Mixtral.
- Per il modello Llama 3 70b, assicurati di avere una licenza attiva per i modelli Meta Llama.
prepara l'ambiente
Nella console Google Cloud , avvia un'istanza Cloud Shell:
Apri Cloud ShellImposta le variabili di ambiente predefinite:
gcloud config set project PROJECT_ID gcloud config set billing/quota_project PROJECT_ID export PROJECT_ID=$(gcloud config get project) export CONTROL_PLANE_LOCATION=us-central1Sostituisci PROJECT_ID con il tuo Google Cloud ID progetto.
Crea un cluster GKE e un pool di nodi
Puoi gestire LLM su GPU in un cluster GKE Autopilot o Standard. Ti consigliamo di utilizzare un cluster Autopilot per un'esperienza Kubernetes completamente gestita. Per scegliere la modalità operativa GKE più adatta ai tuoi workload, consulta Scegliere una modalità operativa GKE.
Autopilot
In Cloud Shell, esegui questo comando:
gcloud container clusters create-auto l4-demo \ --project=${PROJECT_ID} \ --location=${CONTROL_PLANE_LOCATION} \ --release-channel=rapidGKE crea un cluster Autopilot con nodi CPU e GPU come richiesto dai carichi di lavoro di cui è stato eseguito il deployment.
Configura
kubectlper comunicare con il cluster:gcloud container clusters get-credentials l4-demo --location=${CONTROL_PLANE_LOCATION}
Standard
In Cloud Shell, esegui questo comando per creare un cluster Standard che utilizza la federazione delle identità per i carichi di lavoro per GKE:
gcloud container clusters create l4-demo \ --location ${CONTROL_PLANE_LOCATION} \ --workload-pool ${PROJECT_ID}.svc.id.goog \ --enable-image-streaming \ --node-locations=${CONTROL_PLANE_LOCATION}-a \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --machine-type n2d-standard-4 \ --num-nodes 1 --min-nodes 1 --max-nodes 5 \ --release-channel=rapidLa creazione del cluster potrebbe richiedere diversi minuti.
Esegui questo comando per creare un node pool per il tuo cluster:
gcloud container node-pools create g2-standard-24 --cluster l4-demo \ --location ${CONTROL_PLANE_LOCATION} \ --accelerator type=nvidia-l4,count=2,gpu-driver-version=latest \ --machine-type g2-standard-24 \ --enable-autoscaling --enable-image-streaming \ --num-nodes=0 --min-nodes=0 --max-nodes=3 \ --node-locations ${CONTROL_PLANE_LOCATION}-a,${CONTROL_PLANE_LOCATION}-c \ --spotGKE crea le seguenti risorse per l'LLM:
- Un cluster Standard pubblico.
- Un pool di nodi con il tipo di macchina
g2-standard-24ridimensionato a 0 nodi. Non ti vengono addebitati costi per le GPU finché non avvii i pod che le richiedono. Questo pool di nodi esegue il provisioning di VM spot, che hanno un prezzo inferiore rispetto alle VM Compute Engine standard predefinite e non offrono alcuna garanzia di disponibilità. Puoi rimuovere il flag--spotda questo comando e il selettore di nodicloud.google.com/gke-spotnella configurazionetext-generation-inference.yamlper utilizzare le VM on demand.
Configura
kubectlper comunicare con il cluster:gcloud container clusters get-credentials l4-demo --location=${CONTROL_PLANE_LOCATION}
Prepara il workload
Questa sezione mostra come configurare il workload in base al modello che vuoi utilizzare. Questo tutorial utilizza i deployment Kubernetes per eseguire il deployment del modello. Un deployment è un oggetto API Kubernetes che ti consente di eseguire più repliche di pod distribuite tra i nodi di un cluster.
Llama 3 70b
Imposta le variabili di ambiente predefinite:
export HF_TOKEN=HUGGING_FACE_TOKENSostituisci
HUGGING_FACE_TOKENcon il tuo token HuggingFace.Crea un secret Kubernetes per il token HuggingFace:
kubectl create secret generic l4-demo \ --from-literal=HUGGING_FACE_TOKEN=${HF_TOKEN} \ --dry-run=client -o yaml | kubectl apply -f -Crea il seguente manifest di deployment
text-generation-inference.yaml:In questo manifest:
NUM_SHARDdeve essere2perché il modello richiede due GPU NVIDIA L4.QUANTIZEè impostato subitsandbytes-nf4, il che significa che il modello viene caricato a 4 bit anziché a 32 bit. Ciò consente a GKE di ridurre la quantità di memoria GPU necessaria e migliora la velocità di inferenza. Tuttavia, l'accuratezza del modello può diminuire. Per scoprire come calcolare le GPU da richiedere, consulta Calcolo della quantità di GPU.
Applica il manifest:
kubectl apply -f text-generation-inference.yamlL'output è simile al seguente:
deployment.apps/llm createdVerifica lo stato del modello:
kubectl get deployL'output è simile al seguente:
NAME READY UP-TO-DATE AVAILABLE AGE llm 1/1 1 1 20mVisualizza i log del deployment in esecuzione:
kubectl logs -l app=llmL'output è simile al seguente:
{"timestamp":"2024-03-09T05:08:14.751646Z","level":"INFO","message":"Warming up model","target":"text_generation_router","filename":"router/src/main.rs","line_number":291} {"timestamp":"2024-03-09T05:08:19.961136Z","level":"INFO","message":"Setting max batch total tokens to 133696","target":"text_generation_router","filename":"router/src/main.rs","line_number":328} {"timestamp":"2024-03-09T05:08:19.961164Z","level":"INFO","message":"Connected","target":"text_generation_router","filename":"router/src/main.rs","line_number":329} {"timestamp":"2024-03-09T05:08:19.961171Z","level":"WARN","message":"Invalid hostname, defaulting to 0.0.0.0","target":"text_generation_router","filename":"router/src/main.rs","line_number":343}
Mixtral 8x7b
Imposta le variabili di ambiente predefinite:
export HF_TOKEN=HUGGING_FACE_TOKENSostituisci
HUGGING_FACE_TOKENcon il tuo token HuggingFace.Crea un secret Kubernetes per il token HuggingFace:
kubectl create secret generic l4-demo \ --from-literal=HUGGING_FACE_TOKEN=${HF_TOKEN} \ --dry-run=client -o yaml | kubectl apply -f -Crea il seguente manifest di deployment
text-generation-inference.yaml:In questo manifest:
NUM_SHARDdeve essere2perché il modello richiede due GPU NVIDIA L4.QUANTIZEè impostato subitsandbytes-nf4, il che significa che il modello viene caricato a 4 bit anziché a 32 bit. Ciò consente a GKE di ridurre la quantità di memoria GPU necessaria e migliora la velocità di inferenza. Tuttavia, ciò potrebbe ridurre l'accuratezza del modello. Per scoprire come calcolare il numero di GPU da richiedere, consulta Calcolo della quantità di GPU.
Applica il manifest:
kubectl apply -f text-generation-inference.yamlL'output è simile al seguente:
deployment.apps/llm createdVerifica lo stato del modello:
watch kubectl get deployQuando il deployment è pronto, l'output è simile al seguente:
NAME READY UP-TO-DATE AVAILABLE AGE llm 1/1 1 1 10mPer uscire dallo smartwatch, digita
CTRL + C.Visualizza i log del deployment in esecuzione:
kubectl logs -l app=llmL'output è simile al seguente:
{"timestamp":"2024-03-09T05:08:14.751646Z","level":"INFO","message":"Warming up model","target":"text_generation_router","filename":"router/src/main.rs","line_number":291} {"timestamp":"2024-03-09T05:08:19.961136Z","level":"INFO","message":"Setting max batch total tokens to 133696","target":"text_generation_router","filename":"router/src/main.rs","line_number":328} {"timestamp":"2024-03-09T05:08:19.961164Z","level":"INFO","message":"Connected","target":"text_generation_router","filename":"router/src/main.rs","line_number":329} {"timestamp":"2024-03-09T05:08:19.961171Z","level":"WARN","message":"Invalid hostname, defaulting to 0.0.0.0","target":"text_generation_router","filename":"router/src/main.rs","line_number":343}
Falcon 40b
Crea il seguente manifest di deployment
text-generation-inference.yaml:In questo manifest:
NUM_SHARDdeve essere2perché il modello richiede due GPU NVIDIA L4.QUANTIZEè impostato subitsandbytes-nf4, il che significa che il modello viene caricato a 4 bit anziché a 32 bit. Ciò consente a GKE di ridurre la quantità di memoria GPU necessaria e migliora la velocità di inferenza. Tuttavia, l'accuratezza del modello può diminuire. Per scoprire come calcolare il numero di GPU da richiedere, consulta Calcolo della quantità di GPU.
Applica il manifest:
kubectl apply -f text-generation-inference.yamlL'output è simile al seguente:
deployment.apps/llm createdVerifica lo stato del modello:
watch kubectl get deployQuando il deployment è pronto, l'output è simile al seguente:
NAME READY UP-TO-DATE AVAILABLE AGE llm 1/1 1 1 10mPer uscire dallo smartwatch, digita
CTRL + C.Visualizza i log del deployment in esecuzione:
kubectl logs -l app=llmL'output è simile al seguente:
{"timestamp":"2024-03-09T05:08:14.751646Z","level":"INFO","message":"Warming up model","target":"text_generation_router","filename":"router/src/main.rs","line_number":291} {"timestamp":"2024-03-09T05:08:19.961136Z","level":"INFO","message":"Setting max batch total tokens to 133696","target":"text_generation_router","filename":"router/src/main.rs","line_number":328} {"timestamp":"2024-03-09T05:08:19.961164Z","level":"INFO","message":"Connected","target":"text_generation_router","filename":"router/src/main.rs","line_number":329} {"timestamp":"2024-03-09T05:08:19.961171Z","level":"WARN","message":"Invalid hostname, defaulting to 0.0.0.0","target":"text_generation_router","filename":"router/src/main.rs","line_number":343}
Crea un servizio di tipo ClusterIP
Esporre i pod internamente al cluster in modo che possano essere rilevati e accessibili da altre applicazioni.
Crea il seguente manifest
llm-service.yaml:apiVersion: v1 kind: Service metadata: name: llm-service spec: selector: app: llm type: ClusterIP ports: - protocol: TCP port: 80 targetPort: 8080Applica il manifest:
kubectl apply -f llm-service.yaml
Esegui il deployment di un'interfaccia di chat
Utilizza Gradio per creare un'applicazione web che ti consenta di interagire con il tuo modello. Gradio è una libreria Python che include un wrapper ChatInterface che crea interfacce utente per chatbot.
Llama 3 70b
Crea un file denominato
gradio.yaml:Applica il manifest:
kubectl apply -f gradio.yamlTrova l'indirizzo IP esterno del servizio:
kubectl get svcL'output è simile al seguente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE gradio-service LoadBalancer 10.24.29.197 34.172.115.35 80:30952/TCP 125mCopia l'indirizzo IP esterno dalla colonna
EXTERNAL-IP.Visualizza l'interfaccia del modello dal browser web utilizzando l'indirizzo IP esterno con la porta esposta:
http://EXTERNAL_IP
Mixtral 8x7b
Crea un file denominato
gradio.yaml:Applica il manifest:
kubectl apply -f gradio.yamlTrova l'indirizzo IP esterno del servizio:
kubectl get svcL'output è simile al seguente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE gradio-service LoadBalancer 10.24.29.197 34.172.115.35 80:30952/TCP 125mCopia l'indirizzo IP esterno dalla colonna
EXTERNAL-IP.Visualizza l'interfaccia del modello dal browser web utilizzando l'indirizzo IP esterno con la porta esposta:
http://EXTERNAL_IP
Falcon 40b
Crea un file denominato
gradio.yaml:Applica il manifest:
kubectl apply -f gradio.yamlTrova l'indirizzo IP esterno del servizio:
kubectl get svcL'output è simile al seguente:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE gradio-service LoadBalancer 10.24.29.197 34.172.115.35 80:30952/TCP 125mCopia l'indirizzo IP esterno dalla colonna
EXTERNAL-IP.Visualizza l'interfaccia del modello dal browser web utilizzando l'indirizzo IP esterno con la porta esposta:
http://EXTERNAL_IP
Calcolare la quantità di GPU
Il numero di GPU dipende dal valore del flag QUANTIZE. In questo
tutorial, QUANTIZE è impostato su bitsandbytes-nf4, il che significa che il modello viene
caricato in 4 bit.
Un modello con 70 miliardi di parametri richiederebbe un minimo di 40 GB di memoria GPU, che equivale a 70 miliardi di volte 4 bit (70 miliardi x 4 bit= 35 GB) e considera un overhead di 5 GB. In questo caso, una singola GPU L4 non avrebbe memoria sufficiente. Pertanto, gli esempi di questo tutorial utilizzano due GPU L4 di memoria (2 x 24 = 48 GB). Questa configurazione è sufficiente per eseguire Falcon 40b o Llama 3 70b nelle GPU L4.
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.
Elimina il cluster
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse che hai creato in questa guida, elimina il cluster GKE:
gcloud container clusters delete l4-demo --location ${CONTROL_PLANE_LOCATION}