Addestra un modello con GPU nella modalità GKE Standard
Questa guida rapida mostra come eseguire il deployment di un modello di addestramento con GPU in Google Kubernetes Engine (GKE) e archiviare le previsioni in Cloud Storage. Questo documento è destinato agli amministratori di GKE che dispongono di cluster in modalità Standard esistenti e che vogliono eseguire carichi di lavoro GPU per la prima volta.
Puoi anche eseguire questi carichi di lavoro su cluster in modalità Autopilot con meno passaggi di configurazione.
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 gratuiti per l'esecuzione, il test e il deployment dei carichi di lavoro.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
Abilita le API Kubernetes Engine and Cloud Storage.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Assicurati che la fatturazione sia attivata per il tuo progetto Google Cloud.
-
Abilita le API Kubernetes Engine and Cloud Storage.
-
Nella console Google Cloud, attiva Cloud Shell.
Nella parte inferiore della console Google Cloud viene avviata una sessione di Cloud Shell che mostra un prompt della riga di comando. Cloud Shell è un ambiente shell con Google Cloud CLI già installato e con valori già impostati per il progetto attuale. L'inizializzazione della sessione può richiedere alcuni secondi.
clona il repository di esempio
In Cloud Shell, esegui questo comando:
git clone https://github.com/GoogleCloudPlatform/ai-on-gke/ ai-on-gke
cd ai-on-gke/tutorials-and-examples/gpu-examples/training-single-gpu
Crea un cluster in modalità Standard e un pool di nodi GPU
Utilizza Cloud Shell per:
Crea un cluster standard che utilizzi la federazione delle identità Workload per GKE e installa il driver Cloud Storage FUSE:
gcloud container clusters create gke-gpu-cluster \ --addons GcsFuseCsiDriver \ --location=us-central1 \ --num-nodes=1 \ --workload-pool=PROJECT_ID.svc.id.goog
Sostituisci
PROJECT_ID
con l'ID progetto Google Cloud.La creazione del cluster potrebbe richiedere diversi minuti.
Crea un pool di nodi GPU:
gcloud container node-pools create gke-gpu-pool-1 \ --accelerator=type=nvidia-tesla-t4,count=1,gpu-driver-version=default \ --machine-type=n1-standard-16 --num-nodes=1 \ --location=us-central1 \ --cluster=gke-gpu-cluster
Crea un bucket Cloud Storage
Nella console Google Cloud, vai alla pagina Crea un bucket:
Nel campo Assegna un nome al bucket, inserisci il seguente nome:
PROJECT_ID-gke-gpu-bucket
Fai clic su Continua.
In Tipo di località, seleziona Regione.
Nell'elenco Regione, seleziona
us-central1 (Iowa)
e fai clic su Continua.Nella sezione Scegli una classe di archiviazione per i tuoi dati, fai clic su Continua.
Nella sezione Scegli come controllare l'accesso agli oggetti, per Controllo dell'accesso, seleziona Uniforme.
Fai clic su Crea.
Nella finestra di dialogo L'accesso pubblico verrà vietato, assicurati che la casella di controllo Applica la prevenzione dell'accesso pubblico in questo bucket sia selezionata e fai clic su Conferma.
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:
- Creare un account di servizio Google Cloud.
- Creare un ServiceAccount Kubernetes nel cluster.
- Associare Kubernetes ServiceAccount 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 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 e poi 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 di Kubernetes ServiceAccount in Google Cloud.Annota l'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
Verifica che i pod possano accedere al bucket Cloud Storage
In Cloud Shell, crea le seguenti variabili di ambiente:
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucket
Sostituisci
PROJECT_ID
con l'ID progetto Google Cloud.Crea un pod con un container TensorFlow:
envsubst < src/gke-config/standard-tensorflow-bash.yaml | kubectl --namespace=gke-ai-namespace apply -f -
Questo comando sostituisce le variabili di ambiente che hai creato nei riferimenti corrispondenti nel manifest. Puoi anche aprire il manifest in un editor di testo e sostituire
$K8S_SA_NAME
e$BUCKET_NAME
con i valori corrispondenti.Crea un file di esempio nel bucket:
touch sample-file gsutil cp sample-file gs://PROJECT_ID-gke-gpu-bucket
Attendi che il pod sia pronto:
kubectl wait --for=condition=Ready pod/test-tensorflow-pod -n=gke-ai-namespace --timeout=180s
Quando il pod è pronto, l'output è il seguente:
pod/test-tensorflow-pod condition met
Apri una shell nel container Tensorflow:
kubectl -n gke-ai-namespace exec --stdin --tty test-tensorflow-pod --container tensorflow -- /bin/bash
Prova a leggere il file di esempio che hai creato:
ls /data
L'output mostra il file di esempio.
Controlla i log per identificare la GPU collegata al pod:
python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
L'output mostra la GPU collegata al pod, come mostrato di seguito:
... PhysicalDevice(name='/physical_device:GPU:0',device_type='GPU')
Esci dal contenitore:
exit
Elimina il pod di esempio:
kubectl delete -f src/gke-config/standard-tensorflow-bash.yaml \ --namespace=gke-ai-namespace
Addestra e prevedi utilizzando il set di dati MNIST
In questa sezione eseguirai un carico di lavoro di addestramento sul set di dati di esempio MNIST
.
Copia i dati di esempio nel bucket Cloud Storage:
gsutil -m cp -R src/tensorflow-mnist-example gs://PROJECT_ID-gke-gpu-bucket/
Crea le seguenti variabili di ambiente:
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucket
Rivedi il job di addestramento:
Esegui il deployment del job di addestramento:
envsubst < src/gke-config/standard-tf-mnist-train.yaml | kubectl -n gke-ai-namespace apply -f -
Questo comando sostituisce le variabili di ambiente che hai creato nei riferimenti corrispondenti nel manifest. Puoi anche aprire il manifest in un editor di testo e sostituire
$K8S_SA_NAME
e$BUCKET_NAME
con i valori corrispondenti.Attendi che lo stato del job sia
Completed
:kubectl wait -n gke-ai-namespace --for=condition=Complete job/mnist-training-job --timeout=180s
L'output è simile al seguente:
job.batch/mnist-training-job condition met
Controlla i log del container TensorFlow:
kubectl logs -f jobs/mnist-training-job -c tensorflow -n gke-ai-namespace
L'output mostra i seguenti eventi:
- Installa i pacchetti Python richiesti
- Scarica il set di dati MNIST
- Addestra il modello utilizzando una GPU
- Salva il modello
- Valuta il modello
... Epoch 12/12 927/938 [============================>.] - ETA: 0s - loss: 0.0188 - accuracy: 0.9954 Learning rate for epoch 12 is 9.999999747378752e-06 938/938 [==============================] - 5s 6ms/step - loss: 0.0187 - accuracy: 0.9954 - lr: 1.0000e-05 157/157 [==============================] - 1s 4ms/step - loss: 0.0424 - accuracy: 0.9861 Eval loss: 0.04236088693141937, Eval accuracy: 0.9861000180244446 Training finished. Model saved
Elimina il carico di lavoro di addestramento:
kubectl -n gke-ai-namespace delete -f src/gke-config/standard-tf-mnist-train.yaml
esegui il deployment di un carico di lavoro di inferenza
In questa sezione eseguirai il deployment di un carico di lavoro di inferenza che prende come input un set di dati di esempio e restituisce le previsioni.
Copia le immagini per la previsione nel bucket:
gsutil -m cp -R data/mnist_predict gs://PROJECT_ID-gke-gpu-bucket/
Esamina il carico di lavoro di inferenza:
Esegui il deployment del carico di lavoro di inferenza:
envsubst < src/gke-config/standard-tf-mnist-batch-predict.yaml | kubectl -n gke-ai-namespace apply -f -
Questo comando sostituisce le variabili di ambiente che hai creato nei riferimenti corrispondenti nel manifest. Puoi anche aprire il manifest in un editor di testo e sostituire
$K8S_SA_NAME
e$BUCKET_NAME
con i valori corrispondenti.Attendi che lo stato del job sia
Completed
:kubectl wait -n gke-ai-namespace --for=condition=Complete job/mnist-batch-prediction-job --timeout=180s
L'output è simile al seguente:
job.batch/mnist-batch-prediction-job condition met
Controlla i log del container TensorFlow:
kubectl logs -f jobs/mnist-batch-prediction-job -c tensorflow -n gke-ai-namespace
L'output è la previsione per ogni immagine e l'affidabilità del modello nella previsione, simile al seguente:
Found 10 files belonging to 1 classes. 1/1 [==============================] - 2s 2s/step The image /data/mnist_predict/0.png is the number 0 with a 100.00 percent confidence. The image /data/mnist_predict/1.png is the number 1 with a 99.99 percent confidence. The image /data/mnist_predict/2.png is the number 2 with a 100.00 percent confidence. The image /data/mnist_predict/3.png is the number 3 with a 99.95 percent confidence. The image /data/mnist_predict/4.png is the number 4 with a 100.00 percent confidence. The image /data/mnist_predict/5.png is the number 5 with a 100.00 percent confidence. The image /data/mnist_predict/6.png is the number 6 with a 99.97 percent confidence. The image /data/mnist_predict/7.png is the number 7 with a 100.00 percent confidence. The image /data/mnist_predict/8.png is the number 8 with a 100.00 percent confidence. The image /data/mnist_predict/9.png is the number 9 with a 99.65 percent confidence.
Esegui la pulizia
Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse create in questa guida, esegui una delle seguenti operazioni:
- Conserva il cluster GKE: elimina le risorse Kubernetes nel cluster e le risorse Google Cloud
- Conserva 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:
kubectl -n gke-ai-namespace delete -f src/gke-config/standard-tf-mnist-batch-predict.yaml kubectl delete namespace gke-ai-namespace
Elimina il bucket Cloud Storage:
Vai alla pagina Bucket:
Seleziona la casella di controllo relativa a
PROJECT_ID-gke-gpu-bucket
.Fai clic su
Elimina.Per confermare l'eliminazione, digita
DELETE
e fai clic su Elimina.
Eliminare l'account di servizio Google Cloud:
Vai alla pagina Account di servizio:
Seleziona il progetto.
Seleziona la casella di controllo relativa a
gke-ai-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
gke-gpu-cluster
.Fai clic su
Elimina.Per confermare l'eliminazione, digita
gke-gpu-cluster
e fai clic su Elimina.
Elimina il bucket Cloud Storage:
Vai alla pagina Bucket:
Seleziona la casella di controllo relativa a
PROJECT_ID-gke-gpu-bucket
.Fai clic su
Elimina.Per confermare l'eliminazione, digita
DELETE
e fai clic su Elimina.
Eliminare l'account di servizio Google Cloud:
Vai alla pagina Account di servizio:
Seleziona il progetto.
Seleziona la casella di controllo relativa a
gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com
.Fai clic su
Elimina.Per confermare l'eliminazione, 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 del progetto e fai clic su Chiudi per eliminare il progetto.