Desarrollar una aplicación en el clúster de Ray en Vertex AI

Conéctate a un clúster de Ray en Vertex AI y desarrolla una aplicación con los siguientes métodos:

  • Conéctate al clúster de Ray en Vertex AI a través de Ray Client con la versión del SDK de Vertex AI para Python que incluye la funcionalidad de Ray Client. Usa esta opción si prefieres un entorno de desarrollo de Python interactivo.

    • Usa el SDK de Vertex AI para Python en el cuaderno de Colab Enterprise de la Google Cloud consola.

    • Usa el SDK de Vertex AI para Python en una sesión de Python, un shell o un cuaderno de Jupyter.

  • Escribe una secuencia de comandos de Python y envíala al clúster de Ray en Vertex AI con la API Ray Jobs. Si prefiere enviar trabajos mediante programación, use esta opción.

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

Conectarse a un clúster de Ray a través de Ray Client

Para usar el cliente interactivo de Ray, conéctate a tu clúster de Ray en Vertex AI. La red del entorno de conexión depende de la configuración de red del clúster. No se aplican restricciones al entorno de conexión siempre que el clúster tenga acceso a Internet público. Es decir, no has especificado una red de VPC durante la creación del clúster. Sin embargo, si el clúster está en una red de VPC privada que se empareja con Vertex AI, el entorno de conexión debe estar en la misma red de VPC que el clúster.

La versión de Ray del lado del cliente debe coincidir con la versión de Ray del clúster. pip install "google-cloud-aiplatform[ray]" instala la versión 2.47 de Ray en el lado del cliente de forma predeterminada. Si la versión de Ray del clúster es anterior a la 2.42, por ejemplo, usa pip install ray==2.42.0 para que la versión de Ray del lado del cliente coincida con la del clúster.

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. En la fila del clúster que has creado, haz clic en Abrir en Colab Enterprise.

  3. Se abrirá el cuaderno de Colab Enterprise. Sigue las instrucciones para usar el SDK de Vertex AI para Python y conectarte al clúster de Ray en Vertex AI.

    • Si aparece un cuadro de diálogo que te pide que habilites las APIs, haz clic en Habilitar.

    • Si es la primera vez que te conectas al clúster, haz clic en Conectar. Si quieres volver a conectarte al clúster, selecciona Volver a conectar. El cuaderno tarda unos minutos en conectarse al entorno de ejecución.

    • Haz clic en + CREAR para crear un cuaderno.

    • Haz clic en Panel Ray en Vertex AI para abrir el panel Ray en Vertex AI.
      Se muestran los clústeres disponibles.

    • Selecciona un clúster y haz clic en CONECTAR.
      El código aparece en el cuaderno abierto que se conecta al clúster que has elegido.

    • Otras acciones (opcional): para abrir la página de la lista de clústeres de Ray en Vertex AI, haz clic en Gestionar clústeres en el panel Ray en Vertex AI.

      • Selecciona un clúster y haz clic en el menú más acciones.
        Aparecen más opciones:
        más opciones
    • Ejecuta la celda de código Primeros pasos para importar el SDK de Vertex AI para Python y conectarte al clúster de Ray en Vertex AI.

Python

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.

Desde un entorno interactivo de Python:

import ray

# Necessary even if aiplatform.* symbol is not directly used in your program.
from google.cloud import aiplatform
import vertex_ray

import vertexai
vertexai.init()
# The CLUSTER_RESOURCE_NAME is the one returned from vertex_ray.create_ray_cluster.
CLUSTER_RESOURCE_NAME='projects/{}/locations/{}/persistentResources/{}'.format(PROJECT_ID, LOCATION, CLUSTER_NAME)

ray.init('vertex_ray://{}'.format(CLUSTER_RESOURCE_NAME))

Donde:

  • LOCATION: la ubicación que especifiques para tu clúster de Ray en Vertex AI.

  • PROJECT_ID: tu ID de proyecto Google Cloud . Busca el ID de proyecto en la página Bienvenido de la consola Google Cloud .

  • CLUSTER_NAME: el nombre del clúster de Ray en Vertex AI, que se especifica al crear el clúster. Ve a la Google Cloud consola para ver la lista de nombres de clústeres de un proyecto.

Obtendrá un resultado similar al siguiente:

Python version:  3.10.12
Ray version: 2.47
Vertex SDK version: 1.46.0
Dashboard: xxxx-dot-us-central1.aiplatform-training.googleusercontent.com

Usa la URL Dashboard para acceder al panel de control de Ray desde un navegador. El URI tiene el formato https://xxxx-dot-us-central1.aiplatform-training.googleusercontent.com/. En el panel de control se muestran las tareas enviadas, el número de GPUs o CPUs y el espacio en disco de cada máquina del clúster.

Después de conectarte al clúster de Ray en Vertex AI, desarrolla un programa de Ray de la misma forma que lo harías para un backend de Ray de software libre normal.

@ray.remote
def square(x):
  print(x)
  return x * x

# Launch four parallel square tasks.
futures = [square.remote(i) for i in range(4)]

print(ray.get(futures))
# Returns [0, 1, 4, 9]

Desarrollar una aplicación con la API Ray Jobs

En esta sección se describe cómo enviar un programa de Python al clúster de Ray en Vertex AI mediante la API Ray Jobs.

Escribir una secuencia de comandos de Python

Desarrolla tu aplicación como una secuencia de comandos de Python en cualquier editor de texto. Por ejemplo, coloque la siguiente secuencia de comandos en un archivo my_script.py:

import ray
import time

@ray.remote
def hello_world():
    return "hello world"

@ray.remote
def square(x):
    print(x)
    time.sleep(100)
    return x * x

ray.init()  # No need to specify address="vertex_ray://...."
print(ray.get(hello_world.remote()))
print(ray.get([square.remote(i) for i in range(4)]))

Enviar un trabajo de Ray mediante la API Ray Jobs

Envía una tarea de Ray con Python, la CLI de tareas de Ray o la dirección del panel de control de Ray público.

Python: nombre del recurso de clúster

Envía una tarea de Ray con un entorno de Python:

import ray
import vertex_ray
from ray.job_submission import JobSubmissionClient
from google.cloud import aiplatform  # Necessary even if aiplatform.* symbol is not directly used in your program.

CLUSTER_RESOURCE_NAME='projects/{}/locations/REGION/persistentResources/{}'.format(PROJECT_ID, CLUSTER_NAME)

client = JobSubmissionClient("vertex_ray://{}".format(CLUSTER_RESOURCE_NAME))

job_id = client.submit_job(
  # Entrypoint shell command to execute
  entrypoint="python my_script.py",
  # Path to the local directory that contains the my_script.py file.
  runtime_env={
    "working_dir": "./directory-containing-my-script",
    "pip": ["numpy",
            "setuptools<70.0.0",
            "xgboost",
            "ray==CLUSTER_RAY_VERSION", # pin the Ray version to the same version as the cluster
           ]
  }
)

# Ensure that the Ray job has been created.
print(job_id)

Donde:

  • REGION: la región que especifiques para tu clúster de Ray en Vertex AI.

  • PROJECT_ID: tu número de proyecto. Google Cloud Busca el ID de proyecto en la página Bienvenido de la consola Google Cloud .

  • CLUSTER_NAME: nombre del clúster de Ray en Vertex AI, especificado al crear el clúster. Ve a la Google Cloud consola para ver la lista de nombres de clústeres de un proyecto.

  • CLUSTER_RAY_VERSION: fija la versión de Ray a la misma versión que el clúster. Por ejemplo, 2.47.1.

Python: panel de control de Ray

Se puede acceder a la dirección del panel de control de Ray desde fuera de la VPC, incluida la Internet pública. Ten en cuenta que se necesita vertex_ray para obtener la autenticación automáticamente.

from ray.job_submission import JobSubmissionClient
import vertex_ray

DASHBOARD_ADDRESS=DASHBOARD_ADDRESS

client = JobSubmissionClient(
  "vertex_ray://{}".format(DASHBOARD_ADDRESS),
)

job_id = client.submit_job(
  # Entrypoint shell command to execute
  entrypoint="python my_script.py",
  # Path to the local directory that contains the my_script.py file
  runtime_env={
    "working_dir": "./directory-containing-my-script",
    "pip": ["numpy",
            "setuptools<70.0.0",
            "xgboost",
            "ray==CLUSTER_RAY_VERSION", # pin the Ray version to the same version as the cluster
           ]
  }
)
print(job_id)

Donde:

DASHBOARD_ADDRESS: la dirección del panel de control de Ray de tu clúster. Consulta la dirección del panel de control con el SDK de Vertex AI para Python.

CLI de Ray Jobs

Usa los comandos de la CLI de Ray Jobs solo en la red VPC emparejada.

$ ray job submit --working-dir ./ --address vertex_ray://{CLUSTER_RESOURCE_NAME} -- python my_script.py

Después de enviar un trabajo de Ray de larga duración, si quieres monitorizar su estado con client.get_job_status(job_id), vuelve a crear una instancia de JobSubmissionClient(client = JobSubmissionClient("vertex_ray://{}".format(CLUSTER_RESOURCE_NAME)) ) para actualizar el token de autenticación.

Compatibilidad con el emparejamiento de VPC y las cuentas de servicio personalizadas

Ray en Vertex AI admite Ray Client y la API Ray Jobs (JobSubmissionClient) en una red pública para el agente de servicio predeterminado y las cuentas de servicio personalizadas.

En la siguiente tabla se muestra la compatibilidad de Ray en Vertex AI con el emparejamiento de VPCs al crear el clúster de Ray con la red de VPC:

Emparejamiento de VPC Agente de servicio predeterminado Cuenta de servicio personalizada
Cliente de Ray (modo interactivo) No
Ray JobSubmissionClient

Controles de Servicio de VPC requiere configuraciones adicionales. Consulta Conectividad privada y pública para obtener más información.

Usar el sistema de archivos de red (NFS) en el código de Ray

Si configuras un montaje NFS al crear el clúster de Ray, lee y escribe esos volúmenes NFS en el código de tu aplicación.

RayClient

En esta sección se muestra cómo usar el sistema de archivos de red (NFS) en el código de Ray.

  1. Inicializar RayClient en un entorno de Python

    import ray
    from google.cloud import aiplatform
    import vertex_ray
    aiplatform.init(project=PROJECT_ID, location=REGION)
    ray.init(address='vertex_ray://projects/{}/locations/us-central1/persistentResources/{}'.format(PROJECT_NUMBER, PERSISTENT_RESOURCE_ID))
  2. Ejecutar secuencia de comandos de tarea

    import ray
    import logging
    import os
    import sys
    
    @ray.remote
    def main():
    logging.info("list all files in mounted folder")
    return os.listdir("/mnt/nfs/test")
    
    print(''.join(ray.get(main.remote())))

Envía una tarea de Ray con Python, la CLI de tareas de Ray o la dirección del panel de control público de Ray. Para obtener más información, consulta Desarrollar una aplicación en el clúster de Ray en Vertex AI.

Siguientes pasos