Desenvolver um aplicativo no cluster do Ray na Vertex AI

Conecte-se a um cluster do Ray na Vertex AI e desenvolva 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 no 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 cliente interativo do Ray, 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, você não especificou uma rede VPC 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.47 do Ray no lado do cliente por padrão. Se a versão do Ray do cluster for mais antiga que, por exemplo, 2.42, use pip install ray==2.42.0 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 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.

    • Se você estiver se conectando ao cluster pela primeira vez, clique em Conectar. Se você estiver se reconectando ao cluster, clique em Reconectar. 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.
      Os clusters atuais são exibidos.

    • 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
    • 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: o local especificado para o cluster do Ray na Vertex AI.

  • PROJECT_ID: o 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 Google Cloud console para visualizar a lista de nomes de clusters de um projeto.

Você verá um resultado parecido com este:

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

Use 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, desenvolva 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

Envie 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 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 Google Cloud console 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.47.1.

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. Encontre o endereço do painel usando o SDK da Vertex AI para Python.

CLI da Ray Jobs

Use os comandos da CLI do Ray Jobs apenas 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 do Ray de longa duração, se você quiser monitorar o status dele usando client.get_job_status(job_id), crie uma nova instância de 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.

A tabela a seguir mostra a compatibilidade do Ray na Vertex AI com o peering de VPC ao criar o cluster do Ray com a rede VPC:

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 seu código do Ray

Se você definir uma montagem NFS ao criar o cluster do Ray, leia e grave esses volumes NFS no seu código do aplicativo.

RayClient

Nesta seção, mostramos 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 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())))

Envie 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