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. In questo modo, puoi comprendere ed esplorare il deployment pratico degli 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 (ML), amministratori e operatori della piattaforma e a 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 Ruoli utente e attività comuni di GKE.
Prima di leggere questa pagina, assicurati di avere familiarità con quanto segue:
Obiettivi
- Crea un cluster GKE Autopilot o Standard.
- Configura un bucket Cloud Storage in cui si trova il modello pre-addestrato.
- Esegui il deployment del framework di inferenza online che selezioni.
- 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, consulta Esegui la pulizia.
Prima di iniziare
Configura il progetto
- 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 carichi di lavoro.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
Roles required to create a project
To create a project, you need the Project Creator role (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. -
Verify that billing is enabled for your Google Cloud project.
Enable the GKE API, if it is not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
Roles required to create a project
To create a project, you need the Project Creator role (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. -
Verify that billing is enabled for your Google Cloud project.
Enable the GKE API, if it is not already enabled.
Roles required to enable APIs
To enable APIs, you need the
serviceusage.services.enablepermission. If you created the project, then you likely already have this permission through the Owner role (roles/owner). Otherwise, you can get this permission through the Service Usage Admin role (roles/serviceusage.serviceUsageAdmin). Learn how to grant roles.
Imposta i valori predefiniti per Google Cloud CLI
Nella console Google Cloud , avvia un'istanza Cloud Shell:
Apri Cloud ShellScarica 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-gpuImposta le variabili di ambiente predefinite:
gcloud config set project PROJECT_ID gcloud config set compute/region COMPUTE_REGIONSostituisci 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-central1per la GPU L4.
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 erogare 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 workload, consulta Scegliere una modalità operativa GKE.
Autopilot
Esegui questo comando per creare un cluster GKE Autopilot:
gcloud container clusters create-auto ${CLUSTER_NAME} \
--location=${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
Esegui questo comando per creare un cluster GKE Standard:
gcloud container clusters create ${CLUSTER_NAME} \ --project=${PROJECT_ID} \ --location=${REGION} \ --workload-pool=${PROJECT_ID}.svc.id.goog \ --addons GcsFuseCsiDriver \ --release-channel=rapid \ --num-nodes=1La creazione del cluster potrebbe richiedere diversi minuti.
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=1GKE 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 --uniform-bucket-level-access
Configura il cluster per accedere al bucket utilizzando Workload Identity Federation for GKE
Per consentire al cluster di accedere al bucket Cloud Storage, procedi come segue:
- Crea un ServiceAccount Kubernetes nel cluster.
- Concedi ruoli IAM al service account Kubernetes.
Crea un ServiceAccount Kubernetes nel tuo cluster
In Cloud Shell:
Crea uno spazio dei nomi Kubernetes:
kubectl create namespace gke-ai-namespaceCrea un service account Kubernetes nello spazio dei nomi:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
Concedi ruoli IAM al service account Kubernetes
In Cloud Shell, concedi i ruoli Storage Object Admin (roles/storage.objectAdmin)
e Storage Insights Collector Service
(roles/storage.insightsCollectorService) al service account Kubernetes:
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/gke-ai-namespace/sa/gpu-k8s-sa" \
--role=roles/storage.objectAdmin \
--condition=None
gcloud projects add-iam-policy-binding PROJECT_ID \
--member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/gke-ai-namespace/sa/gpu-k8s-sa" \
--role=roles/storage.insightsCollectorService \
--condition=None
Sostituisci quanto segue:
PROJECT_ID: il tuo ID progetto Google Cloud .PROJECT_NUMBER: il tuo numero di progetto Google Cloud .
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
In Cloud Shell, copia il modello ML preaddestrato nel bucket Cloud Storage:
gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursiveEsegui il deployment del framework utilizzando un deployment. Un deployment è un oggetto API Kubernetes che consente di eseguire più repliche di pod distribuiti tra i nodi di un cluster:
envsubst < src/gke-config/deployment-triton.yaml | kubectl --namespace=gke-ai-namespace apply -f -Verifica che GKE abbia eseguito il deployment del framework:
kubectl get deployments --namespace=gke-ai-namespaceQuando il framework è pronto, l'output è simile al seguente:
NAME READY UP-TO-DATE AVAILABLE AGE triton-deployment 1/1 1 1 5m29sEsegui il deployment dei servizi per accedere al deployment:
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yamlVerifica che l'IP esterno sia assegnato:
kubectl get services --namespace=gke-ai-namespaceL'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 5m14sPrendi nota dell'indirizzo IP per
triton-servernella colonna EXTERNAL-IP.Verifica che il servizio e il deployment funzionino correttamente:
curl -v EXTERNAL_IP:8000/v2/health/readyL'output è simile al seguente:
... < HTTP/1.1 200 OK < Content-Length: 0 < Content-Type: text/plain ...
TF Serving
In Cloud Shell, copia il modello ML preaddestrato nel bucket Cloud Storage:
gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursiveEsegui il deployment del framework utilizzando un deployment. Un deployment è un oggetto API Kubernetes che consente di eseguire più repliche di pod distribuiti tra i nodi di un cluster:
envsubst < src/gke-config/deployment-tfserve.yaml | kubectl --namespace=gke-ai-namespace apply -f -Verifica che GKE abbia eseguito il deployment del framework:
kubectl get deployments --namespace=gke-ai-namespaceQuando il framework è pronto, l'output è simile al seguente:
NAME READY UP-TO-DATE AVAILABLE AGE tfserve-deployment 1/1 1 1 5m29sEsegui il deployment dei servizi per accedere al deployment:
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yamlVerifica che l'IP esterno sia assegnato:
kubectl get services --namespace=gke-ai-namespaceL'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 5m14sPrendi nota dell'indirizzo IP per
tfserve-servernella colonna EXTERNAL-IP.Verifica che il servizio e il deployment funzionino correttamente:
curl -v EXTERNAL_IP:8000/v1/models/mnistSostituisci
EXTERNAL_IPcon 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": "" } } ] }
Eroga il modello
Triton
Crea un ambiente virtuale Python in Cloud Shell.
python -m venv ./mnist_client source ./mnist_client/bin/activateInstalla i pacchetti Python richiesti.
pip install -r src/client/triton-requirements.txtTesta Triton Inference Server caricando un'immagine:
cd src/client python triton_mnist_client.py -i EXTERNAL_IP -m mnist -p ./images/TEST_IMAGE.pngSostituisci 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 insrc/client/images.
A seconda dell'immagine utilizzata, l'output è simile al seguente:
Calling Triton HTTP Service -> Prediction result: 7
TF Serving
Crea un ambiente virtuale Python in Cloud Shell.
python -m venv ./mnist_client source ./mnist_client/bin/activateInstalla i pacchetti Python richiesti.
pip install -r src/client/tfserve-requirements.txtTesta 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 tra0e9. Puoi utilizzare le immagini archiviate insrc/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 il rendimento del modello, puoi utilizzare l'integrazione della dashboard di Triton in Cloud Monitoring. Con questa dashboard, puoi visualizzare metriche sul rendimento critiche come throughput dei token, latenza delle richieste e 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. Per impostazione predefinita, Triton espone le metriche in formato Prometheus; non è necessario installare un esportatore aggiuntivo.
Puoi quindi visualizzare le metriche utilizzando la dashboard di 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 throughput dei token, latenza delle richieste e 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 di 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, esegui una delle seguenti operazioni:
- 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
- Elimina il progetto
Elimina le risorse Kubernetes nel cluster e le Google Cloud risorse
- 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
Elimina il bucket Cloud Storage:
Vai alla pagina Bucket:
Seleziona la casella di controllo per
PROJECT_ID-gke-bucket.Fai clic su Elimina.
Per confermare l'eliminazione, digita
DELETEe fai clic su Elimina.
Elimina il cluster GKE e le Google Cloud risorse
Elimina il cluster GKE:
Vai alla pagina Cluster:
Seleziona la casella di controllo per
online-serving-cluster.Fai clic su Elimina.
Per confermare l'eliminazione, digita
online-serving-clustere fai clic su Elimina.
Elimina il bucket Cloud Storage:
Vai alla pagina Bucket:
Seleziona la casella di controllo per
PROJECT_ID-gke-bucket.Fai clic su Elimina.
Per confermare l'eliminazione, digita
DELETEe fai clic su Elimina.
Elimina il progetto
- Nella console Google Cloud , vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID progetto, quindi fai clic su Chiudi per eliminare il progetto.