Crear un clúster de Ray en Vertex AI

En este documento se proporcionan instrucciones para configurar un clúster de Ray en Vertex AI para satisfacer diversas necesidades. Por ejemplo, para crear tu imagen, consulta Imagen personalizada. Algunas empresas pueden usar redes privadas. En este documento se describe la interfaz de Private Service Connect para Ray en Vertex AI. Otro caso práctico consiste en acceder a archivos remotos como si fueran locales (consulta Ray en el sistema de archivos de red de Vertex AI).

Información general

Entre los temas que se tratan se incluyen los siguientes:

Crear un clúster de Ray

Puedes usar la Google Cloud consola o el SDK de Vertex AI para Python para crear un clúster de Ray. Un clúster puede tener hasta 2000 nodos. Hay un límite superior de 1000 nodos en un grupo de trabajadores. No hay límite en el número de grupos de trabajadores, pero un número elevado de grupos de trabajadores (por ejemplo, 1000 grupos de trabajadores con un nodo cada uno) puede afectar negativamente al rendimiento del clúster.

Antes de empezar, lee el resumen de Ray en Vertex AI y configura todas las herramientas necesarias.

Un clúster de Ray en Vertex AI puede tardar entre 10 y 20 minutos en iniciarse después de crearlo.

Consola

De acuerdo con la recomendación de práctica recomendada de OSS Ray, se aplica la configuración del número de CPUs lógicas en 0 en el nodo principal de Ray para evitar que se ejecute ninguna carga de trabajo en el nodo principal.

  1. En la Google Cloud consola, ve a la página Ray en Vertex AI.

    Ir a la página Ray en Vertex AI

  2. Haz clic en Crear clúster para abrir el panel Crear clúster.

  3. En cada paso del panel Crear clúster, revise o sustituya la información predeterminada del clúster. Haga clic en Continuar para completar cada paso:

    1. En Nombre y región, especifica un Nombre y elige una Ubicación para el clúster.

    2. En Ajustes de computación, especifica la configuración del clúster de Ray en el nodo principal de Vertex AI, incluidos el tipo de máquina, el tipo y el número de aceleradores, el tipo y el tamaño del disco, y el número de réplicas. Opcionalmente, añade un URI de imagen personalizado para especificar una imagen de contenedor personalizada y añadir dependencias de Python que no proporcione la imagen de contenedor predeterminada. Consulta Imagen personalizada.

      En Opciones avanzadas, puedes hacer lo siguiente:

      • Especifica tu propia clave de cifrado.
      • Especifica una cuenta de servicio personalizada.
      • Inhabilita la recogida de métricas si no necesitas monitorizar las estadísticas de recursos de tu carga de trabajo durante el entrenamiento.
    3. (Opcional) Para desplegar un endpoint privado en tu clúster, te recomendamos que uses Private Service Connect. Para obtener más información, consulta Interfaz de Private Service Connect para Ray en Vertex AI.

  4. Haz clic en Crear.

SDK de Ray en Vertex AI

De acuerdo con la recomendación de práctica recomendada de OSS Ray, se aplica la configuración del número de CPUs lógicas en 0 en el nodo principal de Ray para evitar que se ejecute ninguna carga de trabajo en el nodo principal.

En un entorno de Python interactivo, usa lo siguiente para crear el clúster de Ray en Vertex AI:

import ray
import vertex_ray
from google.cloud import aiplatform
from vertex_ray import Resources
from vertex_ray.util.resources import NfsMount

# Define a default CPU cluster, machine_type is n1-standard-16, 1 head node and 1 worker node
head_node_type = Resources()
worker_node_types = [Resources()]

# Or define a GPU cluster.
head_node_type = Resources(
  machine_type="n1-standard-16",
  node_count=1,
  custom_image="us-docker.pkg.dev/my-project/ray-custom.2-9.py310:latest",  # Optional. When not specified, a prebuilt image is used.
)

worker_node_types = [Resources(
  machine_type="n1-standard-16",
  node_count=2,  # Must be >= 1
  accelerator_type="NVIDIA_TESLA_T4",
  accelerator_count=1,
  custom_image="us-docker.pkg.dev/my-project/ray-custom.2-9.py310:latest",  # When not specified, a prebuilt image is used.
)]
# Optional. Create cluster with Network File System (NFS) setup.
nfs_mount = NfsMount(
    server="10.10.10.10",
    path="nfs_path",
    mount_point="nfs_mount_point",
)
aiplatform.init()
# Initialize Vertex AI to retrieve projects for downstream operations.
# Create the Ray cluster on Vertex AI
CLUSTER_RESOURCE_NAME = vertex_ray.create_ray_cluster(
  head_node_type=head_node_type,
  network=NETWORK, #Optional
  worker_node_types=worker_node_types,
  python_version="3.10",  # Optional
  ray_version="2.47",  # Optional
  cluster_name=CLUSTER_NAME, # Optional
  service_account=SERVICE_ACCOUNT,  # Optional
  enable_metrics_collection=True,  # Optional. Enable metrics collection for monitoring.
  labels=LABELS,  # Optional.
  nfs_mounts=[nfs_mount],  # Optional.

)

Donde:

  • CLUSTER_NAME: nombre del clúster de Ray en Vertex AI que debe ser único en todo el proyecto.

  • NETWORK: (opcional) El nombre completo de tu red de VPC, con el formato projects/PROJECT_ID/global/networks/VPC_NAME. Para definir un endpoint privado en lugar de uno público para tu clúster, especifica una red de VPC que quieras usar con Ray en Vertex AI. Para obtener más información, consulta Conectividad privada y pública.

  • VPC_NAME: opcional. La VPC en la que funciona la VM.

  • PROJECT_ID: tu ID de proyecto de Google Cloud . Puedes encontrar el ID de proyecto en la página de bienvenida de la consola Google Cloud .

  • SERVICE_ACCOUNT: opcional. Es la cuenta de servicio para ejecutar aplicaciones Ray en el clúster. Asigna los roles necesarios.

  • LABELS: (opcional) Las etiquetas con metadatos definidos por el usuario que se usan para organizar los clústeres de Ray. Las claves y los valores de las etiquetas no pueden tener más de 64 caracteres (puntos de código Unicode) y solo pueden contener letras minúsculas, caracteres numéricos, guiones bajos y guiones. Se permite utilizar caracteres internacionales. Consulta https://goo.gl/xmQnxf para obtener más información y ejemplos de etiquetas.

Deberías ver el siguiente resultado hasta que el estado cambie a RUNNING:

[Ray on Vertex AI]: Cluster State = State.PROVISIONING
Waiting for cluster provisioning; attempt 1; sleeping for 0:02:30 seconds
...
[Ray on Vertex AI]: Cluster State = State.RUNNING

Ten en cuenta lo siguiente:

  • El primer nodo es el nodo principal.

  • No se admiten los tipos de máquinas TPU.

Gestión del ciclo de vida

Durante el ciclo de vida de un clúster de Ray en Vertex AI, cada acción se asocia a un estado. En la siguiente tabla se resumen el estado de facturación y la opción de gestión de cada estado. En la documentación de referencia se incluye la definición de cada uno de estos estados.

Acción Estado ¿Se te ha facturado? ¿Eliminar acción disponible? ¿Se puede cancelar la acción?
El usuario crea un clúster APROVISIONAR No No No
El usuario aumenta o reduce la escala manualmente ACTUALIZANDO Sí, según el tamaño en tiempo real No
El clúster se ejecuta EN EJECUCIÓN No aplicable: puedes eliminarlo
El clúster se escala o se reduce automáticamente ACTUALIZANDO Sí, según el tamaño en tiempo real No
El usuario elimina el clúster DETENIENDO No No No aplicable: ya se está deteniendo
El clúster pasa al estado Error ERROR No No aplicable: puedes eliminarlo
No aplicable STATE_UNSPECIFIED No No aplicable

Imagen personalizada (opcional)

Las imágenes prediseñadas se adaptan a la mayoría de los casos prácticos. Si quieres crear tu imagen, usa las imágenes precompiladas de Ray en Vertex AI como imagen base. Consulta la documentación de Docker para saber cómo crear tus imágenes a partir de una imagen base.

Estas imágenes base incluyen una instalación de Python, Ubuntu y Ray. También incluyen dependencias como las siguientes:

  • python-json-logger
  • google-cloud-resource-manager
  • ca-certificates-java
  • libatlas-base-dev
  • liblapack-dev
  • g++, libio-all-perl
  • libyaml-0-2

Conectividad privada y pública

De forma predeterminada, Ray en Vertex AI crea un endpoint público y seguro para el desarrollo interactivo con el cliente de Ray en clústeres de Ray en Vertex AI. Usa la conectividad pública para el desarrollo o los casos prácticos efímeros. Se puede acceder a este endpoint público a través de Internet. Solo pueden acceder al clúster los usuarios autorizados que tengan, como mínimo, permisos de rol de usuario de Vertex AI en el proyecto de usuario del clúster de Ray.

Si necesitas una conexión privada a tu clúster o usas Controles de Servicio de VPC, el emparejamiento de VPC es compatible con los clústeres de Ray en Vertex AI. Solo se puede acceder a los clústeres con un endpoint privado desde un cliente de una red de VPC emparejada con Vertex AI.

Para configurar la conectividad privada con el emparejamiento de VPC para Ray en Vertex AI, selecciona una red de VPC al crear el clúster. La red de VPC requiere una conexión de servicios privada entre tu red de VPC y Vertex AI. Si usas Ray en Vertex AI en la consola, puedes configurar tu conexión de acceso a servicios privados al crear el clúster.

Si quieres usar Controles de Servicio de VPC y el emparejamiento de VPC con clústeres de Ray en Vertex AI, debes realizar una configuración adicional para usar el panel de control y la shell interactiva de Ray. Sigue las instrucciones que se indican en Panel de control de Ray y shell interactivo con VPC-SC y emparejamiento de VPC para configurar el shell interactivo con VPC-SC y el emparejamiento de VPC en tu proyecto de usuario.

Una vez que hayas creado tu clúster de Ray en Vertex AI, podrás conectarte al nodo principal mediante el SDK de Vertex AI para Python. El entorno de conexión, como una VM de Compute Engine o una instancia de Vertex AI Workbench, debe estar en la red de VPC emparejada con Vertex AI. Ten en cuenta que una conexión de servicios privados tiene un número limitado de direcciones IP, lo que podría provocar un agotamiento de las direcciones IP. Por lo tanto, te recomendamos que uses conexiones privadas para los clústeres de larga duración.

Interfaz de Private Service Connect para Ray en Vertex AI

La salida de interfaces de Private Service Connect y la entrada de interfaces de Private Service Connect se admiten en clústeres de Ray en Vertex AI.

Para usar la salida de la interfaz de Private Service Connect, sigue las instrucciones que se indican a continuación. Si Controles de Servicio de VPC no está habilitado, los clústeres con salida de interfaz de Private Service Connect usarán el endpoint público seguro para la entrada con Ray Client.

Si Controles de Servicio de VPC está habilitado, la entrada de la interfaz Private Service Connect se usa de forma predeterminada con la salida de la interfaz Private Service Connect. Para conectarte con Ray Client o enviar trabajos desde un cuaderno a un clúster con acceso de entrada de interfaz de Private Service Connect, asegúrate de que el cuaderno esté en la VPC y la subred del proyecto de usuario. Para obtener más información sobre cómo configurar Controles de Servicio de VPC, consulta Controles de Servicio de VPC con Vertex AI.

Diagrama de habilitación de la interfaz de Private Service Connect

Habilitar la interfaz de Private Service Connect

Sigue la guía Configurar los recursos para configurar tu interfaz de Private Service Connect. Una vez que hayas configurado tus recursos, podrás habilitar la interfaz de Private Service Connect en tu clúster de Ray en Vertex AI.

Consola

  1. Al crear el clúster y después de especificar el nombre y la región, así como la configuración de computación, aparece la opción Redes.

    Consola especificar red

  2. Para configurar una conexión de red, siga uno de estos pasos:

    • Usa el nombre NETWORK_ATTACHMENT_NAME que especificaste al configurar tus recursos para Private Service Connect.
    • Para crear un nuevo adjunto de red, haz clic en el botón Crear adjunto de red que aparece en el menú desplegable.

    Console create new network

  3. Haz clic en Crear conexión de red.

  4. En la subtarea que aparece, especifica un nombre, una red y una subred para el nuevo adjunto de red.

    Conexión de red

  5. Haz clic en Crear.

SDK de Ray en Vertex AI

El SDK de Ray en Vertex AI forma parte del SDK de Vertex AI para Python. Para saber cómo instalar o actualizar el SDK de Vertex AI para Python, consulta Instalar el SDK de Vertex AI para Python. Para obtener más información, consulta la documentación de referencia de la API del SDK de Vertex AI para Python.

from google.cloud import aiplatform
import vertex_ray

# Initialization
aiplatform.init()

# Create a default cluster with network attachment configuration

psc_config = vertex_ray.PscIConfig(network_attachment=NETWORK_ATTACHMENT_NAME)
cluster_resource_name = vertex_ray.create_ray_cluster(
   psc_interface_config=psc_config,
)

Donde:

  • NETWORK_ATTACHMENT_NAME: el nombre que has especificado al configurar los recursos de Private Service Connect en tu proyecto de usuario.

Sistema de archivos de red (NFS) de Ray en Vertex AI

Para que los archivos remotos estén disponibles en tu clúster, activa los sistemas de archivos compartidos en red (NFS). De esta forma, tus trabajos pueden acceder a archivos remotos como si fueran locales, lo que permite obtener un alto rendimiento y una latencia baja.

Configuración de VPC

Hay dos opciones para configurar una VPC:

  1. Crea una vinculación de red de interfaz de Private Service Connect. (Recomendado)
  2. Configura el emparejamiento entre redes de VPC.

Configurar la instancia de NFS

Para obtener más información sobre cómo crear una instancia de Filestore, consulta Crear una instancia. Si usas el método de interfaz de Private Service Connect, no tienes que seleccionar el modo de acceso a servicios privados al crear el almacén de archivos.

Usar el sistema de archivos de red (NFS)

Para usar el sistema de archivos de red, especifique una red o un archivo adjunto de red (opción recomendada).

Consola

  1. En el paso Redes de la página de creación, después de especificar una red o un archivo adjunto de red. Para ello, haz clic en Añadir montaje NFS en la sección Sistema de archivos de red (NFS) y especifica un montaje NFS (servidor, ruta y punto de montaje).

    Campo Descripción
    server La dirección IP de tu servidor NFS. Debe ser una dirección privada de tu VPC.
    path La ruta del recurso compartido NFS. Debe ser una ruta absoluta que empiece por /.
    mountPoint Punto de montaje local. Debe ser un nombre de directorio UNIX válido. Por ejemplo, si el punto de montaje local es sourceData, especifica la ruta /mnt/nfs/ sourceData desde tu instancia de VM de entrenamiento.

    Para obtener más información, consulta Dónde especificar los recursos de computación.

  2. Especifica un servidor, una ruta y un punto de montaje. Sistema de archivos NFS

  3. Haz clic en Crear. De esta forma, se crea el clúster de Ray.

Panel de control de Ray y shell interactivo con VPC-SC y emparejamiento entre VPCs

  1. Configura peered-dns-domains.

    {
      VPC_NAME=NETWORK_NAME
      REGION=LOCATION
      gcloud services peered-dns-domains create training-cloud \
      --network=$VPC_NAME \
      --dns-suffix=$REGION.aiplatform-training.cloud.google.com.
    
      # Verify
      gcloud beta services peered-dns-domains list --network $VPC_NAME;
    }
        
    • NETWORK_NAME: cambia a la red emparejada.

    • LOCATION: ubicación deseada (por ejemplo, us-central1).

  2. Configura DNS managed zone.

    {
      PROJECT_ID=PROJECT_ID
      ZONE_NAME=$PROJECT_ID-aiplatform-training-cloud-google-com
      DNS_NAME=aiplatform-training.cloud.google.com
      DESCRIPTION=aiplatform-training.cloud.google.com
    
      gcloud dns managed-zones create $ZONE_NAME  \
      --visibility=private  \
      --networks=https://www.googleapis.com/compute/v1/projects/$PROJECT_ID/global/networks/$VPC_NAME  \
      --dns-name=$DNS_NAME  \
      --description="Training $DESCRIPTION"
    }
        
    • PROJECT_ID: tu ID de proyecto. Puedes encontrar estos IDs en la página de bienvenida de la Google Cloud consola.

  3. Registra la transacción DNS.

    {
      gcloud dns record-sets transaction start --zone=$ZONE_NAME
    
      gcloud dns record-sets transaction add \
      --name=$DNS_NAME. \
      --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
      --zone=$ZONE_NAME \
      --ttl=300
    
      gcloud dns record-sets transaction add \
      --name=*.$DNS_NAME. \
      --type=CNAME $DNS_NAME. \
      --zone=$ZONE_NAME \
      --ttl=300
    
      gcloud dns record-sets transaction execute --zone=$ZONE_NAME
    }
        
  4. Envía un trabajo de entrenamiento con el shell interactivo, VPC-SC y el emparejamiento de VPC habilitados.

Siguientes pasos