Questo tutorial mostra come eseguire il deployment e pubblicare un modello di machine learning (ML) scalabile in un cluster Google Kubernetes Engine (GKE) utilizzando il framework TorchServe. Pubblichi un modello PyTorch preaddestrato che genera previsioni in base alle richieste degli utenti. Dopo aver eseguito il deployment del modello, ricevi un URL di previsione che la tua applicazione utilizza per inviare richieste di previsione. Questo metodo consente di scalare il modello e l'applicazione web in modo indipendente. Quando esegui il deployment del workload e dell'applicazione ML su Autopilot, GKE sceglie il tipo e le dimensioni di macchina sottostanti più efficienti per eseguire i workload.
Questo tutorial è rivolto a ingegneri di machine learning (ML), amministratori e operatori di piattaforme e specialisti di dati e AI interessati a utilizzare GKE Autopilot per ridurre il sovraccarico amministrativo per la configurazione, lo scaling e gli upgrade dei nodi. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui facciamo riferimento nei contenuti di Google Cloud , consulta la pagina Ruoli utente e attività comuni di GKE.
Prima di leggere questa pagina, assicurati di conoscere la modalità Autopilot di GKE.
Informazioni sull'applicazione del tutorial
L'applicazione è una piccola applicazione web Python creata utilizzando il framework Fast Dash. Utilizzi l'applicazione per inviare richieste di previsione al modello T5. Questa applicazione acquisisce gli input di testo e le coppie di lingue dell'utente e invia le informazioni al modello. Il modello traduce il testo e restituisce il risultato all'applicazione, che lo mostra all'utente. Per saperne di più su Fast Dash, consulta la documentazione di Fast Dash.
Prepara l'ambiente
Clona il repository di esempio e apri la directory del tutorial:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples.git
cd kubernetes-engine-samples/ai-ml/t5-model-serving
Crea il cluster
Esegui questo comando:
gcloud container clusters create-auto ml-cluster \
--release-channel=RELEASE_CHANNEL \
--cluster-version=CLUSTER_VERSION \
--location=us-central1
Sostituisci quanto segue:
RELEASE_CHANNEL
: il canale di rilascio per il tuo cluster. Deve essere uno trarapid
,regular
ostable
. Scegli un canale con GKE 1.28.3-gke.1203000 o versioni successive per utilizzare le GPU L4. Per visualizzare le versioni disponibili in un canale specifico, vedi Visualizzare le versioni predefinite e disponibili per i canali di rilascio.CLUSTER_VERSION
: la versione di GKE da utilizzare. Deve essere1.28.3-gke.1203000
o successiva.
Il completamento dell'operazione richiede diversi minuti.
Crea un repository Artifact Registry
Crea un nuovo repository standard Artifact Registry con il formato Docker nella stessa regione del cluster:
gcloud artifacts repositories create models \ --repository-format=docker \ --location=us-central1 \ --description="Repo for T5 serving image"
Verifica il nome del repository:
gcloud artifacts repositories describe models \ --location=us-central1
L'output è simile al seguente:
Encryption: Google-managed key Repository Size: 0.000MB createTime: '2023-06-14T15:48:35.267196Z' description: Repo for T5 serving image format: DOCKER mode: STANDARD_REPOSITORY name: projects/PROJECT_ID/locations/us-central1/repositories/models updateTime: '2023-06-14T15:48:35.267196Z'
Pacchettizzare il modello
In questa sezione, pacchettizzi il modello e il framework di servizio in un'unica immagine container utilizzando Cloud Build ed esegui il push dell'immagine risultante nel repository Artifact Registry.
Esamina il Dockerfile per l'immagine container:
Questo Dockerfile definisce il seguente processo di compilazione in più fasi:
- Scarica gli artefatti del modello dal repository Hugging Face.
- Pacchettizza il modello utilizzando lo strumento PyTorch Serving Archive. Viene creato un file di archivio del modello (.mar) che il server di inferenza utilizza per caricare il modello.
- Crea l'immagine finale con PyTorch Serve.
Crea ed esegui il push dell'immagine utilizzando Cloud Build:
gcloud builds submit model/ \ --region=us-central1 \ --config=model/cloudbuild.yaml \ --substitutions=_LOCATION=us-central1,_MACHINE=gpu,_MODEL_NAME=t5-small,_MODEL_VERSION=1.0
Il completamento della processo di compilazione richiede diversi minuti. Se utilizzi una dimensione del modello maggiore di
t5-small
, la processo di compilazione potrebbe richiedere molto più tempo.Verifica che l'immagine sia nel repository:
gcloud artifacts docker images list us-central1-docker.pkg.dev/PROJECT_ID/models
Sostituisci
PROJECT_ID
con l'ID progetto Google Cloud.L'output è simile al seguente:
IMAGE DIGEST CREATE_TIME UPDATE_TIME us-central1-docker.pkg.dev/PROJECT_ID/models/t5-small sha256:0cd... 2023-06-14T12:06:38 2023-06-14T12:06:38
Esegui il deployment del modello pacchettizzato in GKE
Per eseguire il deployment dell'immagine, questo tutorial utilizza i deployment Kubernetes. Un deployment è un oggetto API Kubernetes che ti consente di eseguire più repliche di pod distribuite tra i nodi di un cluster.
Modifica il manifest Kubernetes nel repository di esempio in modo che corrisponda al tuo ambiente.
Esamina il manifest per il workload di inferenza:
Sostituisci
PROJECT_ID
con l'ID progetto Google Cloud:sed -i "s/PROJECT_ID/PROJECT_ID/g" "kubernetes/serving-gpu.yaml"
In questo modo, il percorso dell'immagine container nella specifica del deployment corrisponde al percorso dell'immagine del modello T5 in Artifact Registry.
Crea le risorse Kubernetes:
kubectl create -f kubernetes/serving-gpu.yaml
Per verificare che il deployment del modello sia andato a buon fine:
Recupera lo stato del deployment e del servizio:
kubectl get -f kubernetes/serving-gpu.yaml
Attendi che l'output mostri i pod pronti, in modo simile al seguente. A seconda delle dimensioni dell'immagine, il primo pull dell'immagine potrebbe richiedere diversi minuti.
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/t5-inference 1/1 1 0 66s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/t5-inference ClusterIP 10.48.131.86 <none> 8080/TCP,8081/TCP,8082/TCP 66s
Apri una porta locale per il servizio
t5-inference
:kubectl port-forward svc/t5-inference 8080
Apri una nuova finestra del terminale e invia una richiesta di test al servizio:
curl -v -X POST -H 'Content-Type: application/json' -d '{"text": "this is a test sentence", "from": "en", "to": "fr"}' "http://localhost:8080/predictions/t5-small/1.0"
Se la richiesta di test non va a buon fine e la connessione al pod si chiude, controlla i log:
kubectl logs deployments/t5-inference
Se l'output è simile al seguente, l'installazione di TorchServe non è riuscita per alcune dipendenze del modello:
org.pytorch.serve.archive.model.ModelException: Custom pip package installation failed for t5-small
Per risolvere il problema, riavvia la deployment:
kubectl rollout restart deployment t5-inference
Il controller Deployment crea un nuovo pod. Ripeti i passaggi precedenti per aprire una porta sul nuovo pod.
Accedere al modello di cui è stato eseguito il deployment utilizzando l'applicazione web
Per accedere al modello di cui è stato eseguito il deployment con l'applicazione web Fast Dash, completa i seguenti passaggi:
Crea ed esegui il push dell'applicazione web Fast Dash come immagine container in Artifact Registry:
gcloud builds submit client-app/ \ --region=us-central1 \ --config=client-app/cloudbuild.yaml
Apri
kubernetes/application.yaml
in un editor di testo e sostituisciPROJECT_ID
nel campoimage:
con il tuo ID progetto. In alternativa, esegui questo comando:sed -i "s/PROJECT_ID/PROJECT_ID/g" "kubernetes/application.yaml"
Crea le risorse Kubernetes:
kubectl create -f kubernetes/application.yaml
Il provisioning completo del deployment e del servizio potrebbe richiedere un po' di tempo.
Per controllare lo stato, esegui questo comando:
kubectl get -f kubernetes/application.yaml
Attendi che l'output mostri i pod pronti, in modo simile al seguente:
NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/fastdash 1/1 1 0 1m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/fastdash NodePort 203.0.113.12 <none> 8050/TCP 1m
L'applicazione web è ora in esecuzione, anche se non è esposta su un indirizzo IP esterno. Per accedere all'applicazione web, apri una porta locale:
kubectl port-forward service/fastdash 8050
In un browser, apri l'interfaccia web:
- Se utilizzi una shell locale, apri un browser e vai all'indirizzo http://127.0.0.1:8050.
- Se utilizzi Cloud Shell, fai clic su Anteprima web, quindi fai clic su
Cambia porta. Specifica la porta
8050
.
Per inviare una richiesta al modello T5, specifica i valori nei campi TEXT, FROM LANG e TO LANG nell'interfaccia web e fai clic su Invia. Per un elenco delle lingue disponibili, consulta la documentazione di T5.
Abilita la scalabilità automatica per il modello
Questa sezione mostra come abilitare la scalabilità automatica per il modello in base alle metriche di Google Cloud Managed Service per Prometheus procedendo nel seguente modo:
- Installare l'adattatore Stackdriver delle metriche personalizzate
- Applica le configurazioni di PodMonitoring e HorizontalPodAutoscaling
Google Cloud Managed Service per Prometheus è abilitato per impostazione predefinita nei cluster Autopilot che eseguono la versione 1.25 e successive.
Installare l'adattatore Stackdriver delle metriche personalizzate
Questo adattatore consente al cluster di utilizzare le metriche di Prometheus per prendere decisioni di scalabilità automatica di Kubernetes.
Esegui il deployment dell'adattatore:
kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
Crea un account di servizio IAM da utilizzare per l'adattatore:
gcloud iam service-accounts create monitoring-viewer
Concedi al account di servizio IAM il ruolo
monitoring.viewer
sul progetto e il ruoloiam.workloadIdentityUser
:gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer gcloud iam service-accounts add-iam-policy-binding monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]"
Sostituisci
PROJECT_ID
con l'ID progetto Google Cloud.Aggiungi un'annotazione al service account Kubernetes dell'adattatore per consentirgli di rappresentare ilaccount di serviziot IAM:
kubectl annotate serviceaccount custom-metrics-stackdriver-adapter \ --namespace custom-metrics \ iam.gke.io/gcp-service-account=monitoring-viewer@PROJECT_ID.iam.gserviceaccount.com
Riavvia l'adattatore per propagare le modifiche:
kubectl rollout restart deployment custom-metrics-stackdriver-adapter \ --namespace=custom-metrics
Applica le configurazioni di PodMonitoring e HorizontalPodAutoscaling
PodMonitoring è una risorsa personalizzata di Google Cloud Managed Service per Prometheus che consente l'importazione delle metriche e lo scraping dei target in uno spazio dei nomi specifico.
Esegui il deployment della risorsa PodMonitoring nello stesso spazio dei nomi del deployment di TorchServe:
kubectl apply -f kubernetes/pod-monitoring.yaml
Esamina il manifest di HorizontalPodAutoscaler:
HorizontalPodAutoscaler scala la quantità di pod del modello T5 in base alla durata cumulativa della coda di richieste. La scalabilità automatica si basa sulla metrica
ts_queue_latency_microseconds
, che mostra la durata cumulativa della coda in microsecondi.Crea HorizontalPodAutoscaler:
kubectl apply -f kubernetes/hpa.yaml
Verifica la scalabilità automatica utilizzando un generatore di carico
Per testare la configurazione della scalabilità automatica, genera carico per l'applicazione di pubblicazione. Questo tutorial utilizza un generatore di carico Locust per inviare richieste all'endpoint di previsione del modello.
Crea il generatore di carico:
kubectl apply -f kubernetes/loadgenerator.yaml
Attendi che i pod del generatore del carico siano pronti.
Esporre localmente l'interfaccia web del generatore di carico:
kubectl port-forward svc/loadgenerator 8080
Se visualizzi un messaggio di errore, riprova quando il pod è in esecuzione.
In un browser, apri l'interfaccia web del generatore di carico:
- Se utilizzi una shell locale, apri un browser e vai alla pagina http://127.0.0.1:8080.
- Se utilizzi Cloud Shell, fai clic su Anteprima web, quindi
fai clic su Cambia porta. Inserisci la porta
8080
.
Fai clic sulla scheda Grafici per osservare il rendimento nel tempo.
Apri una nuova finestra del terminale e osserva il numero di repliche dei tuoi autoscaler orizzontali dei pod:
kubectl get hpa -w
Il numero di repliche aumenta man mano che il carico aumenta. Lo scale up potrebbe richiedere circa dieci minuti. Man mano che vengono avviate nuove repliche, il numero di richieste riuscite nel grafico Locust aumenta.
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE t5-inference Deployment/t5-inference 71352001470m/7M 1 5 1 2m11s
Consigli
- Crea il modello con la stessa versione dell'immagine Docker di base che utilizzerai per la pubblicazione.
- Se il modello ha dipendenze di pacchetti speciali o se le dimensioni delle dipendenze sono grandi, crea una versione personalizzata dell'immagine Docker di base.
- Visualizza la versione ad albero dei pacchetti di dipendenze del modello. Assicurati che le dipendenze dei pacchetti supportino le versioni reciproche. Ad esempio, Panda versione 2.0.3 supporta NumPy versione 1.20.3 e successive.
- Esegui modelli che richiedono un uso intensivo della GPU sui nodi GPU e modelli che richiedono un uso intensivo della CPU sulla CPU. Ciò potrebbe migliorare la stabilità del servizio del modello e garantisce che le risorse dei nodi vengano utilizzate in modo efficiente.
Osserva le prestazioni del modello
Per osservare il rendimento del modello, puoi utilizzare l'integrazione della dashboard TorchServe in Cloud Monitoring. Con questa dashboard puoi visualizzare metriche sul rendimento critiche come il throughput dei token, la latenza delle richieste e i tassi di errore.
Per utilizzare la dashboard TorchServe, devi abilitare Google Cloud Managed Service per Prometheus, che raccoglie le metriche da TorchServe, nel tuo cluster GKE. TorchServe espone le metriche nel formato Prometheus per impostazione predefinita; non è necessario installare un esportatore aggiuntivo.
Puoi quindi visualizzare le metriche utilizzando la dashboard TorchServe. Per informazioni sull'utilizzo di Google Cloud Managed Service per Prometheus per raccogliere metriche dal tuo modello, consulta le indicazioni sull'osservabilità di TorchServe nella documentazione di Cloud Monitoring.