En esta guía, se muestra cómo optimizar el aprovisionamiento de GPU para cargas de trabajo de entrenamiento a pequeña y mediana escala mediante el modo de aprovisionamiento de inicio flexible. En esta guía, usarás el modo de aprovisionamiento de inicio flexible para implementar una carga de trabajo que consta de dos trabajos de Kubernetes, cada uno de los cuales requiere una GPU. GKE aprovisiona automáticamente un nodo único con dos GPUs A100 para ejecutar ambos trabajos.
Si tu carga de trabajo requiere procesamiento distribuido de varios nodos, considera usar el modo de aprovisionamiento de inicio flexible con aprovisionamiento en cola. Para obtener más información, consulta Cómo ejecutar una carga de trabajo a gran escala con inicio flexible y aprovisionamiento en fila.
Esta guía está dirigida a ingenieros de aprendizaje automático (AA), administradores y operadores de plataformas, y a especialistas en datos y AI que estén interesados en usar las capacidades de organización de contenedores de Kubernetes para ejecutar cargas de trabajo por lotes. Para obtener más información sobre los roles comunes y las tareas de ejemplo a las que hacemos referencia en el contenido de Google Cloud , consulta Tareas y roles comunes de los usuarios de GKE Enterprise.
Antes de comenzar
Antes de comenzar, asegúrate de haber realizado las siguientes tareas:
- Habilita la API de Google Kubernetes Engine. Habilitar la API de Google Kubernetes Engine
- Si deseas usar Google Cloud CLI para esta tarea, instala y, luego, inicializa gcloud CLI. Si ya instalaste gcloud CLI, ejecuta
gcloud components update
para obtener la versión más reciente.
- Asegúrate de tener un clúster de Autopilot o un clúster Standard en la versión 1.32.2-gke.1652000 o posterior.
- Asegúrate de estar familiarizado con las limitaciones del modo de aprovisionamiento de inicio flexible.
- Cuando uses un clúster estándar, asegúrate de mantener al menos un grupo de nodos sin el modo de aprovisionamiento de inicio flexible habilitado para que el clúster funcione correctamente.
Crea un grupo de nodos con el modo de aprovisionamiento de inicio flexible
Para crear un grupo de nodos con el modo de aprovisionamiento de inicio flexible habilitado en un clúster Standard existente, puedes usar la CLI de gcloud o Terraform.
Si usas un clúster en modo Autopilot, omite esta sección y ve a la sección Ejecuta una carga de trabajo de entrenamiento.
gcloud
Crea un grupo de nodos con el modo de aprovisionamiento de inicio flexible:
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location LOCATION_NAME \ --project CLUSTER_PROJECT_ID \ --accelerator=type=nvidia-a100-80gb,count=2 \ --machine-type=a2-ultragpu-2g \ --flex-start \ --num-nodes=0 \ --enable-autoscaling \ --total-min-nodes=0 \ --total-max-nodes=5 \ --location-policy=ANY \ --reservation-affinity=none \ --no-enable-autorepair
Reemplaza lo siguiente:
NODE_POOL_NAME
: es el nombre que eliges para el grupo de nodos.LOCATION_NAME
: Es la región de procesamiento del plano de control del clúster.CLUSTER_NAME
: Es el nombre del clúster estándar que deseas modificar.
En este comando, la marca
--flex-start
le indica agcloud
que cree un grupo de nodos con el modo de aprovisionamiento de inicio flexible habilitado.GKE crea un grupo de nodos con nodos que contienen dos GPUs A100 (
a2-ultragpu-2g
). Este grupo de nodos escala automáticamente los nodos de cero a un máximo de cinco nodos.Verifica el estado del modo de aprovisionamiento de inicio flexible en el grupo de nodos:
gcloud container node-pools describe NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --location LOCATION_NAME \ --format="get(config.flexStart)"
Si el modelo de aprovisionamiento de inicio flexible está habilitado en el grupo de nodos, el campo
flexStart
se establece enTrue
.
Terraform
Puedes usar el modo de aprovisionamiento de inicio flexible con GPUs mediante un módulo de Terraform.
Agrega el siguiente bloque a la configuración de Terraform:
resource "google_container_node_pool" " "gpu_dws_pool" { name = "gpu-dws-pool" queued_provisioning { enabled = false } } node_config { machine_type = "a3-highgpu-8g" flex_start = true }
Terraform llama a las APIs de Google Cloud para crear un clúster con un grupo de nodos que use el modo de aprovisionamiento de inicio flexible con GPUs. En un principio, el grupo de nodos no tiene nodos y el ajuste de escala automático está habilitado. Para obtener más información sobre Terraform, consulta las especificaciones del recurso google_container_node_pool
en terraform.io.
Ejecuta una carga de trabajo de entrenamiento
En esta sección, crearás dos trabajos de Kubernetes que requieren una GPU cada uno. Un controlador de trabajos en Kubernetes crea uno o más Pods y se asegura de que ejecuten correctamente una tarea específica.
En la consola de Google Cloud, haz clic en
Activar Cloud Shell en la consola de Google Cloud para iniciar una sesión de Cloud Shell. Se abrirá una sesión en el panel inferior de la consola de Google Cloud.
Crea un archivo llamado
dws-flex-start.yaml
:apiVersion: batch/v1 kind: Job metadata: name: gpu-job-1 spec: template: spec: nodeSelector: cloud.google.com/gke-flex-start: "true" containers: - name: gpu-container-1 image: gcr.io/k8s-staging-perf-tests/sleep:latest args: ["10s"] # Sleep for 10 seconds resources: requests: nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1 restartPolicy: OnFailure --- apiVersion: batch/v1 kind: Job metadata: name: gpu-job-2 spec: template: spec: nodeSelector: cloud.google.com/gke-flex-start: "true" containers: - name: gpu-container-2 image: gcr.io/k8s-staging-perf-tests/sleep:latest args: ["10s"] # Sleep for 10 seconds resources: requests: nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1 restartPolicy: OnFailure
Aplica el manifiesto
dws-flex-start.yaml
:kubectl apply -f dws-flex-start.yaml
Verifica que las tareas se ejecuten en el mismo nodo:
kubectl get pods -l "job-name in (gpu-job-1,gpu-job-2)" -o wide
El resultado es similar a este:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES gpu-job-1 0/1 Completed 0 19m 10.(...) gke-flex-zonal-a2 <none> <none> gpu-job-2 0/1 Completed 0 19m 10.(...) gke-flex-zonal-a2 <none> <none>
Limpia
Para evitar que se apliquen cargos a tu Google Cloud cuenta por los recursos que usaste en esta página, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
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.
Borra el recurso individual
Borra los trabajos:
kubectl delete job -l "job-name in (gpu-job-1,gpu-job-2)"
Borra el grupo de nodos:
gcloud container node-pools delete NODE_POOL_NAME \ --location LOCATION_NAME
Borra el clúster:
gcloud container clusters delete CLUSTER_NAME
¿Qué sigue?
- Obtén más información sobre las GPU en GKE.
- Obtén más información sobre el aprovisionamiento automático de nodos.
- Obtén más información sobre las prácticas recomendadas para ejecutar cargas de trabajo por lotes en GKE.