Questo tutorial mostra come gestire un modello semplice con GPU in Modalità Google Kubernetes Engine (GKE). Questo tutorial crea un cluster GKE che utilizza una singola GPU L4 Tensor Core e prepara l'infrastruttura GKE per l'inferenza online. Questo utilizza due dei framework più utilizzati per la distribuzione online:
Obiettivi
Questo tutorial è destinato a ingegneri dell'infrastruttura, ingegneri MLOps, DevOps engineer o amministratori di cluster che vogliono ospitare un modello di machine learning (ML) preaddestrato in un cluster GKE.
Questo tutorial illustra i seguenti passaggi:
- Crea un cluster GKE Autopilot o standard.
- Configura un bucket Cloud Storage in cui risiede il modello pre-addestrato.
- Esegui il deployment del framework di inferenza online selezionato.
- 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 la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, vedi Pulizia.
Prima di iniziare
Configura il progetto
- 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, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
Impostare i valori predefiniti per Google Cloud CLI
Nella console Google Cloud, avvia un'istanza di 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-gpu
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 ID progetto Google Cloud.
- COMPUTE_REGION: la regione Compute Engine che supporta il tipo di acceleratore che vuoi utilizzare,
ad esempio
us-central1
per 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 gestire modelli su una singola GPU in un ambiente 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, vedi Scegliere una modalità operativa di 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
Esegui il seguente 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.
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 la federazione delle identità per i carichi di lavoro per GKE
Per consentire al cluster di accedere al bucket Cloud Storage, segui questi passaggi:
- Creare un account di servizio Google Cloud.
- Creare un ServiceAccount Kubernetes nel cluster.
- Associa l'account di servizio Kubernetes all'account di servizio Google Cloud.
Creare un account di servizio Google Cloud
Nella console Google Cloud, vai alla pagina Crea account di servizio:
Nel campo ID account di servizio, inserisci
gke-ai-sa
.Fai clic su Crea e continua.
Nell'elenco Ruolo, seleziona il ruolo Cloud Storage > Servizio di raccolta di Storage Insights.
Fai clic su
Aggiungi un altro ruolo.Nell'elenco Seleziona un ruolo, seleziona il ruolo Cloud Storage > Amministratore oggetti Storage.
Fai clic su Continua, quindi su Fine.
Crea un ServiceAccount Kubernetes nel tuo cluster
In Cloud Shell, segui questi passaggi:
Crea uno spazio dei nomi Kubernetes:
kubectl create namespace gke-ai-namespace
Crea un ServiceAccount Kubernetes nello spazio dei nomi:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespace
Associa l'account di servizio Kubernetes all'account di servizio Google Cloud
In Cloud Shell, esegui questi comandi:
Aggiungi un'associazione IAM all'account di servizio 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 dell'account di servizio Kubernetes in Google Cloud.Aggiungi un'annotazione all'account di servizio 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 si aspetta di trovare il modello ML preaddestrato 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 del bucket:
gcloud storage cp src/triton-model-repository gs://$GSBUCKET --recursive
Esegui il deployment del framework su Kubernetes:
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-namespace
Quando il framework è pronto, l'output è simile al seguente:
NAME READY UP-TO-DATE AVAILABLE AGE triton-deployment 1/1 1 1 5m29s
Eseguire il deployment dei servizi per accedere
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-triton.yaml
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
nel campo EXTERNAL-IP colonna.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 ...
Pubblicazione di TF
In Cloud Shell, copia il modello ML preaddestrato del bucket:
gcloud storage cp src/tfserve-model-repository gs://$GSBUCKET --recursive
Esegui il deployment del framework su Kubernetes:
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-namespace
Quando il framework è pronto, l'output è simile al seguente:
NAME READY UP-TO-DATE AVAILABLE AGE tfserve-deployment 1/1 1 1 5m29s
Eseguire il deployment dei servizi per accedere
kubectl apply --namespace=gke-ai-namespace -f src/gke-config/service-tfserve.yaml
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 di
tfserve-server
nella colonna EXTERNAL-IP.Verifica che il servizio e il deployment funzionino correttamente:
curl -v EXTERNAL_IP:8000/v1/models/mnist
Sostituisci
EXTERNAL_IP
con all'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
Creare un ambiente virtuale Python in Cloud Shell.
python -m venv ./mnist_client source ./mnist_client/bin/activate
Installa i pacchetti Python richiesti.
pip install -r src/client/triton-requirements.txt
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 che corrisponde 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
Creare un ambiente virtuale Python in Cloud Shell.
python -m venv ./mnist_client source ./mnist_client/bin/activate
Installare i pacchetti Python richiesti.
pip install -r src/client/tfserve-requirements.txt
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 tra0
e9
. Puoi utilizzare le immagini archiviate nell'appsrc/client/images
.
A seconda dell'immagine utilizzata, si otterrà un output simile a questo:
Calling TensorFlow Serve HTTP Service -> Prediction result: 5
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse che hai creato in questa guida, svolgi una delle seguenti operazioni:
- Conserva il cluster GKE: elimina le risorse Kubernetes in nel cluster e nelle 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
- 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
Pubblicazione di TF
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
DELETE
e fai clic su Elimina.
Elimina l'account di servizio Google Cloud:
Vai alla pagina Account di servizio:
Seleziona il progetto.
Seleziona la casella di controllo relativa a
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com
.Fai clic su
Elimina.Per confermare l'eliminazione, fai clic su Elimina.
Elimina il cluster GKE e le risorse Google Cloud
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-cluster
e 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
DELETE
e fai clic su Elimina.
Elimina l'account di servizio Google Cloud:
Vai alla pagina Account di servizio:
Seleziona il progetto.
Seleziona la casella di controllo relativa a
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com
.Fai clic su
Elimina.Per confermare l'eliminazione, fai clic su Elimina.
Elimina il progetto
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.