Entrena un modelo con GPU en el modo GKE Standard
En este instructivo 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. En este instructivo, 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 Entrena un modelo con GPUs en el modo GKE Autopilot.
Este documento está dirigido a los administradores de GKE que tienen clústeres Standard existentes y desean ejecutar cargas de trabajo de GPU por primera vez.
Antes de comenzar
-
In the Cloud de Confiance console, on the project selector page, select or create a Cloud de Confiance 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 usas un proyecto existente en esta guía, verifica que tengas los permisos necesarios para completarla. Si creaste un proyecto nuevo, ya tienes los permisos necesarios.
-
Verify that billing is enabled for your Cloud de Confiance 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 Cloud de Confiance console, activate Cloud Shell.
At the bottom of the Cloud de Confiance 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.
-
Administra clústeres de GKE:
Administrador de Kubernetes Engine (
roles/container.admin) -
Administrar buckets de Cloud Storage:
Administrador de almacenamiento (
roles/storage.admin) -
Otorga roles de IAM en el proyecto:
Administrador de IAM del proyecto (
roles/resourcemanager.projectIamAdmin) -
Crea y otorga roles en cuentas de servicio de IAM:
Administrador de cuentas de servicio (
roles/iam.serviceAccountAdmin) Crea un clúster de Standard que use la federación de identidades para cargas de trabajo para GKE e instale el controlador de Cloud Storage FUSE:
gcloud container clusters create gke-gpu-cluster \ --addons GcsFuseCsiDriver \ --location=us-central1 \ --num-nodes=1 \ --workload-pool=PROJECT_ID.s3ns.svc.id.googReemplaza
PROJECT_IDpor el ID del proyecto de Cloud de Confiance.La creación del clúster puede tomar 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 consola de Cloud de Confiance , 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-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 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.
- Crea una cuenta de servicio Cloud de Confiance .
- Crea una ServiceAccount de Kubernetes en tu clúster.
- Vincula la ServiceAccount de Kubernetes a la cuenta de servicio de Cloud de Confiance .
En la consola de Cloud de Confiance , ve a la página Crear cuenta de servicio:
En el campo ID de cuenta de servicio, ingresa
gke-ai-sa.Haz clic en Crear y continuar.
En la lista Rol, selecciona el rol Cloud Storage > Servicio de recopilador de Storage Insights.
Haz clic en Agregar otro rol.
En la lista Seleccionar un rol, selecciona el rol Cloud Storage > Administrador de objetos de almacenamiento.
Haz clic en Continuar y, luego, en Listo.
Crea un espacio de nombres de Kubernetes:
kubectl create namespace gke-ai-namespaceCrea una ServiceAccount de Kubernetes en el espacio de nombres:
kubectl create serviceaccount gpu-k8s-sa --namespace=gke-ai-namespaceAgrega una vinculación de IAM a la cuenta de servicio Cloud de Confiance :
gcloud iam service-accounts add-iam-policy-binding gke-ai-sa@PROJECT_ID.s3ns.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.s3ns.svc.id.goog[gke-ai-namespace/gpu-k8s-sa]"La marca
--memberproporciona la identidad completa de la ServiceAccount de Kubernetes en Cloud de Confiance.Anota la ServiceAccount de Kubernetes:
kubectl annotate serviceaccount gpu-k8s-sa \ --namespace gke-ai-namespace \ iam.gke.io/gcp-service-account=gke-ai-sa@PROJECT_ID.s3ns.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-bucketReemplaza
PROJECT_IDpor el ID del proyecto de Cloud de Confiance.Crea un Pod que tenga un contenedor de TensorFlow:
envsubst < src/gke-config/standard-tensorflow-bash.yaml | kubectl --namespace=gke-ai-namespace apply -f -Este comando sustituye 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_NAMEy$BUCKET_NAMEpor los valores correspondientes.Crea un archivo de muestra en el bucket:
touch sample-file gcloud storage cp sample-file gs://PROJECT_ID-gke-gpu-bucketEspera a que el Pod esté listo:
kubectl wait --for=condition=Ready pod/test-tensorflow-pod -n=gke-ai-namespace --timeout=180sCuando el Pod está listo, el resultado es el siguiente:
pod/test-tensorflow-pod condition metAbre una 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 creaste:
ls /dataEl resultado muestra el archivo de muestra.
Verifica 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 adjunta al Pod, similar a lo siguiente:
... PhysicalDevice(name='/physical_device:GPU:0',device_type='GPU')Sal del contenedor:
exitBorra el Pod de muestra:
kubectl delete -f src/gke-config/standard-tensorflow-bash.yaml \ --namespace=gke-ai-namespaceCopia los datos de ejemplo en el bucket 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 el trabajo de entrenamiento:
Implementa el trabajo 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 creaste en las referencias correspondientes del manifiesto. También puedes abrir el manifiesto en un editor de texto y reemplazar
$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 es similar a lo siguiente:
job.batch/mnist-training-job condition metVerifica 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:
- 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 savedBorra 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 bucket:
gcloud storage cp data/mnist_predict gs://PROJECT_ID-gke-gpu-bucket/ --recursiveRevisa 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-ai-namespace apply -f -Este comando sustituye 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_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 es similar a lo siguiente:
job.batch/mnist-batch-prediction-job condition metVerifica 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 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.- Mantén el clúster de GKE: Borra los recursos de Kubernetes en el clúster y los recursos de Cloud de Confiance
- Mantén el proyecto Cloud de Confiance : Borra el clúster de GKE y los recursos Cloud de Confiance .
- Borra el proyecto
Borra el espacio de nombres de Kubernetes y las cargas de trabajo que implementaste:
kubectl -n gke-ai-namespace delete -f src/gke-config/standard-tf-mnist-batch-predict.yaml kubectl delete namespace gke-ai-namespaceBorra 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
DELETEy haz clic en Borrar.
Borra la cuenta de servicio Cloud de Confiance :
Ve a la página Cuentas de servicio:
Selecciona tu proyecto.
Selecciona la casilla de verificación correspondiente a
gke-ai-sa@PROJECT_ID.s3ns.iam.gserviceaccount.com.Haz clic en Borrar.
Para confirmar la eliminación, haz clic en Borrar.
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-clustery 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
DELETEy haz clic en Borrar.
Borra la cuenta de servicio Cloud de Confiance :
Ve a la página Cuentas de servicio:
Selecciona tu proyecto.
Selecciona la casilla de verificación correspondiente a
gke-ai-sa@PROJECT_ID.s3ns.iam.gserviceaccount.com.Haz clic en Borrar.
Para confirmar la eliminación, haz clic en Borrar.
- In the Cloud de Confiance 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, pídele a tu administrador que te otorgue los siguientes roles de IAM en tu proyecto:
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
También puedes obtener los permisos necesarios a través de roles personalizados o cualquier otro rol predefinido.
Clona 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
Crea un clúster de modo Standard y un grupo de nodos de GPU
Usa Cloud Shell para realizar las siguientes acciones:
Cree un bucket de Cloud Storage
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 Cloud de Confiance cuenta de servicio
Crea una ServiceAccount de Kubernetes en tu clúster
En Cloud Shell, haz lo siguiente:
Vincula la ServiceAccount de Kubernetes a la cuenta de servicio Cloud de Confiance
En Cloud Shell, ejecuta los siguientes comandos:
Verifica que los Pods puedan acceder al bucket de Cloud Storage
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.
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.
Realiza una limpieza
Para evitar que se apliquen cargos a tu cuenta de Cloud de Confiance por los recursos que creaste en esta guía, haz una de las siguientes acciones: