Desenvolver um aplicativo no cluster do Ray na Gemini Enterprise Agent Platform

Conecte-se a um cluster do Ray na Gemini Enterprise Agent Platform e desenvolva um aplicativo usando os seguintes métodos:

  • Conecte-se ao cluster do Ray na Gemini Enterprise Agent Platform pelo Ray Client usando a versão do SDK da Agent Platform 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 Agent Platform para Python no notebook do Colab Enterprise no console Google Cloud .

    • Use o SDK da Agent Platform para Python em uma sessão do Python, shell ou notebook do Jupyter.

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

Antes de começar, leia a Visão geral do Ray na Agent Platform e configure todas as ferramentas necessárias como pré-requisito.

Conectar-se a um cluster do Ray pelo Ray Client

Para usar o cliente interativo do Ray, conecte-se ao cluster do Ray na Gemini Enterprise Agent Platform. 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 plataforma de agente do Gemini Enterprise, 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 "Ray na plataforma de agente".

    Acessar a página do Ray na Agent Platform

  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 Agent Platform para Python para se conectar ao cluster do Ray na Gemini Enterprise Agent Platform.

    • 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 Painel do Ray na Agent Platform para abrir o painel "Ray na plataforma de agentes".
      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 a página da lista de clusters do Ray na Agent Platform, clique em Gerenciar clusters no painel do Ray na Agent Platform.

      • 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 Agent Platform para Python e se conectar ao cluster do Ray na Agent Platform do Gemini Enterprise.

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 plataforma de agentes do Gemini Enterprise.

  • 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 plataforma de agentes do Gemini Enterprise, 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: yyyy-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://yyyy-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 Gemini Enterprise Agent Platform, 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 Agent Platform do Gemini Enterprise 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 plataforma de agentes do Gemini Enterprise.

  • 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 plataforma de agentes do Gemini Enterprise, especificado quando você criou 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 Agent Platform 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 plataforma de agentes tem compatibilidade com o Ray Client e a API Ray Jobs (JobSubmissionClient) em uma rede pública para agente de serviço padrão e contas de serviço personalizadas.

A tabela a seguir mostra a compatibilidade do Ray na plataforma de agentes 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 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 Gemini Enterprise Agent Platform.

A seguir