Développer une application sur le cluster Ray sur Vertex AI

Connectez-vous à un cluster Ray sur Vertex AI et développez une application à l'aide des méthodes suivantes :

  • Connectez-vous au cluster Ray sur Vertex AI via le client Ray à l'aide de la version du SDK Vertex AI pour Python qui inclut les fonctionnalités du client Ray. Utilisez cette option si vous préférez un environnement de développement Python interactif.

    • Utiliser le SDK Vertex AI pour Python dans le notebook Colab Enterprise de la console Google Cloud .

    • Utilisez le SDK Vertex AI pour Python dans une session Python, une interface système ou un notebook Jupyter.

  • Écrivez un script Python et envoyez-le au cluster Ray sur Vertex AI à l'aide de l'API Ray Jobs. Utilisez cette option si vous préférez envoyer des tâches par programmation.

Avant de commencer, assurez-vous de lire la présentation de Ray sur Vertex AI et de configurer tous les outils prérequis.

Se connecter à un cluster Ray via le client Ray

Pour utiliser le client Ray interactif, connectez-vous à votre cluster Ray sur Vertex AI. Le réseau de l'environnement de connexion dépend de la configuration réseau du cluster. Il n'existe aucune restriction concernant l'environnement de connexion tant que le cluster dispose d'un accès Internet public. Autrement dit, vous n'avez pas spécifié de réseau VPC lors de la création du cluster. Toutefois, si le cluster se trouve sur un réseau VPC privé appairé avec Vertex AI, l'environnement de connexion doit se trouver sur le même réseau VPC que le cluster.

La version de Ray côté client doit correspondre à la version de Ray du cluster. pip install "google-cloud-aiplatform[ray]" installe la version 2.47 de Ray côté client par défaut. Si la version de Ray du cluster est antérieure à la version 2.42, par exemple, utilisez pip install ray==2.42.0 pour faire correspondre la version de Ray du côté client à celle du cluster.

Console

Conformément aux bonnes pratiques OSS Ray, le nombre de processeurs logiques est défini sur 0 sur le nœud principal de Ray afin d'éviter toute exécution de charge de travail sur ce nœud.

  1. Dans la console Google Cloud , accédez à la page Ray sur Vertex AI.

    Accéder à la page Ray sur Vertex AI

  2. Sur la ligne du cluster que vous avez créé, cliquez sur Ouvrir dans Colab Enterprise.

  3. Le notebook Colab Enterprise s'ouvre. Suivez les instructions d'utilisation du SDK Vertex AI pour Python pour vous connecter au cluster Ray sur Vertex AI.

    • Si une boîte de dialogue vous invite à activer des API, cliquez sur Activer.

    • Si vous vous connectez au cluster pour la première fois, cliquez sur Se connecter. Si vous vous reconnectez au cluster, cliquez sur Reconnect (Se reconnecter). La connexion du notebook à l'environnement d'exécution prend quelques minutes.

    • Cliquez sur + CRÉER pour créer un notebook.

    • Cliquez sur Panneau Ray sur Vertex AI pour ouvrir le panneau Ray sur Vertex AI.
      Les clusters existants s'affichent.

    • Sélectionnez un cluster, puis cliquez sur SE CONNECTER.
      Le code apparaît dans le notebook ouvert qui se connecte au cluster choisi.

    • Autres actions (facultatif) : Pour ouvrir la page de la liste des clusters Ray sur Vertex AI, cliquez sur Gérer les clusters dans le panneau Ray sur Vertex AI.

      • Sélectionnez un cluster, puis cliquez sur le menu Autres actions.
        D'autres options s'affichent :
        plus d'options
    • Exécutez la cellule de code Premiers pas pour importer le SDK Vertex AI pour Python et vous connecter au cluster Ray sur Vertex AI.

Python

Conformément aux bonnes pratiques OSS Ray, le nombre de processeurs logiques est défini sur 0 sur le nœud principal de Ray afin d'éviter toute exécution de charge de travail sur ce nœud.

Depuis un environnement Python interactif :

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

Où :

  • LOCATION : emplacement que vous spécifiez pour votre cluster Ray sur Vertex AI.

  • PROJECT_ID : ID de votre projet Google Cloud . Trouvez l'ID du projet sur la page d'accueil de la console Google Cloud .

  • CLUSTER_NAME : nom de votre cluster Ray sur Vertex AI, spécifié lors de la création du cluster. Accédez à la consoleGoogle Cloud pour afficher la liste des noms de clusters d'un projet.

Un résultat semblable aux lignes suivantes doit s'afficher :

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

Utilisez l'URL Dashboard pour accéder au tableau de bord Ray à partir d'un navigateur. L'URI est au format https://xxxx-dot-us-central1.aiplatform-training.googleusercontent.com/. Le tableau de bord affiche les tâches envoyées, le nombre de GPU ou de processeurs, ainsi que l'espace disque de chaque machine du cluster.

Une fois que vous êtes connecté au cluster Ray sur Vertex AI, développez un programme Ray de la même manière que pour un backend OSS Ray 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]

Développer une application à l'aide de l'API Ray Jobs

Cette section explique comment envoyer un programme Python au cluster Ray sur Vertex AI à l'aide de l'API Ray Jobs.

Écrire un script Python

Développez votre application en tant que script Python dans n'importe quel éditeur de texte. Par exemple, placez le script suivant dans un fichier 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)]))

Envoyer un job Ray à l'aide de l'API Ray Jobs

Envoyez un job Ray à l'aide de Python, de la CLI Ray Jobs ou de l'adresse publique du tableau de bord Ray.

Python – Nom de la ressource de cluster

Envoyez un job Ray à l'aide d'un environnement 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)

Où :

  • REGION : région que vous spécifiez pour votre cluster Ray sur Vertex AI.

  • PROJECT_ID : numéro de votre projet Google Cloud . Trouvez l'ID du projet sur la page d'accueil de la console Google Cloud .

  • CLUSTER_NAME : nom de votre cluster Ray sur Vertex AI, spécifié lors de la création du cluster. Accédez à la consoleGoogle Cloud pour afficher la liste des noms de clusters d'un projet.

  • CLUSTER_RAY_VERSION: associer la version de Ray à la même version que le cluster. Par exemple, 2.47.1.

Python - Tableau de bord Ray

L'adresse du tableau de bord Ray est accessible depuis l'extérieur du VPC, y compris l'Internet public. Notez que vertex_ray est requis pour obtenir une authentification automatiquement.

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)

Où :

DASHBOARD_ADDRESS : adresse du tableau de bord Ray pour votre cluster. Trouvez l'adresse du tableau de bord à l'aide du SDK Vertex AI pour Python.

CLI Ray  Jobs

N'utilisez les commandes de la CLI Ray Jobs que dans le réseau VPC appairé.

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

Après avoir envoyé un job Ray de longue durée, si vous souhaitez surveiller son état à l'aide de client.get_job_status(job_id), réinstanciez JobSubmissionClient(client = JobSubmissionClient("vertex_ray://{}".format(CLUSTER_RESOURCE_NAME)) ) pour actualiser le jeton d'authentification.

Prise en charge de l'appairage de VPC et du compte de service personnalisé

Ray sur Vertex AI est compatible avec Ray Client et l'API Ray Jobs (JobSubmissionClient) dans un réseau public pour l'agent de service par défaut et les comptes de service personnalisés.

Le tableau suivant présente la compatibilité de Ray sur Vertex AI avec l'appairage de réseaux VPC lorsque vous créez le cluster Ray avec le réseau VPC :

Appairage de VPC Agent de service par défaut Compte de service personnalisé
Client Ray (mode interactif) Oui Non
Ray JobSubmissionClient Oui Oui

VPC Service Controls (VPC-SC) nécessite des configurations supplémentaires. Pour en savoir plus, consultez la section Connectivité privée et publique.

Utiliser Network File System (NFS) dans votre code Ray

Si vous définissez un montage NFS lors de la création du cluster Ray, lisez et écrivez ces volumes NFS dans le code de votre application.

RayClient

Cette section vous explique comment utiliser le système de fichiers en réseau (NFS) dans votre code Ray.

  1. Initialiser RayClient dans un environnement 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. Exécuter le script de 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())))

Envoyez un job Ray à l'aide de Python, de la CLI Ray Jobs ou de l'adresse publique du tableau de bord Ray. Pour en savoir plus, consultez Développer une application sur le cluster Ray sur Vertex AI.

Étapes suivantes