En esta guía, se usa una carga de trabajo de entrenamiento de JAX que se ejecuta hasta completarse en el mismo clúster que los componentes del controlador de Pathways para demostrar cómo ejecutar una carga de trabajo por lotes.
Puedes ejecutar cargas de trabajo por lotes en un clúster de Google Kubernetes Engine (GKE) o en un clúster de Cluster Director con Slurm:
- En GKE, la finalización de la carga de trabajo de JAX finaliza los componentes del clúster de Pathways.
- En Cluster Director, los componentes del controlador de Pathways se ejecutan como un trabajo de Slurm independiente, por lo que siguen ejecutándose después de que se completa la carga de trabajo de JAX, hasta que los detengas.
Esta página contiene instrucciones para ambas plataformas. En cada sección, selecciona la pestaña GKE o Cluster Director.
Antes de comenzar
-
Selecciona la pestaña según cómo planeas usar las muestras de esta página:
gcloud
Instala Google Cloud CLI y, luego, accede a gcloud CLI con tu identidad federada. Después de acceder, inicializa Google Cloud CLI con el siguiente comando:
gcloud initREST
Para usar las muestras de la API de REST incluidas en esta página en un entorno de desarrollo local, debes usar las credenciales que proporciones a la gcloud CLI.
Instala Google Cloud CLI y, luego, accede a gcloud CLI con tu identidad federada.
Para obtener más información, consulta Autentícate para usar REST en la documentación de autenticación de Google Cloud .
Antes de comenzar
GKE
Completa los siguientes requisitos previos:
- Crea un clúster de GKE.
- Configura Cluster Toolkit.
- Instala las herramientas de Kubernetes.
- Habilita la API de Kubernetes Engine.
- Crea un bucket de Cloud Storage para los artefactos y los resultados de Pathways.
Cluster Director
Completa los siguientes requisitos previos:
- Crea un clúster de Cluster Director y configura el entorno de Pathways.
- Crea un bucket de Cloud Storage en el que puedas escribir para los datos de borrador y los puntos de control de Pathways.
Compila una imagen de entrenamiento con MaxText
MaxText es un proyecto de modelo de lenguaje grande (LLM) de código abierto desarrollado por Google. Está escrito en JAX y diseñado para ejecutarse de manera eficiente en TPU y GPU de Google Cloud .
GKE
Para compilar una imagen de Docker de MaxText con la versión más reciente estable de JAX del repositorio de GitHub de código abierto, ejecuta el siguiente comando:
git clone https://github.com/AI-Hypercomputer/maxtext cd maxtext gcloud config set project PROJECT_ID bash src/dependencies/scripts/docker_build_dependency_image.sh MODE=stable gcloud auth configure-docker # This script needs bash version >= 4.2 to execute. bash src/dependencies/scripts/docker_upload_runner.sh \ CLOUD_IMAGE_NAME=USER_runner
Reemplaza lo siguiente:
PROJECT_ID: Es el ID del proyecto deGoogle Cloud .USER: Es tu ID de usuario deGoogle Cloud .
Este comando envía la imagen de Kubernetes de MaxText a
gcr.io/PROJECT_ID/USER_runner.
Puedes usar esta imagen de Docker para ejecutar el entrenamiento en TPU con el backend de
Pathways.
Cluster Director
No es necesario que compiles una imagen de entrenamiento: setup_env.sh instaló MaxText
en el entorno de Pathways en /home/pathways, y run_maxtext.sh lo
ejecuta.
Ejecuta una carga de trabajo por lotes
GKE
Si el objeto binario
gclusterno está en tu variable de entornoPATH, agrega el directorio que contienegclustera tuPATH:export PATH="$PATH:CLUSTER_TOOLKIT_PATH"
Reemplaza
CLUSTER_TOOLKIT_PATHpor la ruta de acceso absoluta al directorio que contiene el objeto binariogcluster, como$HOME/cluster-toolkit.Envía la imagen de Docker de MaxText compilada previamente con el comando
gcluster job submit:gcluster job submit \ --pathways \ --pathways-gcs-location="gs://BUCKET_NAME/pathways-artifacts" \ --name=WORKLOAD \ --cluster=CLUSTER \ --project=PROJECT_ID \ --location=LOCATION \ --num-slices=WORKLOAD_NODEPOOL_COUNT \ --compute-type=COMPUTE_TYPE \ --topology=TOPOLOGY \ --image="gcr.io/PROJECT_ID/USER_runner" \ --command="python3 -m maxtext.trainers.pre_train.train /deps/src/maxtext/configs/base.yml base_output_directory=gs://BUCKET_NAME per_device_batch_size=1 enable_checkpointing=false remat_policy=full global_parameter_scale=1 steps=20 max_target_length=2048 use_iota_embed=true reuse_example_batch=1 dataset_type=synthetic attention=flash gcs_metrics=True enable_single_controller=True run_name=RUN_NAME-pathways-job"
Reemplaza lo siguiente:
BUCKET_NAME: Es el bucket de Cloud Storage para los resultados.WORKLOAD: Es un nombre único para identificar tu carga de trabajo (22 caracteres o menos debido a los límites de las etiquetas de DNS).CLUSTER: Es el nombre del clúster de GKE.PROJECT_ID: Es el ID del proyecto deGoogle Cloud .LOCATION: Es la región o zona de tu clúster de GKE.WORKLOAD_NODEPOOL_COUNT: es la cantidad de grupos de nodos de porción de TPU.COMPUTE_TYPE: Es el tipo de máquina de TPU, por ejemplo,ct6e-standard-4t. Para obtener más información sobre los tipos de TPU compatibles con cada versión de TPU, consulta Versiones de TPU.TOPOLOGY: la topología de ubicación de la TPU, por ejemplo,2x4.USER: Es tu ID de usuario deGoogle Cloud .RUN_NAME: Es un nombre asignado por el usuario para identificar la ejecución del flujo de trabajo.
Para obtener más información sobre las opciones de envío de trabajos, consulta la Guía de envío de trabajos de Cluster Toolkit.
Sigue el progreso de tu carga de trabajo con el comando
gcluster job logs:gcluster job logs WORKLOAD \ --cluster=CLUSTER \ --project=PROJECT_ID \ --location=LOCATION \ --main-only \ --follow
El resultado es similar a lo siguiente:
completed step: 0, seconds: 1.259, TFLOP/s/device: 10.792, Tokens/s/device: 1626.636, total_weights: 65536, loss: 10.876, lm_loss: 10.876, perplexity: 52906.090 completed step: 1, seconds: 3.366, TFLOP/s/device: 4.036, Tokens/s/device: 608.366, total_weights: 65536, loss: 10.876, lm_loss: 10.876, perplexity: 52906.090 completed step: 2, seconds: 0.264, TFLOP/s/device: 51.415, Tokens/s/device: 7749.885, total_weights: 65536, loss: 10.563, lm_loss: 10.563, perplexity: 38665.316 completed step: 3, seconds: 1.025, TFLOP/s/device: 13.257, Tokens/s/device: 1998.187, total_weights: 65536, loss: 9.983, lm_loss: 9.983, perplexity: 21646.125 completed step: 4, seconds: 1.194, TFLOP/s/device: 11.376, Tokens/s/device: 1714.750, total_weights: 65536, loss: 9.462, lm_loss: 9.462, perplexity: 12864.218 completed step: 5, seconds: 1.185, TFLOP/s/device: 11.465, Tokens/s/device: 1728.203, total_weights: 65536, loss: 8.961, lm_loss: 8.961, perplexity: 7791.373Opcional: Para cancelar la carga de trabajo antes de que se complete, usa el comando
gcluster job cancel:gcluster job cancel WORKLOAD \ --cluster=CLUSTER \ --project=PROJECT_ID \ --location=LOCATION
Cluster Director
Ejecuta los siguientes comandos en el nodo de acceso del clúster desde ~/pathways.
Las secuencias de comandos se buscan entre sí y escriben sus registros en ese directorio.
Inicia el servicio de Pathways:
cd ~/pathways SLICE_SHAPE=TOPOLOGY \ MIN_SLICES=MIN_SLICES \ MAX_SLICES=MAX_SLICES \ GCS_BUCKET=gs://BUCKET_NAME \ sbatch start_pathways.sh
Reemplaza lo siguiente:
TOPOLOGY: la topología de TPU de cada porción. Debe coincidir con elacceleratorTopologyde tu conjunto de nodos de TPU, por ejemplo,2x4.MIN_SLICES: Es la cantidad mínima de porciones en ejecución que se requieren para iniciar y continuar el entrenamiento.MAX_SLICES: Es la cantidad máxima de porciones que se usarán, normalmente la cantidad de porciones en el conjunto de nodos.BUCKET_NAME: Es el bucket de Cloud Storage para los datos temporales y los puntos de control de Pathways.
Si tu partición de TPU no es la predeterminada del clúster, también establece
PARTITIONen su nombre.El servicio está listo cuando su registro,
pathways-service-JOB_ID.out(en el queJOB_IDes el ID de trabajo de Slurm), muestra un resultado similar al siguiente:Pathways Runtime Service is READY! Discovery file : /home/USER/pathways/cluster.env IFRT Proxy Target : grpc://RM_IP:29000 Running TPU Slices : 2 / 2 (min=2)Envía la carga de trabajo de entrenamiento de MaxText. Puedes enviarlo justo después del trabajo de servicio: espera hasta una hora para que el servicio esté listo.
sbatch run_maxtext.shEl trabajo de MaxText espera hasta que el servicio de Pathways tenga al menos
MIN_SLICESporciones en ejecución antes de comenzar el entrenamiento. La carga de trabajo entrena a Llama 3.1 8B con datos sintéticos. La configuración de porciones y el bucket provienen del servicio, por lo que no debes establecerlos en este trabajo. Puedes establecer las siguientes variables opcionales:STEPS: Es la cantidad de pasos de entrenamiento. El valor predeterminado es30.CHECKPOINT_PERIOD: Es la cantidad de pasos entre los puntos de control. El valor predeterminado5.BASE_OUTPUT_DIR: Es la ruta de acceso de Cloud Storage en la que MaxText escribe los puntos de control. El valor predeterminado esgs://BUCKET_NAME/maxtext-runs.REDUCED_LAYERS=1: Entrena una variante de 8 capas en lugar de las 32 capas completas para las porciones de2x2.
Sigue el progreso de tu carga de trabajo (reemplaza
JOB_IDpor el ID de trabajo de Slurm del trabajo de MaxText). MaxText escribe su registro en el error estándar:tail -f maxtext-llama31-JOB_ID.err
Cada paso de entrenamiento imprime una línea similar a la siguiente:
completed step: 24, seconds: 0.326, live slice count: 2, TFLOP/s/device: 88.199, Tokens/s/device: 6289.27, total_weights: 32768, loss: 6.238Puedes volver a enviar
run_maxtext.shmás tarde sin reiniciar el servicio.Cuando termines, detén la carga de trabajo y, luego, el servicio de Pathways:
scancel -u ${USER} -n maxtext-llama31 scancel -u ${USER} -n pathways-serviceSi cancelas el servicio, también se cancelarán los trabajos de los trabajadores de Pathways. Las VMs de TPU son nodos estáticos, por lo que siguen ejecutándose y están disponibles para otros trabajos de Slurm.
Si tienes problemas, consulta Soluciona problemas de Pathways en Cloud.