En esta guía, se muestra cómo optimizar el aprovisionamiento de TPU para cargas de trabajo de entrenamiento a mediana y pequeña escala con el modo de aprovisionamiento de inicio flexible. En esta guía, usarás el inicio flexible para implementar una carga de trabajo que consta de un grupo de nodos de porción de TPU.
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 las que hacemos referencia en el contenido de Google Cloud , consulta Tareas y roles comunes de los usuarios de GKE Enterprise.
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 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.
- 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 TPUs interrumpibles en las ubicaciones de tus nodos.
Crea un grupo de nodos con inicio flexible
Para crear un grupo de nodos con el inicio flexible habilitado en un clúster de Standard existente, usa gcloud CLI.
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.
Puedes crear un grupo de nodos de porción de TPU de host único o varios hosts con flex-start:
Crea un grupo de nodos con flex-start:
Host único
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION_NAME \ --node-locations=NODE_ZONES \ --machine-type=MACHINE_TYPE \ --reservation-affinity=none \ --enable-autoscaling \ --flex-start \ --num-nodes 0 \ --min-nodes=0 \ --max-nodes=1
Reemplaza lo siguiente:
NODE_POOL_NAME
: es el nombre que eliges para el grupo de nodos.CLUSTER_NAME
: el nombre del clústerLOCATION_NAME
: Es la región de procesamiento del plano de control del clúster.NODE_ZONES
: La lista separada por comas de una o más zonas en las que GKE crea el grupo de nodos.MACHINE_TYPE
: Es el tipo de máquina que se usará para los nodos. Para obtener más información sobre los tipos de máquinas compatibles con TPU, usa la tabla en Elige la versión de TPU.
Varios hosts
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location=LOCATION_NAME \ --node-locations=NODE_ZONES \ --machine-type=MACHINE_TYPE \ --tpu-topology=TPU_TOPOLOGY \ --flex-start \ --enable-autoscaling \ --num-nodes=0 \ --max-nodes=2 \ --reservation-affinity=none \ --no-enable-autorepair
Reemplaza lo siguiente:
NODE_POOL_NAME
: es el nombre que eliges para el grupo de nodos.CLUSTER_NAME
: el nombre del clústerLOCATION_NAME
: Es la región de procesamiento del plano de control del clúster.NODE_ZONES
: La lista separada por comas de una o más zonas en las que GKE crea el grupo de nodos.MACHINE_TYPE
: Es el tipo de máquina que se usará para los nodos. Por ejemplo, puedes usarct6e-standard-4t
para la TPU Trillium. Para obtener más información sobre los tipos de máquinas disponibles, consulta Elige la versión de TPU.TPU_TOPOLOGY
: la topología física para la porción de TPU. El formato de la topología depende de la versión de la TPU. Para obtener más información sobre las topologías de TPU, usa la tabla de Elige una topología.
El comando anterior usa las siguientes marcas obligatorias cuando creas un grupo de nodos con inicio flexible:
--enable-autoscaling
: flex-start aprovisiona solo los recursos de procesamiento necesarios cuando se ejecuta tu carga de trabajo. Debes configurar los siguientes parámetros:--num-nodes=0
--min-nodes=0
--max-nodes
se establece en la cantidad de máquinas virtuales que requiere tu porción de TPU.Por ejemplo, el comando de creación del grupo de nodos puede incluir los siguientes parámetros:
... --machine-type=ct6e-standard-4t \ --tpu-topology=4x4 \ --enable-autoscaling \ --num-nodes=0 \ --max-nodes=4 \
Este comando establece el campo
--max-nodes
en4
porque una topología4x4
consta de 16 chips y cada VMct6e-standard-4t
tiene 4 chips.
El escalador automático del clúster se ajusta verticalmente a la cantidad de nodos que requiere tu carga de trabajo. Una vez que se completa tu carga de trabajo, el escalador automático de clústeres reduce la escala a cero nodos.
--reservation-affinity=none
: flex-start no usa ni requiere reservas.
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
.
Ejecuta una carga de trabajo por lotes
En esta sección, crearás un trabajo que programa un nodo TPU con inicio flexible. 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
:Host único
Usa el siguiente manifiesto para el archivo
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-tpu-accelerator: ACCELERATOR_TYPE cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY containers: - name: container-1 image: gcr.io/k8s-staging-perf-tests/sleep:latest args: ["3600s"] # Sleep for 1 hour resources: requests: google.com/tpu: NUM_CHIPS limits: google.com/tpu: NUM_CHIPS restartPolicy: OnFailure
Varios hosts
Usa el siguiente manifiesto para el archivo
dws-flex-start.yaml
:apiVersion: v1 kind: Service metadata: name: headless-svc spec: clusterIP: None selector: job-name: job-1 --- apiVersion: batch/v1 kind: Job metadata: name: job-1 spec: backoffLimit: 0 completions: 2 parallelism: 2 completionMode: Indexed template: spec: subdomain: headless-svc restartPolicy: Never nodeSelector: cloud.google.com/gke-flex-start: "true" cloud.google.com/gke-tpu-accelerator: ACCELERATOR_TYPE cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY containers: - name: tpu-job image: python:3.10 ports: - containerPort: 8471 # Default port using which TPU VMs communicate - containerPort: 8431 # Port to export TPU runtime metrics, if supported. securityContext: privileged: true command: - bash - -c - | pip install 'jax[tpu]' -f https://storage.googleapis.com/jax-releases/libtpu_releases.html python -c 'import jax; print("TPU cores:", jax.device_count())' resources: requests: google.com/tpu: NUM_CHIPS limits: google.com/tpu: NUM_CHIPS
Reemplaza lo siguiente:
ACCELERATOR_TYPE
: El tipo de acelerador de TPU que usaste cuando creaste los grupos de nodos. Por ejemplo,tpu-v4-podslice
otpu-v5-lite-podslice
.TPU_TOPOLOGY
: la topología física para la porción de TPU. Por ejemplo, el valor puede ser4x4x4
o2x2
, según la versión de la TPU.NUM_CHIPS
: La cantidad de chips TPU en cada VM es uno, cuatro u ocho. Para obtener más información, consulta Versiones de TPU.
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
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>
Realiza una limpieza
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 TPU 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.