Crea un clúster de Cluster Director con Pathways

En esta página, se muestra a los administradores de plataformas y a los ingenieros de aprendizaje automático (AA) cómo crear un clúster de Cluster Director organizado por Slurm y configurarlo para las cargas de trabajo de Pathways. Cuando completes estos pasos, aprovisionarás un clúster con porciones de TPU v6e, un nodo de controlador de CPU, un sistema de archivos de Google Cloud Managed Lustre compartido y el entorno de ejecución de /home/pathways. Pathways no está preinstalado en un clúster de Cluster Director: después de crear el clúster, descargas las secuencias de comandos de Pathways en el nodo de acceso y ejecutas una secuencia de comandos de configuración una vez.

Antes de comenzar

  • Selecciona la pestaña según cómo planeas usar las muestras de esta página:

    gcloud

    En la consola de Google Cloud , activa Cloud Shell.

    Activa Cloud Shell

    En la parte inferior de la consola de Google Cloud , se inicia una sesión de Cloud Shell en la que se muestra una ventana de línea de comandos. Cloud Shell es un entorno de shell con Google Cloud CLI ya instalada y con valores ya establecidos para el proyecto actual. La sesión puede tardar unos segundos en inicializarse.

    REST

    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.

      Si usas un proveedor de identidad externo (IdP), primero debes acceder a la 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

Antes de comenzar, revisa los siguientes requisitos previos:

  • Instala Google Cloud CLI.
  • Habilita la API de Hypercompute Cluster.
  • Asegúrate de que tu cuenta de usuario y la cuenta de servicio predeterminada de Compute Engine tengan los roles de Identity and Access Management (IAM) necesarios para crear un clúster de Cluster Director y conectarse a él. Para obtener la lista de roles, consulta Antes de comenzar en la guía de inicio rápido de Cluster Director.
  • Crea una reserva de TPU v6e en la zona en la que planeas crear el clúster (por ejemplo, al menos cuatro VMs ct6e-standard-4t para dos porciones 2x4).
  • Configura sudo sin contraseña en los nodos del clúster para la recuperación automática de porciones. Pídele al administrador que te otorgue el rol de Acceso de administrador al SO de Compute (roles/compute.osAdminLogin) en el proyecto.
  • Crea un bucket de Cloud Storage para los datos temporales y los resultados de la carga de trabajo de Pathways, y otorga el rol de Usuario de objetos de almacenamiento (roles/storage.objectUser) en el proyecto a tu cuenta de usuario y a la cuenta de servicio predeterminada de Compute Engine.

Cómo configurar tu entorno local

Accede con tus credenciales de Google Cloud :

gcloud auth login

Define las siguientes variables de entorno con valores adecuados para tu carga de trabajo:

export PROJECT=PROJECT_ID
export REGION=REGION
export ZONE=ZONE
export CLUSTER_ID=CLUSTER_ID
export RESERVATION_NAME=RESERVATION_NAME

Reemplaza lo siguiente:

  • PROJECT_ID: Es el ID del proyecto deGoogle Cloud .
  • REGION: Es la región en la que creas recursos.
  • ZONE: Es la zona en la que creas recursos.
  • CLUSTER_ID: el nombre del clúster. El nombre puede contener hasta 10 caracteres y solo puede usar números y letras minúsculas.
  • RESERVATION_NAME: Es el nombre de tu reserva de TPU v6e en ZONE.

Crea un clúster de Cluster Director

En el siguiente ejemplo, crearás un clúster con dos porciones de TPU v6e 2x4 (cuatro VMs ct6e-standard-4t) de tu reserva y un nodo de CPU para el controlador de Pathways. Todos los nodos activan un sistema de archivos de Managed Lustre compartido en /home. Para obtener más información sobre los campos en la definición del clúster, consulta Crea un clúster personalizado.

  1. Crea el clúster con la API de REST:

    Crea el cuerpo de la solicitud:

    cat <<EOF > "${CLUSTER_ID}_create.json"
    {
      "networkResources": {
        "net": {
          "config": {
            "newNetwork": {
              "network": "projects/${PROJECT}/global/networks/${CLUSTER_ID}-net"
            }
          }
        }
      },
      "storageResources": {
        "home": {
          "config": {
            "newLustre": {
              "lustre": "projects/${PROJECT}/locations/${ZONE}/instances/${CLUSTER_ID}-lustre",
              "filesystem": "lustre",
              "capacityGb": "18000",
              "perUnitStorageThroughput": "500"
            }
          }
        }
      },
      "computeResources": {
        "crtpu": {
          "config": {
            "newReservedInstances": {
              "reservation": "projects/${PROJECT}/zones/${ZONE}/reservations/${RESERVATION_NAME}"
            }
          }
        },
        "crcpu": {
          "config": {
            "newOnDemandInstances": {
              "zone": "${ZONE}",
              "machineType": "n2-highmem-32"
            }
          }
        }
      },
      "orchestrator": {
        "slurm": {
          "loginNodes": {
            "count": "1",
            "zone": "${ZONE}",
            "machineType": "n2-standard-16",
            "enableOsLogin": true,
            "enablePublicIps": true,
            "bootDisk": {
              "type": "pd-balanced",
              "sizeGb": "100"
            },
            "storageConfigs": [
              {
                "id": "home",
                "localMount": "/home"
              }
            ]
          },
          "nodeSets": [
            {
              "id": "nstpu",
              "computeId": "crtpu",
              "staticNodeCount": "4",
              "maxDynamicNodeCount": "0",
              "enablePublicIps": true,
              "resourcePolicyConfig": {
                "acceleratorTopology": "2x4"
              },
              "computeInstance": {
                "bootDisk": {
                  "type": "hyperdisk-balanced",
                  "sizeGb": "100"
                }
              },
              "storageConfigs": [
                {
                  "id": "home",
                  "localMount": "/home"
                }
              ]
            },
            {
              "id": "nscpu",
              "computeId": "crcpu",
              "staticNodeCount": "1",
              "maxDynamicNodeCount": "0",
              "enablePublicIps": true,
              "computeInstance": {
                "bootDisk": {
                  "type": "pd-balanced",
                  "sizeGb": "100",
                  "image": "projects/clusterdirector-public-images/global/images/family/tpu-v6e-v5p-ubuntu2204-slurm2605-v20260902"
                }
              },
              "storageConfigs": [
                {
                  "id": "home",
                  "localMount": "/home"
                }
              ]
            }
          ],
          "partitions": [
            {
              "id": "tpu",
              "nodeSetIds": ["nstpu"]
            },
            {
              "id": "cpu",
              "nodeSetIds": ["nscpu"]
            }
          ],
          "defaultPartition": "tpu",
          "config": {
            "requeueExitCodes": [1, 2, 134, 137, 139, 143]
          }
        }
      }
    }
    EOF
    

    Luego, envía la solicitud:

    curl -s -X POST \
        -H "Content-Type: application/json" \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        -d @"${CLUSTER_ID}_create.json" \
        "https://hypercomputecluster.googleapis.com/v1alpha/projects/${PROJECT}/locations/${REGION}/clusters?clusterId=${CLUSTER_ID}"
    

    El clúster incluye lo siguiente:

    • Partición tpu: Es un conjunto de nodos estático de VMs de TPU v6e reservadas. staticNodeCount es la cantidad de VMs y acceleratorTopology es la topología de cada porción. Cada VM ct6e-standard-4t tiene cuatro chips, por lo que una porción 2x4 tiene dos VMs. Para obtener más porciones, multiplica: dos porciones de 2x4 necesitan un staticNodeCount de 4.
    • Partición cpu: una VM on demand que ejecuta el administrador de recursos de Pathways, el servidor proxy de IFRT y el cliente de MaxText. Las secuencias de comandos de Pathways envían trabajos a una partición llamada cpu. La VM usa el tipo de máquina n2-highmem-32 porque el servicio de Pathways y MaxText juntos necesitan hasta 240 GB de memoria mientras guardan puntos de control. También usa una imagen con Slurm 26.05, que admite porciones de TPU, ya que el servicio de Pathways envía los trabajos de trabajador TPU desde esta VM.
    • requeueExitCodes: Slurm vuelve a poner en cola un trabajo que sale con uno de estos códigos. Este parámetro de configuración permite que Slurm reinicie un trabajo de trabajador TPU cuando se interrumpe cualquier VM de la porción, no solo la primera.
  2. Espera hasta que el clúster esté listo. Puedes seguir el progreso en la página Cluster Director en la consola de Google Cloud o verificar que reconciling sea false en el resultado del siguiente comando:

    curl -s \
        -H "Authorization: Bearer $(gcloud auth print-access-token)" \
        "https://hypercomputecluster.googleapis.com/v1alpha/projects/${PROJECT}/locations/${REGION}/clusters/${CLUSTER_ID}"
    

Configura el entorno de Pathways

El entorno de Pathways se encuentra en /home/pathways en el sistema de archivos compartido, por lo que lo configuras una vez por clúster. Contiene las imágenes de contenedor de Pathways, un entorno de Python con JAX y pathwaysutils, y las secuencias de comandos de Pathways.

  1. Conéctate al nodo de acceso. Para conocer otras formas de conectarte, consulta Conéctate a un clúster.

    gcloud compute ssh ${CLUSTER_ID}-login-001 \
        --project=${PROJECT} \
        --zone=${ZONE} \
        --tunnel-through-iap
    
  2. Verifica que las particiones cpu y tpu existan y estén en el estado idle:

    sinfo -o "%P %a %D %T %N %f"
    

    El resultado es similar a lo siguiente:

    PARTITION AVAIL NODES STATE NODELIST FEATURES
    tpu* up 4 idle ${CLUSTER_ID}-nstpu-[0-3]
    cpu up 1 idle ${CLUSTER_ID}-nscpu-0
    
  3. Descarga las secuencias de comandos de Pathways en el nodo de acceso:

    mkdir -p ~/pathways-scripts && cd ~/pathways-scripts
    for f in setup_env.sh start_pathways.sh run_worker_slice.sh run_maxtext.sh; do
      curl -fsSLO "https://raw.githubusercontent.com/GoogleCloudPlatform/slurm-gcp/tpu-2605/pathways/scripts/${f}"
    done
    

    Este comando descarga las siguientes secuencias de comandos:

    • setup_env.sh: Realiza una configuración única del entorno de Pathways.
    • start_pathways.sh: Inicia el servicio de Pathways.
    • run_worker_slice.sh: Inicia el trabajador de Pathways para una porción de TPU (enviado por start_pathways.sh).
    • run_maxtext.sh: Ejecuta una carga de trabajo de entrenamiento de MaxText de ejemplo.
  4. Ejecuta la secuencia de comandos de configuración. Esto tarda alrededor de 5 minutos:

    chmod +x *.sh
    ./setup_env.sh
    

    La secuencia de comandos extrae las imágenes del servidor y del proxy de Pathways, compila un entorno de Python con JAX, pathwaysutils y MaxText, copia las secuencias de comandos en /home/pathways y vincula ~/pathways a /home/pathways. Termina con un resultado similar al siguiente:

    Environment ready: JAX 0.11.1
    
  5. Opcional: Para otorgar acceso al entorno de Pathways a otros usuarios del clúster, pídeles que vinculen /home/pathways a su directorio principal:

    ln -sfn /home/pathways ~/pathways
    

En este punto, el clúster está listo para Pathways. Inicias el servicio de Pathways como parte de la ejecución de una carga de trabajo, ya que las cargas de trabajo por lotes y las interactivas lo inician con diferentes parámetros de configuración. Para obtener más información, consulta Ejecuta una carga de trabajo por lotes con Pathways y Ejecuta una carga de trabajo interactiva con Pathways.

Si tienes problemas, consulta Soluciona problemas de Pathways en Cloud.

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 clúster de Cluster Director cuando termines:

curl -s -X DELETE \
    -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    "https://hypercomputecluster.googleapis.com/v1alpha/projects/${PROJECT}/locations/${REGION}/clusters/${CLUSTER_ID}"

¿Qué sigue?