Entrena un modelo con GPUs en el modo Autopilot de GKE
En esta guía de inicio rápido, se muestra cómo implementar un modelo de entrenamiento con GPU en Google Kubernetes Engine (GKE) y almacenar las predicciones en Cloud Storage. Este documento está dirigido a los administradores de GKE que tienen clústeres del modo Autopilot existentes y desean ejecutar cargas de trabajo de GPU por primera vez.
También puedes ejecutar estas cargas de trabajo en clústeres estándar si creas grupos de nodos de GPU independientes en ellos. Para obtener instrucciones, consulta Cómo entrenar un modelo con GPUs en el modo GKE Standard.
Antes de comenzar
- 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, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE and Cloud Storage APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE and Cloud Storage APIs.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Clone el repositorio de muestra
En Cloud Shell, ejecute el siguiente comando:
git clone https://github.com/GoogleCloudPlatform/ai-on-gke && \
cd ai-on-gke/tutorials-and-examples/gpu-examples/training-single-gpu
Crea un clúster
En la consola de Google Cloud , ve a la página Create an Autopilot cluster:
En el campo Nombre, ingresa
gke-gpu-cluster
.En la lista Región, selecciona
us-central1
.Haz clic en Crear.
Cree un bucket de Cloud Storage
En la consola de Google Cloud , ve a la página Crear un bucket:
En el campo Asigna un nombre a tu bucket, ingresa el siguiente nombre:
PROJECT_ID-gke-gpu-bucket
Reemplaza
PROJECT_ID
por el ID del proyecto de Google Cloud.Haga clic en Continuar.
En Tipo de ubicación, selecciona Región.
En la lista Región, selecciona
us-central1 (Iowa)
y haz clic en Continuar.En la sección Elegir una clase de almacenamiento para tus datos, haz clic en Continuar.
En la sección Elige cómo controlar el acceso a los objetos, en Control de acceso, selecciona Uniforme.
Haz clic en Crear.
En el diálogo Se evitará el acceso público, asegúrate de que la casilla de verificación Aplicar la prevención de acceso público a este bucket esté seleccionada y haz clic en Confirmar.
Configura tu clúster a fin de acceder al bucket mediante la federación de identidades para cargas de trabajo para GKE
Para permitir que tu clúster acceda al bucket de Cloud Storage, haz lo siguiente:
- Crea una ServiceAccount de Kubernetes en tu clúster.
- Crea una política de permisos de IAM que permita que la cuenta de servicio acceda al bucket.
Crea una ServiceAccount de Kubernetes en tu clúster
En Cloud Shell, haz lo siguiente:
Conéctate a tu clúster:
gcloud container clusters get-credentials gke-gpu-cluster \ --location=us-central1
Crea un espacio de nombres de Kubernetes:
kubectl create namespace gke-gpu-namespace
Crea una ServiceAccount de Kubernetes en el espacio de nombres:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-gpu-namespace
Crea una política de permisos de IAM en el bucket
Otorga el rol de administrador de objetos de almacenamiento (roles/storage.objectAdmin
) en el bucket a la cuenta de servicio de Kubernetes:
gcloud storage buckets add-iam-policy-binding gs://PROJECT_ID \
--member=principal://iam.googleapis.com/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/gke-gpu-namespace/sa/gpu-k8s-sa \
--role=roles/storage.objectAdmin \
--condition=None
Reemplaza PROJECT_NUMBER
por el número de proyecto de Google Cloud.
Verifica que los Pods puedan acceder al bucket de Cloud Storage
En Cloud Shell, crea las siguientes variables de entorno:
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucket
Reemplaza
PROJECT_ID
por el ID del proyecto de Google Cloud.Crea un Pod que tenga un contenedor de TensorFlow:
envsubst < src/gke-config/standard-tensorflow-bash.yaml | kubectl --namespace=gke-gpu-namespace apply -f -
Con este comando, se insertan las variables de entorno que creaste en las referencias correspondientes del manifiesto. También puedes abrir el manifiesto en un editor de texto y reemplazar
$K8S_SA_NAME
y$BUCKET_NAME
por los valores correspondientes.Crea un archivo de muestra en el bucket:
touch sample-file gsutil cp sample-file gs://PROJECT_ID-gke-gpu-bucket
Espera a que el Pod esté listo:
kubectl wait --for=condition=Ready pod/test-tensorflow-pod -n=gke-gpu-namespace --timeout=180s
Cuando el Pod está listo, el resultado es el siguiente:
pod/test-tensorflow-pod condition met
Si se agota el tiempo de espera del comando, es posible que GKE aún esté creando nuevos nodos para ejecutar los pods. Vuelve a ejecutar el comando y espera a que el pod esté listo.
Abre una shell en el contenedor de TensorFlow:
kubectl -n gke-gpu-namespace exec --stdin --tty test-tensorflow-pod --container tensorflow -- /bin/bash
Intenta leer el archivo de muestra que creaste:
ls /data
El resultado muestra el archivo de muestra.
Verifica los registros para identificar la GPU conectada al Pod:
python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
El resultado muestra la GPU adjunta al Pod, similar a lo siguiente:
... PhysicalDevice(name='/physical_device:GPU:0',device_type='GPU')
Sal del contenedor:
exit
Borra el Pod de muestra:
kubectl delete -f src/gke-config/standard-tensorflow-bash.yaml \ --namespace=gke-gpu-namespace
Entrena y realiza predicciones con el conjunto de datos MNIST
En esta sección, ejecutarás una carga de trabajo de entrenamiento en el conjunto de datos de ejemplo MNIST
.
Copia los datos de ejemplo en el bucket de Cloud Storage:
gsutil -m cp -R src/tensorflow-mnist-example gs://PROJECT_ID-gke-gpu-bucket/
Crea las siguientes variables de entorno:
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucket
Revisa el trabajo de entrenamiento:
Implementa el trabajo de entrenamiento:
envsubst < src/gke-config/standard-tf-mnist-train.yaml | kubectl -n gke-gpu-namespace apply -f -
Este comando reemplaza las variables de entorno que creaste en las referencias correspondientes del manifiesto. También puedes abrir el manifiesto en un editor de texto y reemplazar
$K8S_SA_NAME
y$BUCKET_NAME
por los valores correspondientes.Espera hasta que el trabajo tenga el estado
Completed
:kubectl wait -n gke-gpu-namespace --for=condition=Complete job/mnist-training-job --timeout=180s
Cuando el trabajo esté listo, el resultado será similar al siguiente:
job.batch/mnist-training-job condition met
Si se agota el tiempo de espera del comando, es posible que GKE aún esté creando nuevos nodos para ejecutar los pods. Vuelve a ejecutar el comando y espera a que la tarea esté lista.
Verifica los registros del contenedor de TensorFlow:
kubectl logs -f jobs/mnist-training-job -c tensorflow -n gke-gpu-namespace
En el resultado, se muestran los siguientes eventos:
- Instala los paquetes obligatorios de Python
- Descarga el conjunto de datos de MNIST
- Entrena el modelo con una GPU
- Guarda el modelo.
- Evaluar el modelo
... 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
Borra la carga de trabajo de entrenamiento:
kubectl -n gke-gpu-namespace delete -f src/gke-config/standard-tf-mnist-train.yaml
Implementa una carga de trabajo de inferencia
En esta sección, implementarás una carga de trabajo de inferencia que tome un conjunto de datos de muestra como entrada y muestre predicciones.
Copia las imágenes para la predicción en el bucket:
gsutil -m cp -R data/mnist_predict gs://PROJECT_ID-gke-gpu-bucket/
Revisa la carga de trabajo de inferencia:
Implementa la carga de trabajo de inferencia:
envsubst < src/gke-config/standard-tf-mnist-batch-predict.yaml | kubectl -n gke-gpu-namespace apply -f -
Este comando reemplaza las variables de entorno que creaste en las referencias correspondientes del manifiesto. También puedes abrir el manifiesto en un editor de texto y reemplazar
$K8S_SA_NAME
y$BUCKET_NAME
por los valores correspondientes.Espera hasta que el trabajo tenga el estado
Completed
:kubectl wait -n gke-gpu-namespace --for=condition=Complete job/mnist-batch-prediction-job --timeout=180s
El resultado es similar a este:
job.batch/mnist-batch-prediction-job condition met
Verifica los registros del contenedor de TensorFlow:
kubectl logs -f jobs/mnist-batch-prediction-job -c tensorflow -n gke-gpu-namespace
El resultado es la predicción para cada imagen y la confianza del modelo en la predicción, que es similar a lo siguiente:
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.
Limpia
Para evitar que se generen cargos en tu cuenta de Google Cloud por los recursos que creaste en esta guía, realiza una de las siguientes acciones:
- Mantén el clúster de GKE: Borra los recursos de Kubernetes en el clúster y los recursos de Google Cloud
- Mantén el proyecto de Google Cloud : Borra el clúster de GKE y los recursos de Google Cloud .
- Borra el proyecto
Borra los recursos de Kubernetes en el clúster y los recursos de Google Cloud
Borra el espacio de nombres de Kubernetes y las cargas de trabajo que implementaste:
kubectl -n gke-gpu-namespace delete -f src/gke-config/standard-tf-mnist-batch-predict.yaml kubectl delete namespace gke-gpu-namespace
Borra el bucket de Cloud Storage:
Ve a la página Buckets:
Selecciona la casilla de verificación correspondiente a
PROJECT_ID-gke-gpu-bucket
.Haz clic en
Borrar.Para confirmar la eliminación, escribe
DELETE
y haz clic en Borrar.
Borra la cuenta de servicio de Google Cloud :
Ve a la página Cuentas de servicio:
Selecciona tu proyecto.
Selecciona la casilla de verificación correspondiente a
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com
.Haz clic en
Borrar.Para confirmar la eliminación, haz clic en Borrar.
Borra el clúster de GKE y los recursos de Google Cloud
Borra el clúster de GKE:
Ve a la página Clústeres:
Selecciona la casilla de verificación correspondiente a
gke-gpu-cluster
.Haz clic en
Borrar.Para confirmar la eliminación, escribe
gke-gpu-cluster
y haz clic en Borrar.
Borra el bucket de Cloud Storage:
Ve a la página Buckets:
Selecciona la casilla de verificación correspondiente a
PROJECT_ID-gke-gpu-bucket
.Haz clic en
Borrar.Para confirmar la eliminación, escribe
DELETE
y haz clic en Borrar.
Borra la cuenta de servicio de Google Cloud :
Ve a la página Cuentas de servicio:
Selecciona tu proyecto.
Selecciona la casilla de verificación correspondiente a
gke-gpu-sa@PROJECT_ID.iam.gserviceaccount.com
.Haz clic en
Borrar.Para confirmar la eliminación, haz clic en Borrar.
Borra el proyecto
- 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.