Desenvolver um aplicativo no cluster do Ray na Vertex AI

É possível se conectar a um cluster do Ray na Vertex AI e desenvolver um aplicativo usando os seguintes métodos:

  • Conecte-se ao cluster do Ray na Vertex AI pelo Ray Client usando a versão do SDK da Vertex AI para Python que inclui a funcionalidade do Ray Client. Use essa opção se preferir um ambiente de desenvolvimento em Python interativo.

    • Use o SDK da Vertex AI para Python dentro do notebook do Colab Enterprise no console do Google Cloud.

    • Use o SDK da Vertex AI para Python dentro de uma sessão do Python, do shell ou do notebook do Jupyter.

  • Escreva um script em Python e envie-o para o cluster do Ray na Vertex AI usando a API Ray Jobs. Use essa opção se preferir enviar jobs de maneira programática.

Before you begin, make sure to read the Ray on Vertex AI overview and set up all the prerequisite tools you need.

Conectar-se a um cluster do Ray pelo Ray Client

Para usar o Ray Client interativo, conecte-se ao cluster do Ray na Vertex AI. A rede do ambiente de conexão depende da configuração de rede do cluster. Não há restrições no ambiente de conexão, desde que o cluster tenha acesso público à Internet. Ou seja, nenhuma rede VPC foi especificada durante a criação do cluster. No entanto, se o cluster estiver em uma rede VPC particular com peering com a Vertex AI, o ambiente de conexão precisará estar na mesma rede VPC que o cluster.

A versão do Ray no lado do cliente precisa corresponder à versão do Ray do cluster. pip install "google-cloud-aiplatform[ray]" instala a versão 2.33 do Ray no lado do cliente por padrão. Se a versão do Ray do cluster for 2.9, use pip install ray==2.9.3 para que a versão do Ray do lado do cliente corresponda à versão do Ray do cluster.

Console

De acordo com as Práticas recomendadas do OSS Ray a configuração da contagem lógica de CPU como 0 no nó principal do Ray é aplicada para para evitar a execução de cargas de trabalho no nó principal.

  1. No console do Google Cloud, acesse a página do Ray na Vertex AI.

    Acessar a página do Ray na Vertex AI

  2. Na linha do cluster que você criou, clique em Abrir no Colab Enterprise.

  3. O bloco do Colab Enterprise abre. Siga as instruções sobre como usar o SDK da Vertex AI para Python para se conectar ao cluster do Ray na Vertex AI.

    • Se uma caixa de diálogo solicitar a ativação de APIs, clique em Ativar.

    • Clique em Conectar, caso esteja se conectando ao cluster pela primeira vez, ou em Reconectar, caso esteja se reconectando ao cluster. O notebook leva alguns minutos para se conectar ao ambiente de execução.

    • Clique em +CRIAR para criar um notebook.

    • Clique em Ray no painel da Vertex AI para abrir o Ray no painel da Vertex AI.
      A exibição dos clusters existentes é exibida.

    • Selecione um cluster e clique em CONECTAR.
      No notebook aberto, há um código que se conecta ao cluster escolhido.

    • Outras ações (opcional): para abrir o Ray na página da lista de clusters da Vertex AI, clique em Gerenciar clusters no painel do Ray na Vertex AI.

      • Selecione um cluster e clique no menu mais ações.
        Mais opções vão aparecer:
        mais opções aparecem
    • Execute a célula de código Introdução para importar o SDK da Vertex AI para Python e se conectar ao cluster do Ray na Vertex AI.

Python

De acordo com as Práticas recomendadas do OSS Ray a configuração da contagem lógica de CPU como 0 no nó principal do Ray é aplicada para para evitar a execução de cargas de trabalho no nó principal.

Em um ambiente Python interativo:

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

Em que:

  • LOCATION: a região especificada para o cluster do Ray na Vertex AI.

  • PROJECT_ID pelo ID do projeto do Google Cloud. Encontre o ID do projeto na página de boas-vindas do Console do Google Cloud.

  • CLUSTER_NAME: o nome do cluster do Ray na Vertex AI, especificado ao criar o cluster. Acesse o console do Google Cloud para visualizar a lista de nomes de clusters de um projeto.

Você verá uma saída semelhante a esta:

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

É possível usar o URL Dashboard para acessar o painel do Ray por um navegador. O URI está no formato https://xxxx-dot-us-central1.aiplatform-training.googleusercontent.com/. O painel mostra os jobs enviados, o número de GPUs ou CPUs e o espaço em disco de cada máquina no cluster.

Depois de se conectar ao cluster do Ray na Vertex AI, é possível desenvolver um programa do Ray da mesma maneira que você faria por um back-end 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]

Desenvolver um aplicativo usando a API Ray Jobs

Nesta seção, descrevemos como enviar um programa em Python para o cluster do Ray na Vertex AI usando a API Ray Jobs.

Escrever um script em Python

Desenvolva seu aplicativo como um script em Python por qualquer editor de texto. Por exemplo, coloque o script a seguir em um arquivo 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 um job do Ray usando a API Ray Jobs

É possível enviar um job do Ray usando Python, a CLI da Ray Jobs ou o endereço público do painel do Ray.

Python: nome do recurso do cluster

Envie um job do Ray usando um 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)

Em que:

  • REGION: a região especificada para o cluster do Ray na Vertex AI.

  • PROJECT_ID: o número do seu projeto do Google Cloud. Encontre o ID do projeto na página de boas-vindas do Console do Google Cloud.

  • CLUSTER_NAME: o nome do cluster do Ray na Vertex AI, especificado ao criar o cluster. Acesse o console do Google Cloud para visualizar a lista de nomes de clusters de um projeto.

  • CLUSTER_RAY_VERSION: fixa a versão do Ray na mesma versão do cluster Por exemplo, 2.33.0.

Python: painel do Ray

O endereço do painel do Ray pode ser acessado por fora da VPC, inclusive pela Internet pública. Lembre-se que vertex_ray é necessário para receber a autenticação 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)

Em que:

DASHBOARD_ADDRESS: o endereço do painel do Ray do seu cluster. É possível encontrar o endereço do painel usando o SDK da Vertex AI para Python.

CLI da Ray Jobs

Lembre-se que só é possível usar os comandos da CLI da Ray Jobs na rede VPC com peering.

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

Depois de enviar um job de longa duração do Ray, se você quiser monitorar o status do job usando client.get_job_status(job_id), talvez seja necessário instanciar novamente JobSubmissionClient(client = JobSubmissionClient("vertex_ray://{}".format(CLUSTER_RESOURCE_NAME)) ) para atualizar o token de autenticação.

Compatibilidade com peering de VPC e conta de serviço personalizada

O Ray na Vertex AI tem compatibilidade com o Ray Client e à API Ray Jobs (JobSubmissionClient) em uma rede pública para agentes de serviço padrão e contas de serviço personalizadas.

Compatibilidade do Ray na Vertex AI com peering de VPC, quando o cluster do Ray é criado com a rede VPC, é mostrada nesta tabela:

Peering de VPC Agente de serviço padrão Conta de serviço personalizada
Ray Client (modo interativo) Sim Não
JobSubmissionClient do Ray Sim Sim

O VPC Service Controls (VPC-SC) exige mais configurações. Consulte Conectividade particular e pública para mais detalhes.

Usar o sistema de arquivos de rede (NFS) no código do Ray

Se você definir uma montagem NFS ao criar o cluster do Ray, poderá ler e gravar esses volumes NFS no código do aplicativo.

RayClient

Esta seção mostra como usar o Network File System (NFS) no seu código do Ray.

  1. Inicializar o RayClient em um 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. Executar o script do 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())))

É possível enviar um job do Ray usando Python, a CLI da Ray Jobs ou o endereço público do painel do Ray. Para mais informações, consulte Desenvolver um aplicativo no cluster do Ray na Vertex AI.

A seguir