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

Puedes conectarte a un clúster de Ray en Vertex AI y desarrollar una aplicación con los siguientes métodos:

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

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

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

  • Escribe una secuencia de comandos de Python y envía la secuencia de comandos al clúster de Ray en Vertex AI mediante la API de Ray Jobs. Si prefieres enviar trabajos de manera programática, usa esta opción.

Antes de comenzar, asegúrate de leer la descripción general de Ray en Vertex AI y configurar todas las herramientas de requisitos que necesitas.

Conéctate 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 hay restricciones en el entorno de conexión, siempre y cuando el clúster tenga acceso a Internet pública. Es decir, no especificaste 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 intercambia tráfico 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 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, por ejemplo, 2.42, usa pip install ray==2.42.0 para que coincida la versión de Ray del cliente con la versión de Ray del clúster.

Console

De acuerdo con la recomendación de prácticas recomendadas de Ray de OSS, se aplica la configuración del recuento lógico de CPU en 0 en el nodo principal de Ray para evitar ejecutar cualquier 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 de Ray en Vertex AI

  2. En la fila del clúster que creaste, haz clic en Abrir en Colab Enterprise.

  3. Se abrirá el notebook de Colab Enterprise. Sigue las instrucciones sobre cómo usar el SDK de Vertex AI para Python a fin de conectarte al clúster de Ray en Vertex AI.

    • Si una pantalla de cuadro de diálogo te solicita que habilites las APIs, haz clic en Habilitar.

    • Si te conectas al clúster por primera vez, haz clic en Conectar. Si te vuelves a conectar al clúster, haz clic en Volver a conectarse. El notebook toma unos minutos en conectarse al entorno de ejecución.

    • Haz clic en +CREATE para crear un notebook nuevo.

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

    • Selecciona un clúster y haz clic en CONNECT.
      El código aparecerá en el notebook abierto que se conecta al clúster elegido.

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

      • Selecciona un clúster y haz clic en el menú Más acciones.
        Aparecerán más opciones:
        más opciones
    • Ejecuta la celda de código Comienza ahora a fin de 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ácticas recomendadas de Ray de OSS, se aplica la configuración del recuento lógico de CPU en 0 en el nodo principal de Ray para evitar ejecutar cualquier 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))

Aquí:

  • LOCATION: Es la ubicación que especificas para el clúster de Ray en Vertex AI.

  • PROJECT_ID: Es el ID del Google Cloud proyecto. Encuentra el ID del proyecto en la Google Cloud consola página de bienvenida.

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

Obtendrás un resultado similar al que se muestra a continuación:

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 de Dashboard para acceder al panel de Ray desde un navegador. El URI tiene el formato https://xxxx-dot-us-central1.aiplatform-training.googleusercontent.com/. En el panel, se muestran los trabajos enviados, la cantidad de GPU o CPU, y el espacio en disco de cada máquina en el clúster.

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

@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]

Desarrolla una aplicación con la API de 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 de Ray Jobs.

Escribe una secuencia de comandos de Python

Desarrolla tu aplicación como una secuencia de comandos de Python en cualquier editor de texto. Por ejemplo, coloca 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)]))

Envía un trabajo de Ray con la API de Ray Jobs

Envía un trabajo de Ray con Python, la CLI de Ray Jobs o la dirección pública del panel de Ray Ray.

Python: nombre del recurso del clúster

Envía un trabajo 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)

Aquí:

  • REGION: Es la región que especificas para el clúster de Ray en Vertex AI.

  • PROJECT_ID: Es el número del proyecto de Google Cloud . Encuentra el ID del proyecto en la Google Cloud consola página de bienvenida.

  • CLUSTER_NAME: Es el nombre de tu clúster de Ray en Vertex AI, especificado cuando creaste 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 Ray

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

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)

Aquí:

DASHBOARD_ADDRESS: Es la dirección del panel de Ray para tu clúster. Encuentra la dirección del panel mediante el SDK de Vertex AI para Python.

CLI de Ray Jobs

Usa los comandos de la CLI de Ray Jobs solo dentro de la red de VPC con intercambio de tráfico.

$ 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 deseas supervisar el estado del trabajo 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 intercambio de tráfico de VPC y la cuenta de servicio personalizada

Ray en Vertex AI admite la API de Ray Client y 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 intercambio de tráfico de VPC cuando creas el clúster de Ray con la red de VPC:

Intercambio de tráfico entre VPC Agente de servicio predeterminado Cuenta de servicio personalizada
Cliente de Ray (modo interactivo) No
Ray JobSubmissionClient

Los Controles del servicio de VPC (VPC-SC) requieren configuraciones adicionales. Consulta Conectividad privada y pública para obtener más información.

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

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

RayClient

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

  1. Inicializa 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. Ejecuta la secuencia de comandos del trabajo

    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 un trabajo de Ray con Python, la CLI de Ray Jobs o la dirección pública del panel de Ray. Para obtener más información, consulta Desarrolla una aplicación en el clúster de Ray en Vertex AI).

¿Qué sigue?