Sviluppare un'applicazione sul cluster Ray su Vertex AI

Puoi connetterti a un cluster Ray su Vertex AI e sviluppare un'applicazione utilizzando i seguenti metodi:

  • Connettiti al cluster Ray su Vertex AI tramite Ray Client utilizzando la versione dell'SDK Vertex AI per Python che include la funzionalità di Ray Client. Utilizza questa opzione se preferisci un ambiente di sviluppo Python interattivo.

    • Utilizza l'SDK Vertex AI per Python all'interno del notebook Colab Enterprise nella console Google Cloud.

    • Utilizza l'SDK Vertex AI per Python in una sessione Python, in una shell o in un Jupyter notebook.

  • Scrivi uno script Python e invialo al cluster Ray su Vertex AI utilizzando l'API Ray Jobs. Utilizza questa opzione se preferisci inviare i job tramite programmazione.

Prima di iniziare, assicurati di leggere la panoramica di Ray su Vertex AI e di configurare tutti gli strumenti di prerequisito di cui hai bisogno.

Connettiti a un cluster Ray tramite Ray Client

Per utilizzare il client Ray interattivo, connettiti al tuo cluster Ray su Vertex AI. La rete dell'ambiente di connessione dipende dalla configurazione della rete del cluster. Non ci sono limitazioni per l'ambiente di connessione se il cluster ha accesso alla rete internet pubblica. In altre parole, non è stata specificata una rete VPC durante la creazione del cluster. Tuttavia, se il cluster si trova su una rete VPC privata in peering con Vertex AI, l'ambiente di connessione deve trovarsi sulla stessa rete VPC del cluster.

La versione di Ray lato client deve corrispondere alla versione di Ray del cluster. pip install "google-cloud-aiplatform[ray]" per impostazione predefinita installa Ray versione 2.33 lato client. Se la versione di Ray del cluster è 2.9, devi utilizzare pip install ray==2.9.3 per associare la versione di Ray lato client alla versione di Ray del cluster.

Console

In conformità con il consiglio della best practice OSS Ray, viene impostato il conteggio delle CPU logiche su 0 sul nodo principale di Ray per evitare di eseguire qualsiasi carico di lavoro sul nodo principale.

  1. Nella console Google Cloud, vai alla pagina Ray su Vertex AI.

    Vai alla pagina di Ray on Vertex AI

  2. Nella riga corrispondente al cluster che hai creato, fai clic su Apri in Colab Enterprise.

  3. Si apre il notebook di Colab Enterprise. Segui le istruzioni su come utilizzare l'SDK Vertex AI per Python per connetterti al cluster Ray su Vertex AI.

    • Se una finestra di dialogo ti chiede di abilitare le API, fai clic su Abilita.

    • Fai clic su Connetti se ti connetti al cluster per la prima volta o su Ricollega se ti connetti di nuovo al cluster. Il notebook impiega alcuni minuti per connettersi al runtime.

    • Fai clic su +CREA per creare un nuovo blocco note.

    • Fai clic su Riquadro Ray on Vertex AI per aprire il riquadro Ray su Vertex AI.
      viene visualizzata la visualizzazione dei cluster esistenti.

    • Seleziona un cluster e fai clic su CONNETTI.
      Nel notebook aperto viene visualizzato il codice che si connette al cluster scelto.

    • Altre azioni (facoltative): per aprire la pagina dell'elenco dei cluster Ray on Vertex AI, fai clic su Gestisci cluster nel riquadro Ray on Vertex AI.

      • Seleziona un cluster e fai clic sul menu Altre azioni.
        Vengono visualizzate altre opzioni:
        vengono visualizzate altre opzioni
    • Esegui la cella di codice Introduzione per importare l'SDK Vertex AI per Python e connettiti al cluster Ray su Vertex AI.

Python

In conformità con il consiglio della best practice OSS Ray, viene impostato il conteggio delle CPU logiche su 0 sul nodo principale di Ray per evitare di eseguire qualsiasi carico di lavoro sul nodo principale.

Da un ambiente Python interattivo:

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))

Dove:

  • LOCATION: la posizione specificata per il cluster Ray su Vertex AI.

  • PROJECT_ID: l'ID del tuo progetto Google Cloud. Puoi trovare l'ID progetto nella pagina di benvenuto della console Google Cloud.

  • CLUSTER_NAME: il nome del cluster Ray su Vertex AI, specificato al momento della creazione del cluster. Vai alla console Google Cloud per visualizzare l'elenco dei nomi dei cluster per un progetto.

Dovresti visualizzare un output simile al seguente:

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

Puoi utilizzare l'URL Dashboard per accedere alla dashboard di Ray da un browser. L'URI è nel formato https://xxxx-dot-us-central1.aiplatform-training.googleusercontent.com/. La dashboard mostra i job inviati, il numero di GPU o CPU e lo spazio su disco di ogni macchina del cluster.

Una volta connesso al cluster Ray su Vertex AI, puoi sviluppare un programma Ray nello stesso modo in cui lo faresti per un normale backend Ray OSS.

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

Sviluppare un'applicazione utilizzando l'API Ray Jobs

Questa sezione descrive come inviare un programma Python al cluster Ray su Vertex AI utilizzando l'API Ray Jobs.

Scrivi uno script Python

Sviluppare l'applicazione come script Python in qualsiasi editor di testo. Ad esempio, inserisci il seguente script in un file 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)]))

Invia un job Ray utilizzando l'API Ray Jobs

Puoi inviare un job Ray utilizzando Python, l'interfaccia a riga di comando Ray Jobs o l'indirizzo pubblico della dashboard Ray.

Python - nome della risorsa del cluster

Invia un job Ray utilizzando un ambiente 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)

Dove:

  • REGION: la regione specificata per il cluster Ray su Vertex AI.

  • PROJECT_ID: il numero del tuo progetto Google Cloud. Puoi trovare l'ID progetto nella pagina di benvenuto della console Google Cloud.

  • CLUSTER_NAME: il nome del cluster Ray su Vertex AI, specificato al momento della creazione del cluster. Vai alla console Google Cloud per visualizzare l'elenco dei nomi dei cluster per un progetto.

  • CLUSTER_RAY_VERSION: blocca la versione di Ray sulla stessa versione del cluster. Ad esempio, 2.33.0.

Python - Dashboard Ray

L'indirizzo della dashboard di Ray è accessibile dall'esterno del VPC, inclusa la rete internet pubblica. Tieni presente che vertex_ray è necessario per ottenere l'autenticazione automaticamente.

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)

Dove:

DASHBOARD_ADDRESS: l'indirizzo della dashboard di Ray per il tuo cluster. Puoi trovare l'indirizzo della dashboard utilizzando l'SDK Vertex AI per Python.

Interfaccia a riga di comando Ray Jobs

Tieni presente che puoi utilizzare i comandi della riga di comando di Ray Jobs solo all'interno della rete VPC conmunta.

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

Dopo aver inviato un job Ray a esecuzione prolungata, se vuoi monitorare lo stato del job utilizzando client.get_job_status(job_id), potresti dover ricostituire client.get_job_status(job_id) per aggiornare il token di autenticazione.JobSubmissionClient(client = JobSubmissionClient("vertex_ray://{}".format(CLUSTER_RESOURCE_NAME)) )

Supporto per il peering VPC e l'account di servizio personalizzato

Ray on Vertex AI supporta l'API Ray Client e Ray Jobs (JobSubmissionClient) in una rete pubblica per gli agenti di servizio predefiniti e gli account di servizio personalizzati.

Il supporto di Ray on Vertex AI per il peering VPC, quando il cluster Ray viene creato con la rete VPC, è mostrato in questa tabella:

Peering VPC Agente di servizio predefinito Service account personalizzato
Ray Client (modalità interattiva) No
Ray JobSubmissionClient

I Controlli di servizio VPC richiedono configurazioni aggiuntive. Per ulteriori dettagli, consulta la sezione Connettività privata e pubblica.

Utilizzare Network File System (NFS) nel codice Ray

Se imposti un mount NFS quando crei il cluster Ray, puoi leggere e scrivere questi volumi NFS nel codice dell'applicazione.

RayClient

Questa sezione mostra come utilizzare il Network File System (NFS) nel codice Ray.

  1. Inizializzare RayClient in un ambiente 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. Esegui script job

    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())))

Puoi inviare un job Ray utilizzando Python, l'interfaccia a riga di comando Ray Jobs o l'indirizzo pubblico della dashboard Ray. Per ulteriori informazioni, consulta Sviluppare un'applicazione sul cluster Ray su Vertex AI.

Passaggi successivi