Entrena un modelo con GPUs en el modo GKE Standard
En este tutorial de inicio rápido se muestra cómo desplegar un modelo de entrenamiento con GPUs en Google Kubernetes Engine (GKE) y almacenar las predicciones en Cloud Storage. En este tutorial se usa un modelo de TensorFlow y clústeres de GKE Standard. También puedes ejecutar estas cargas de trabajo en clústeres de Autopilot con menos pasos de configuración. Para obtener instrucciones, consulta Entrenar un modelo con GPUs en el modo Autopilot de GKE.
Este documento está dirigido a administradores de GKE que tengan clústeres estándar y quieran ejecutar cargas de trabajo de GPU por primera vez.
Antes de empezar
- 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.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
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.
-
Si vas a usar un proyecto que ya tengas para seguir esta guía, comprueba que tienes los permisos necesarios para completar la guía. Si has creado un proyecto, ya tienes los permisos necesarios.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Kubernetes Engine and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. -
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
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.
-
Si vas a usar un proyecto que ya tengas para seguir esta guía, comprueba que tienes los permisos necesarios para completar la guía. Si has creado un proyecto, ya tienes los permisos necesarios.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Kubernetes Engine and Cloud Storage APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. -
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.
-
Gestionar clústeres de GKE:
Administrador de Kubernetes Engine (
roles/container.admin) -
Gestionar los contenedores de Cloud Storage:
Administrador de Storage (
roles/storage.admin) -
Concede roles de gestión de identidades y accesos en el proyecto:
Administrador de gestión de identidades y accesos de proyectos (
roles/resourcemanager.projectIamAdmin) -
Crea cuentas de servicio de gestión de identidades y accesos y asigna roles:
Administrador de cuentas de servicio (
roles/iam.serviceAccountAdmin) Crea un clúster estándar que use Workload Identity Federation for GKE e instala el controlador Cloud Storage FUSE:
gcloud container clusters create gke-gpu-cluster \ --addons GcsFuseCsiDriver \ --location=us-central1 \ --num-nodes=1 \ --workload-pool=PROJECT_ID.svc.id.googSustituye
PROJECT_IDpor el ID de tu proyecto. Google CloudLa creación del clúster puede tardar varios minutos.
Crea un grupo de nodos de 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-clusterEn la Google Cloud consola, ve a la página Crear un bucket:
En el campo Name your bucket (Ponle nombre al contenedor), introduce el siguiente nombre:
PROJECT_ID-gke-gpu-bucketHaz 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 Elige una clase de almacenamiento para tus datos, haz clic en Continuar.
En la sección Selecciona cómo controlar el acceso a los objetos, en Control de acceso, selecciona Uniforme.
Haz clic en Crear.
En el cuadro de diálogo Se impedirá el acceso público, asegúrate de que la casilla Aplicar la prevención del acceso público a este segmento esté marcada y haz clic en Confirmar.
- Crea una Google Cloud cuenta de servicio.
- Crea una ServiceAccount de Kubernetes en tu clúster.
- Vincula la cuenta de servicio de Kubernetes a la Google Cloud cuenta de servicio.
En la Google Cloud consola, ve a la página Crear cuenta de servicio:
En el campo ID de cuenta de servicio, introduce
gke-ai-sa.Haz clic en Crear y continuar.
En la lista Rol, selecciona el rol Cloud Storage > Storage Insights Collector Service.
Haz clic en Añadir otro rol.
En la lista Seleccionar un rol, selecciona el rol Cloud Storage > Administrador de objetos de Storage.
Haz clic en Continuar y, a continuación, en Hecho.
Crea un espacio de nombres de Kubernetes:
kubectl create namespace gke-ai-namespaceCrea una cuenta de servicio de Kubernetes en el espacio de nombres:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespaceAñade un enlace de gestión de identidades y accesos a la cuenta de servicio 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]"La marca
--memberproporciona la identidad completa de la cuenta de servicio de Kubernetes en Google Cloud.Anota la cuenta de servicio de Kubernetes:
kubectl annotate serviceaccount gpu-k8s-sa \ --namespace gke-ai-namespace \ iam.gke.io/gcp-service-account=gke-ai-sa@PROJECT_ID.iam.gserviceaccount.comEn Cloud Shell, crea las siguientes variables de entorno:
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucketSustituye
PROJECT_IDpor el ID de tu proyecto. Google CloudCrea un pod que tenga un contenedor TensorFlow:
envsubst < src/gke-config/standard-tensorflow-bash.yaml | kubectl --namespace=gke-ai-namespace apply -f -Este comando sustituye las variables de entorno que has creado por las referencias correspondientes en el manifiesto. También puedes abrir el archivo de manifiesto en un editor de texto y sustituir
$K8S_SA_NAMEy$BUCKET_NAMEpor los valores correspondientes.Crea un archivo de muestra en el segmento:
touch sample-file gcloud storage cp sample-file gs://PROJECT_ID-gke-gpu-bucketEspera a que tu Pod esté listo:
kubectl wait --for=condition=Ready pod/test-tensorflow-pod -n=gke-ai-namespace --timeout=180sCuando el pod esté listo, el resultado será el siguiente:
pod/test-tensorflow-pod condition metAbre un shell en el contenedor de TensorFlow:
kubectl -n gke-ai-namespace exec --stdin --tty test-tensorflow-pod --container tensorflow -- /bin/bashIntenta leer el archivo de muestra que has creado:
ls /dataEn el resultado se muestra el archivo de ejemplo.
Consulta los registros para identificar la GPU conectada al pod:
python3 -m pip install 'tensorflow[and-cuda]' python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"El resultado muestra la GPU conectada al Pod, de forma similar a lo siguiente:
... PhysicalDevice(name='/physical_device:GPU:0',device_type='GPU')Sal del contenedor:
exitElimina el pod de ejemplo:
kubectl delete -f src/gke-config/standard-tensorflow-bash.yaml \ --namespace=gke-ai-namespaceCopia los datos de ejemplo en el segmento de Cloud Storage:
gcloud storage cp src/tensorflow-mnist-example gs://PROJECT_ID-gke-gpu-bucket/ --recursiveCrea las siguientes variables de entorno:
export K8S_SA_NAME=gpu-k8s-sa export BUCKET_NAME=PROJECT_ID-gke-gpu-bucketRevisa la tarea de entrenamiento:
Despliega la tarea de entrenamiento:
envsubst < src/gke-config/standard-tf-mnist-train.yaml | kubectl -n gke-ai-namespace apply -f -Este comando sustituye las variables de entorno que has creado por las referencias correspondientes en el manifiesto. También puedes abrir el archivo de manifiesto en un editor de texto y sustituir
$K8S_SA_NAMEy$BUCKET_NAMEpor los valores correspondientes.Espera hasta que el trabajo tenga el estado
Completed:kubectl wait -n gke-ai-namespace --for=condition=Complete job/mnist-training-job --timeout=180sEl resultado debería ser similar al siguiente:
job.batch/mnist-training-job condition metConsulta los registros del contenedor de TensorFlow:
kubectl logs -f jobs/mnist-training-job -c tensorflow -n gke-ai-namespaceEn el resultado se muestran los siguientes eventos:
- Instalar los paquetes de Python necesarios
- Descargar el conjunto de datos MNIST
- Entrenar 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 savedElimina la carga de trabajo de entrenamiento:
kubectl -n gke-ai-namespace delete -f src/gke-config/standard-tf-mnist-train.yamlCopia las imágenes para la predicción en el segmento:
gcloud storage cp data/mnist_predict gs://PROJECT_ID-gke-gpu-bucket/ --recursiveRevisa la carga de trabajo de inferencia:
Despliega la carga de trabajo de inferencia:
envsubst < src/gke-config/standard-tf-mnist-batch-predict.yaml | kubectl -n gke-ai-namespace apply -f -Este comando sustituye las variables de entorno que has creado por las referencias correspondientes en el manifiesto. También puedes abrir el archivo de manifiesto en un editor de texto y sustituir
$K8S_SA_NAMEy$BUCKET_NAMEpor los valores correspondientes.Espera hasta que el trabajo tenga el estado
Completed:kubectl wait -n gke-ai-namespace --for=condition=Complete job/mnist-batch-prediction-job --timeout=180sEl resultado debería ser similar al siguiente:
job.batch/mnist-batch-prediction-job condition metConsulta los registros del contenedor de TensorFlow:
kubectl logs -f jobs/mnist-batch-prediction-job -c tensorflow -n gke-ai-namespaceEl resultado es la predicción de cada imagen y la confianza del modelo en la predicción, como se muestra a continuación:
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.- Mantener el clúster de GKE: elimina los recursos de Kubernetes del clúster y los recursos de Google Cloud .
- Mantener el Google Cloud proyecto: elimina el clúster de GKE y los Google Cloud recursos.
- Eliminar el proyecto
Elimina el espacio de nombres de Kubernetes y las cargas de trabajo que hayas desplegado:
kubectl -n gke-ai-namespace delete -f src/gke-config/standard-tf-mnist-batch-predict.yaml kubectl delete namespace gke-ai-namespaceElimina el segmento de Cloud Storage:
Ve a la página Segmentos:
Marca la casilla de
PROJECT_ID-gke-gpu-bucket.Haz clic en Eliminar.
Para confirmar la eliminación, escribe
DELETEy haz clic en Eliminar.
Elimina la Google Cloud cuenta de servicio:
Ve a la página Cuentas de servicio:
Selecciona el proyecto.
Marca la casilla de
gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com.Haz clic en Eliminar.
Para confirmar que quieres eliminarlo, haz clic en Eliminar.
Elimina el clúster de GKE:
Ve a la página Clústeres:
Marca la casilla de
gke-gpu-cluster.Haz clic en Eliminar.
Para confirmar la eliminación, escribe
gke-gpu-clustery haz clic en Eliminar.
Elimina el segmento de Cloud Storage:
Ve a la página Segmentos:
Marca la casilla de
PROJECT_ID-gke-gpu-bucket.Haz clic en Eliminar.
Para confirmar la eliminación, escribe
DELETEy haz clic en Eliminar.
Elimina la Google Cloud cuenta de servicio:
Ve a la página Cuentas de servicio:
Selecciona el proyecto.
Marca la casilla de
gke-ai-sa@PROJECT_ID.iam.gserviceaccount.com.Haz clic en Eliminar.
Para confirmar que quieres eliminarlo, haz clic en Eliminar.
- 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.
Roles obligatorios
Para obtener los permisos que necesitas para entrenar un modelo en GPUs, pide a tu administrador que te conceda los siguientes roles de gestión de identidades y accesos en tu proyecto:
Para obtener más información sobre cómo conceder roles, consulta el artículo Gestionar acceso a proyectos, carpetas y organizaciones.
También puedes conseguir los permisos necesarios a través de roles personalizados u otros roles predefinidos.
Clonar el repositorio de muestra
En Cloud Shell, ejecuta el siguiente 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
Crear un clúster en modo Estándar y un grupo de nodos de GPU
Usa Cloud Shell para hacer lo siguiente:
Crea un segmento de Cloud Storage
Configurar el clúster para acceder al bucket mediante Workload Identity Federation for GKE
Para permitir que tu clúster acceda al segmento de Cloud Storage, haz lo siguiente:
Crea una Google Cloud cuenta de servicio
Crear una ServiceAccount de Kubernetes en tu clúster
En Cloud Shell, haz lo siguiente:
Vincula la cuenta de servicio de Kubernetes a la Google Cloud cuenta de servicio.
En Cloud Shell, ejecuta los siguientes comandos:
Verificar que los pods pueden acceder al segmento de Cloud Storage
Entrenar y predecir usando 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.
Desplegar una carga de trabajo de inferencia
En esta sección, implementarás una carga de trabajo de inferencia que toma un conjunto de datos de ejemplo como entrada y devuelve predicciones.
Limpieza
Para evitar que se apliquen cargos en tu cuenta de Google Cloud por los recursos que has creado en esta guía, haz una de las siguientes acciones: