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 con el modo de aprovisionamiento de inicio flexible. En esta guía, usarás flex-start para implementar una carga de trabajo que consta de dos trabajos de Kubernetes. Cada trabajo requiere una GPU. GKE aprovisiona automáticamente un solo nodo con dos GPUs A100 para ejecutar ambos trabajos.
Si tu carga de trabajo requiere procesamiento distribuido de varios nodos, considera usar flex-start con aprovisionamiento en cola. Para obtener más información, consulta Ejecuta una carga de trabajo a gran escala con inicio flexible y aprovisionamiento en cola.
Esta guía está dirigida a ingenieros de aprendizaje automático (AA), administradores y operadores de plataformas, y especialistas en datos y en IA 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 los que hacemos referencia en el contenido de Google Cloud , consulta Roles y tareas comunes de los usuarios de GKE.
Precios de inicio flexible
Se recomienda el inicio flexible si tu carga de trabajo requiere recursos aprovisionados de forma dinámica según sea necesario, por hasta siete días con reservas a corto plazo, sin administración compleja de cuotas y con acceso rentable. El inicio flexible cuenta con la tecnología del programador dinámico de cargas de trabajo y se factura según los precios del programador dinámico de cargas de trabajo:
- Descuento (hasta un 53%) en CPU virtuales, GPU y TPU.
- Pagas por lo que usas.
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 quieres 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.
- Verifica que tengas un clúster de Autopilot o un clúster estándar que ejecute la versión 1.33.0-gke.1712000 o posterior.
- Verifica que conozcas las limitaciones de flex-start.
- Cuando uses un clúster estándar, verifica que mantengas al menos un grupo de nodos sin el inicio flexible habilitado para que el clúster funcione correctamente.
- Verifica que tengas cuota para las GPUs interrumpibles en las ubicaciones de tus nodos.
Si no tienes un clúster o este no cumple con los requisitos, puedes crear un clúster regional estándar con gcloud CLI. Agrega las siguientes marcas para que puedas obtener información sobre flex-start:
--location=us-central1 \
--node-locations=us-central1-a,us-central1-b \
--machine-type=g2-standard-8
Cuando crees un grupo de nodos de inicio flexible, usa las marcas mencionadas anteriormente y --accelerator type=nvidia-l4,count=1
.
Si tienes un clúster estándar que cumple con los requisitos, en las siguientes secciones, se te guiará para que selecciones un tipo de acelerador de GPU y un tipo de máquina para tu clúster.
Elige un tipo de acelerador de GPU
Si usas un clúster en modo Autopilot, omite esta sección y ve a la sección Ejecuta una carga de trabajo por lotes.
La disponibilidad de GPU es específica para cada zona. Debes encontrar un tipo de acelerador de GPU que esté disponible en una zona en la que se encuentre el clúster estándar. Si tienes un clúster estándar regional, la zona en la que está disponible el tipo de acelerador de GPU debe estar en la región en la que se encuentra el clúster. Cuando creas el grupo de nodos, especificas el tipo de acelerador y las zonas para los nodos. Si especificas un tipo de acelerador que no está disponible en la ubicación del clúster, falla la creación del grupo de nodos.
Ejecuta los siguientes comandos para obtener la ubicación de tu clúster y un tipo de acelerador de GPU compatible.
Obtén la ubicación en la que se encuentra el clúster:
gcloud container clusters list
El resultado es similar a este:
NAME LOCATION MASTER_VERSION MASTER_IP MACHINE_TYPE NODE_VERSION NUM_NODES STATUS STACK_TYPE example-cluster-1 us-west2 1.33.2-gke.1111000 34.102.3.122 e2-medium 1.33.2-gke.1111000 9 RUNNING IPV4
Enumera los tipos de aceleradores de GPU disponibles, sin incluir las estaciones de trabajo virtuales en la ubicación:
gcloud compute accelerator-types list | grep LOCATION_NAME | grep -v "Workstation"
Reemplaza
LOCATION_NAME
por la ubicación del clúster.Por ejemplo, para obtener una lista de los tipos de aceleradores de GPU en la región
us-west2
, ejecuta el siguiente comando:gcloud compute accelerator-types list | grep us-west2 | grep -v "Workstation"
El resultado es similar a este:
nvidia-b200 us-west2-c NVIDIA B200 180GB nvidia-tesla-p4 us-west2-c NVIDIA Tesla P4 nvidia-tesla-t4 us-west2-c NVIDIA T4 nvidia-tesla-p4 us-west2-b NVIDIA Tesla P4 nvidia-tesla-t4 us-west2-b NVIDIA T4
Elige un tipo de máquina compatible
Si usas un clúster en modo Autopilot, omite esta sección y ve a la sección Ejecuta una carga de trabajo por lotes.
Después de saber qué GPUs están disponibles en la ubicación del clúster, puedes determinar los tipos de máquinas compatibles. Google Cloud restringe las GPUs a series de máquinas específicas. Sigue estos pasos para encontrar un tipo de máquina:
- Consulta la tabla Modelos de GPU disponibles.
- Ubica la fila del tipo de acelerador de GPU que elegiste.
- Observa la columna "Serie de la máquina" de esa fila. En esta columna, se indica qué serie de máquinas debes usar.
- Para ver los nombres de tipo de máquina que puedes especificar, haz clic en el vínculo de la serie de máquinas.
La única excepción es la serie de máquinas N1, que proporciona orientación adicional sobre los tipos de máquinas N1 que puedes usar con el tipo de acelerador que elegiste.
Antes de usar una máquina optimizada para aceleradores, asegúrate de que sea compatible con el modo de aprovisionamiento de inicio flexible, como se muestra en Disponibilidad de opciones de consumo por tipo de máquina.
Cómo determinar el recuento de aceleradores
Si usas un clúster en modo Autopilot, omite esta sección y ve a la sección Ejecuta una carga de trabajo por lotes.
Para crear un grupo de nodos, debes determinar la cantidad de aceleradores que se adjuntarán a cada nodo del grupo. Los valores válidos dependen del tipo de acelerador y de tipo de máquina. Cada tipo de máquina tiene un límite en la cantidad de GPUs que puede admitir. Para determinar qué valor usar (además del valor predeterminado de 1
), haz lo siguiente:
- Consulta Tipos de máquinas de GPU.
- En la tabla, busca el tipo de acelerador para el tipo de serie de tu máquina.
- Usa el valor de la columna "Cantidad de GPU".
Crea un grupo de nodos con inicio flexible
Si usas un clúster en modo Autopilot, omite esta sección y ve a la sección Ejecuta una carga de trabajo por lotes.
Para crear un grupo de nodos con flex-start habilitado en un clúster estándar existente, puedes usar gcloud CLI o Terraform.
gcloud
Crea un grupo de nodos con flex-start:
gcloud container node-pools create NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --location LOCATION_NAME \ --project PROJECT_ID \ --accelerator type=ACCELERATOR_TYPE,count=COUNT \ --machine-type MACHINE_TYPE \ --max-run-duration MAX_RUN_DURATION \ --flex-start \ --node-locations NODE_ZONES \ --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.CLUSTER_NAME
: Es el nombre del clúster estándar que deseas modificar.LOCATION_NAME
: Es la región de procesamiento del plano de control del clúster.PROJECT_ID
: el ID de tu proyectoACCELERATOR_TYPE
: Es el tipo específico de acelerador (por ejemplo,nvidia-tesla-t4
para NVIDIA T4) que se conectará a las instancias.COUNT
: Es la cantidad de aceleradores que se deben conectar a las instancias. El valor predeterminado es1
.MACHINE_TYPE
: Es el tipo de máquina que se usará para los nodos.MAX_RUN_DURATION
: es opcional. Es el tiempo de ejecución máximo de un nodo en segundos, hasta el valor predeterminado de siete días. El número que ingreses debe terminar ens
. Por ejemplo, para especificar un día, ingresa86400s
.NODE_ZONES
: Es una lista separada por comas de una o más zonas en las que GKE crea el grupo de nodos.
En este comando, la marca
--flex-start
le indica agcloud
que cree un grupo de nodos con el inicio flexible habilitado.GKE crea un grupo de nodos con nodos que contienen dos instancias del tipo de acelerador especificado. En un principio, el grupo de nodos no tiene nodos y el ajuste de escala automático está habilitado.
Verifica el estado de flex-start 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 inicio flexible está habilitado en el grupo de nodos, el campo
flexStart
se establece enTrue
.
Terraform
Puedes usar flex-start con GPUs a través de 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 = "MACHINE_TYPE"
accelerator_type = "ACCELERATOR_TYPE"
accelerator_count = COUNT
node_locations = ["NODE_ZONES"]
flex_start = true
}
Reemplaza lo siguiente:
MACHINE_TYPE
: Es el tipo de máquina que se usará para los nodos.ACCELERATOR_TYPE
: Es el tipo específico de acelerador (por ejemplo,nvidia-tesla-t4
para NVIDIA T4) que se adjuntará a las instancias.COUNT
: Es la cantidad de aceleradores que se deben conectar a las instancias. El valor predeterminado es1
.NODE_ZONES
: La lista separada por comas de una o más zonas en las que GKE crea el grupo de nodos.
Terraform llama a las APIs de Google Cloud para crear un clúster con un grupo de nodos que usa flex-start 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 por lotes
En esta sección, crearás dos Jobs de Kubernetes que requieren una GPU cada uno. Un controlador de Job en Kubernetes crea uno o más Pods y garantiza que ejecuten correctamente una tarea específica.En la Google Cloud consola, haz clic en
Activar Cloud Shell 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: job-1 spec: template: spec: nodeSelector: cloud.google.com/gke-flex-start: "true" cloud.google.com/gke-accelerator: ACCELERATOR_TYPE containers: - name: 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: job-2 spec: template: spec: nodeSelector: cloud.google.com/gke-flex-start: "true" cloud.google.com/gke-accelerator: ACCELERATOR_TYPE containers: - name: 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 los trabajos se ejecuten en el mismo nodo:
kubectl get pods -l "job-name in (job-1,job-2)" -o wide
El resultado es similar a este:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES job-1 0/1 Completed 0 19m 10.(...) gke-flex-zonal-a2 <none> <none> job-2 0/1 Completed 0 19m 10.(...) gke-flex-zonal-a2 <none> <none>
Limpia
Para evitar que se apliquen cargos a tu cuenta de Google Cloud 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 (job-1,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.