Vertex AI의 Ray 클러스터에서 애플리케이션 개발

Vertex AI에서 Ray 클러스터에 연결하고 다음 방법을 사용하여 애플리케이션을 개발할 수 있습니다.

  • Ray 클라이언트의 기능이 포함된 Python용 Vertex AI SDK 버전을 사용하여 Ray 클라이언트를 통해 Vertex AI의 Ray 클러스터에 연결합니다. 대화형 Python 개발 환경을 원하는 경우 이 옵션을 사용합니다.

    • Google Cloud 콘솔의 Colab Enterprise 노트북 내에서 Python용 Vertex AI SDK를 사용합니다.

    • Python 세션, 셸 또는 Jupyter 노트북 내에서 Python용 Vertex AI SDK를 사용합니다.

  • Python 스크립트를 작성하고 Ray Jobs API를 사용하여 Vertex AI의 Ray 클러스터에 스크립트를 제출합니다. 프로그래매틱 방식으로 작업을 제출하려면 이 옵션을 선택합니다.

시작하기 전에 Vertex AI의 Ray 개요를 읽고 필요한 모든 기본 요건 도구를 설정해야 합니다.

Ray 클라이언트를 통해 Ray 클러스터에 연결

대화형 Ray 클라이언트를 사용하려면 Vertex AI의 Ray 클러스터에 연결합니다. 연결 환경의 네트워크는 클러스터의 네트워크 구성에 따라 다릅니다. 클러스터에 공개 인터넷 액세스 권한이 있는 한 연결 환경에는 제한이 없습니다. 즉, 클러스터 생성 중에 VPC 네트워크가 지정되지 않았습니다. 하지만 클러스터가 Vertex AI와 피어링된 비공개 VPC 네트워크에 있는 경우 연결 환경이 클러스터와 동일한 VPC 네트워크에 있어야 합니다.

클라이언트 측의 Ray 버전은 클러스터의 Ray 버전과 일치해야 합니다. pip install "google-cloud-aiplatform[ray]"는 기본적으로 클라이언트 측에 Ray 버전 2.33을 설치합니다. 클러스터의 Ray 버전이 2.9인 경우 pip install ray==2.9.3를 사용하여 클라이언트 측의 Ray 버전을 클러스터의 Ray 버전과 일치시켜야 합니다.

콘솔

OSS Ray 권장사항에 따라 Ray 헤드 노드에서 논리적 CPU 수를 0으로 설정하면 헤드 노드에서 워크로드가 실행되지 않도록 강제됩니다.

  1. Google Cloud 콘솔에서 Vertex AI의 Ray 페이지로 이동합니다.

    Vertex AI의 Ray 페이지로 이동

  2. 만든 클러스터의 행에서 Colab Enterprise에서 열기를 클릭합니다.

  3. Colab Enterprise 노트북이 열립니다. Python용 Vertex AI SDK를 사용하여 Vertex AI의 Ray 클러스터에 연결하는 방법에 대한 안내를 따릅니다.

    • API를 사용 설정하라는 대화상자 화면이 표시되면 사용 설정을 클릭합니다.

    • 클러스터에 처음 연결하는 경우 연결을 클릭하거나 클러스터에 다시 연결하는 경우 다시 연결을 클릭합니다. 노트북이 런타임에 연결되는 데 몇 분 정도 걸립니다.

    • +만들기를 클릭하여 새 노트북을 만듭니다.

    • Vertex AI의 Ray 패널 아이콘을 클릭하여 Vertex AI의 Ray 패널을 엽니다.
      기존 클러스터 표시가 나타납니다.

    • 클러스터를 선택하고 연결을 클릭합니다.
      선택한 클러스터에 연결되는 코드가 열려 있는 노트북에 표시됩니다.

    • 기타 작업 (선택사항): Vertex AI 기반 Ray 클러스터 목록 페이지를 열려면 Vertex AI 기반 Ray 패널에서 클러스터 관리를 클릭합니다.

      • 클러스터를 선택하고 작업 더보기 메뉴를 클릭합니다.
        옵션이 더 표시됩니다.
        옵션이 더 많이 표시됩니다.
    • 시작하기 코드 셀을 실행하여 Python용 Vertex AI SDK를 가져오고 Vertex AI의 Ray 클러스터에 연결합니다.

Python

OSS Ray 권장사항에 따라 Ray 헤드 노드에서 논리적 CPU 수를 0으로 설정하면 헤드 노드에서 워크로드가 실행되지 않도록 강제됩니다.

대화형 Python 환경에서 다음 명령어를 실행합니다.

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

각 항목의 의미는 다음과 같습니다.

  • LOCATION: Vertex AI의 Ray 클러스터에 지정한 위치입니다.

  • PROJECT_ID: Google Cloud 프로젝트 ID입니다. Google Cloud 콘솔 시작 페이지에서 프로젝트 ID를 찾을 수 있습니다.

  • CLUSTER_NAME: 클러스터를 만들 때 지정한 Vertex AI의 Ray 클러스터 이름입니다. Google Cloud 콘솔로 이동하여 프로젝트의 클러스터 이름 목록을 확인합니다.

출력은 다음과 비슷합니다.

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

Dashboard URL을 사용하여 브라우저에서 Ray 대시보드에 액세스할 수 있습니다. URI 형식은 https://xxxx-dot-us-central1.aiplatform-training.googleusercontent.com/입니다. 대시보드에는 제출된 작업, 클러스터에 있는 각 머신의 GPU 또는 CPU 수와 디스크 공간이 표시됩니다.

Vertex AI의 Ray 클러스터에 연결되면 일반 OSS Ray 백엔드용으로 개발하는 것과 동일한 방식으로 Ray 프로그램을 개발할 수 있습니다.

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

Ray Jobs API를 사용하여 애플리케이션 개발

이 섹션에서는 Ray Jobs API를 사용하여 Vertex AI의 Ray 클러스터에 Python 프로그램을 제출하는 방법을 설명합니다.

Python 스크립트 작성

텍스트 편집기에서 애플리케이션을 Python 스크립트로 개발합니다. 예를 들어 다음 스크립트를 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)]))

Ray Jobs API를 사용하여 Ray 작업 제출

Python, Ray Jobs CLI 또는 공개 Ray 대시보드 주소를 사용하여 Ray 작업을 제출할 수 있습니다.

Python - 클러스터 리소스 이름

Python 환경을 사용하여 Ray 작업을 제출합니다.

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)

각 항목의 의미는 다음과 같습니다.

  • REGION: Vertex AI의 Ray 클러스터에 지정한 리전입니다.

  • PROJECT_ID: Google Cloud 프로젝트 번호입니다. Google Cloud 콘솔 시작 페이지에서 프로젝트 ID를 찾을 수 있습니다.

  • CLUSTER_NAME: 클러스터를 만들 때 지정한 Vertex AI의 Ray 클러스터 이름입니다. Google Cloud 콘솔로 이동하여 프로젝트의 클러스터 이름 목록을 확인합니다.

  • CLUSTER_RAY_VERSION: Ray 버전을 클러스터와 동일한 버전으로 고정합니다. 예를 들어 2.33.0입니다.

Python - Ray 대시보드

공개 인터넷을 포함한 VPC 외부에서 Ray 대시보드 주소에 액세스할 수 있습니다. 인증을 자동으로 가져오려면 vertex_ray가 필요합니다.

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)

각 항목의 의미는 다음과 같습니다.

DASHBOARD_ADDRESS: 클러스터의 Ray 대시보드 주소입니다. Python용 Vertex AI SDK를 사용하여 대시보드 주소를 찾을 수 있습니다.

Ray Jobs CLI

피어링된 VPC 네트워크 내에서는 Ray Jobs CLI 명령어만 사용할 수 있습니다.

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

장기 실행 Ray 작업을 제출한 후 client.get_job_status(job_id)를 사용하여 작업 상태를 모니터링하려면 인증 토큰을 새로고침하기 위해 JobSubmissionClient(client = JobSubmissionClient("vertex_ray://{}".format(CLUSTER_RESOURCE_NAME)) )를 다시 인스턴스화해야 할 수 있습니다.

VPC 피어링 및 맞춤 서비스 계정 지원

Vertex AI의 Ray는 기본 서비스 에이전트 및 맞춤 서비스 계정을 위해 공개 네트워크에서 Ray 클라이언트 및 Ray Jobs API(JobSubmissionClient)를 지원합니다.

VPC 네트워크로 Ray 클러스터를 만들 때 Vertex AI 기반 Ray에서 VPC 피어링을 지원하는 방식은 다음 표와 같습니다.

VPC 피어링 기본 서비스 에이전트 커스텀 서비스 계정
Ray 클라이언트 (대화형 모드) 아니요
Ray JobSubmissionClient

VPC 서비스 제어 (VPC-SC)를 사용하려면 추가 구성이 필요합니다. 자세한 내용은 비공개 및 공개 연결을 참고하세요.

Ray 코드에서 네트워크 파일 시스템 (NFS) 사용

Ray 클러스터를 만들 때 NFS 마운트를 설정하면 애플리케이션 코드에서 이러한 NFS 볼륨을 읽고 쓸 수 있습니다.

RayClient

이 섹션에서는 Ray 코드에서 네트워크 파일 시스템 (NFS)을 사용하는 방법을 보여줍니다.

  1. Python 환경에서 RayClient 초기화

    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. 작업 스크립트 실행

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

Python, Ray Jobs CLI 또는 공개 Ray 대시보드 주소를 사용하여 Ray 작업을 제출할 수 있습니다. 자세한 내용은 Vertex AI의 Ray 클러스터에서 애플리케이션 개발을 참고하세요.

다음 단계