Vertex AI 기반 Ray 클러스터 만들기

Google Cloud 콘솔 또는 Vertex AI SDK for Python를 사용하여 Ray 클러스터를 만들 수 있습니다. 클러스터에는 최대 2,000개의 노드가 있을 수 있습니다. 한 워커 풀의 최대 노드 수는 1,000개입니다. 작업자 풀 수에는 제한이 없지만 노드가 각각 하나씩 있는 1,000개의 작업자 풀을 보유하는 등 작업자 풀 수가 많으면 클러스터 성능에 부정적인 영향을 미칠 수 있습니다.

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

Vertex AI의 Ray 클러스터를 만든 후 이를 시작하려면 10~20분 정도 걸릴 수 있습니다.

콘솔

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

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

    Vertex AI의 Ray 페이지로 이동

  2. 클러스터 만들기를 클릭하여 클러스터 만들기 패널을 엽니다.

  3. 클러스터 만들기 패널의 각 단계에서 기본 클러스터 정보를 검토하거나 바꿉니다. 계속을 클릭하여 각 단계를 완료합니다.

    1. 이름 및 리전에서 이름을 지정하고 클러스터의 위치를 선택합니다.

    2. 컴퓨팅 설정에서 머신 유형, 가속기 유형 및 수, 디스크 유형 및 크기, 복제본 수를 포함하여 Vertex AI의 헤드 노드에서 Ray 클러스터 구성을 지정합니다. 원하는 경우 커스텀 이미지 URI를 추가하여 커스텀 컨테이너 이미지를 지정하여 기본 컨테이너 이미지에서 제공하지 않는 Python 종속 항목을 추가할 수 있습니다. 커스텀 이미지를 참고하세요.

      고급 옵션에서 다음 작업을 할 수 있습니다.

      • 자체 암호화 키를 지정합니다.
      • 커스텀 서비스 계정을 지정합니다.
      • 학습 중에 워크로드의 리소스 통계를 모니터링할 필요가 없는 경우 측정항목 수집을 사용 중지합니다.
    3. (선택사항) 클러스터의 공개 엔드포인트 대신 비공개 엔드포인트를 설정하려면 Vertex AI 기반 Ray과 함께 사용할 VPC 네트워크를 지정합니다. 자세한 내용은 비공개 및 공개 연결을 참고하세요.

      VPC 네트워크에 연결을 설정하지 않았다면 연결 설정을 클릭합니다. 비공개 서비스 액세스 연결 만들기 패널에서 다음 단계를 완료하고 계속을 클릭합니다.

      1. Service Networking API를 사용 설정합니다.

      2. IP 범위 할당에서 IP 범위를 선택 또는 만들거나 Google에서 자동으로 할당하도록 허용할 수 있습니다.

      3. 연결 만들기에서 네트워크할당된 IP 범위 정보를 검토합니다.

      4. 연결 만들기를 클릭합니다.

  4. 만들기를 클릭합니다.

Vertex AI SDK의 Ray

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

대화형 Python 환경에서 다음을 사용하여 Vertex AI 기반 Ray 클러스터를 만듭니다.

import ray
import vertex_ray
from google.cloud import aiplatform
from vertex_ray import Resources

# Define a default CPU cluster, machine_type is n1-standard-16, 1 head node and 1 worker node
head_node_type = Resources()
worker_node_types = [Resources()]

# Or define a GPU cluster.
head_node_type = Resources(
  machine_type="n1-standard-16",
  node_count=1,
  custom_image="us-docker.pkg.dev/my-project/ray-custom.2-9.py310:latest",  # Optional. When not specified, a prebuilt image is used.
)

worker_node_types = [Resources(
  machine_type="n1-standard-16",
  node_count=2,  # Must be >= 1
  accelerator_type="NVIDIA_TESLA_T4",
  accelerator_count=1,
  custom_image="us-docker.pkg.dev/my-project/ray-custom.2-9.py310:latest",  # When not specified, a prebuilt image is used.
)]

aiplatform.init()
# Initialize Vertex AI to retrieve projects for downstream operations.
# Create the Ray cluster on Vertex AI
CLUSTER_RESOURCE_NAME = vertex_ray.create_ray_cluster(
  head_node_type=head_node_type,
  network=NETWORK, #Optional
  worker_node_types=worker_node_types,
  python_version="3.10",  # Optional
  ray_version="2.33",  # Optional
  cluster_name=CLUSTER_NAME, # Optional
  service_account=SERVICE_ACCOUNT,  # Optional
  enable_metrics_collection=True,  # Optional. Enable metrics collection for monitoring.
  labels=LABELS,  # Optional.

)

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

  • CLUSTER_NAME: 프로젝트 전체에서 고유해야 하는 Vertex AI의 Ray 클러스터 이름입니다.

  • NETWORK: (선택사항) projects/PROJECT_ID/global/networks/VPC_NAME 형식의 VPC 네트워크 전체 이름입니다. 클러스터의 공개 엔드포인트 대신 비공개 엔드포인트를 설정하려면 Vertex AI 기반 Ray과 함께 사용할 VPC 네트워크를 지정합니다. 자세한 내용은 비공개 및 공개 연결을 참고하세요.

  • VPC_NAME: (선택사항) VM이 작동하는 VPC입니다.

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

  • SERVICE_ACCOUNT: (선택사항) 클러스터에서 Ray 애플리케이션을 실행할 서비스 계정입니다. 필수 역할이 부여되어야 합니다.

  • LABELS: (선택사항) 레이 클러스터를 구성하는 데 사용되는 사용자 정의 메타데이터가 있는 라벨입니다. 라벨 키와 값은 64자(유니코드 코드 포인트) 이하여야 하며 소문자, 숫자, 밑줄, 대시만 포함할 수 있습니다. 국제 문자는 허용됩니다. 라벨에 대한 자세한 내용과 예시는 https://goo.gl/xmQnxf를 참고하세요.

상태가 RUNNING으로 변경될 때까지 다음 출력이 표시되어야 합니다.

[Ray on Vertex AI]: Cluster State = State.PROVISIONING
Waiting for cluster provisioning; attempt 1; sleeping for 0:02:30 seconds
...
[Ray on Vertex AI]: Cluster State = State.RUNNING

다음에 유의하세요.

  • 첫 번째 노드는 헤드 노드로 사용됩니다.

  • TPU 머신 유형은 지원되지 않습니다.

수명 주기 관리

Vertex AI 기반 Ray 클러스터 수명 주기 동안 각 작업은 상태와 연결됩니다. 각 상태의 결제 상태 및 관리 옵션은 아래 표에 요약되어 있습니다. 참조 문서에서는 이러한 각 상태의 정의를 제공합니다.

작업 상태 청구 삭제 작업을 사용할 수 있나요? 취소 작업을 사용할 수 있나요?
사용자가 클러스터를 만들고 있습니다. PROVISIONING 아니요 아니요 아니요
사용자가 수동으로 확대 또는 축소 업데이트 예, 실시간 사이즈에 따라 다름 아니요
클러스터가 실행 중입니다. 실행 중 해당 사항 없음 - 삭제 가능
클러스터가 수직 확장 또는 축소되고 있음 업데이트 예, 실시간 사이즈에 따라 다름 아니요
사용자가 클러스터를 삭제하고 있습니다. 중지 중 아니요 아니요 해당 사항 없음 - 이미 중지됨
클러스터가 오류 상태로 전환됨 오류 아니요 해당 사항 없음 - 삭제 가능
해당 사항 없음 STATE_UNSPECIFIED 아니요 해당 사항 없음

커스텀 이미지(선택사항)

사전 빌드된 이미지는 대부분의 사용 사례에 적합합니다. 자체 이미지를 빌드하려면 Vertex 기반 Ray 사전 빌드 이미지를 기본 이미지로 사용하는 것이 좋습니다. 기본 이미지에서 이미지를 빌드하는 방법은 Docker 문서를 참고하세요.

이러한 기본 이미지에는 Python, Ubuntu, Ray 설치가 포함되어 있습니다. 다음과 같은 종속 항목도 포함됩니다.

  • python-json-logger
  • google-cloud-resource-manager
  • ca-certificates-java
  • libatlas-base-dev
  • liblapack-dev
  • g++, libio-all-perl
  • libyaml-0-2.

Google의 기본 이미지(고급) 없이 자체 이미지를 빌드하려면 이미지에 다음이 포함되어 있는지 확인하세요.

  • Ray 2.33.0 또는 2.9.3
  • Python 3.10
  • python-json-logger==2.0.7

비공개 및 공개 연결

기본적으로 Vertex AI 기반 Ray는 Vertex AI 기반 Ray 클러스터에서 Ray 클라이언트를 사용하여 대화형 개발을 위한 공개적이고 안전한 엔드포인트를 만듭니다. 개발 또는 일시적인 사용 사례에는 공개 연결을 사용하는 것이 좋습니다. 이 공개 엔드포인트는 인터넷을 통해 액세스할 수 있습니다. Ray 클러스터의 사용자 프로젝트에 대해 최소한 Vertex AI 사용자 역할 권한이 있는 승인된 사용자만 클러스터에 액세스할 수 있습니다.

클러스터에 대한 비공개 연결이 필요하거나 VPC 서비스 제어를 사용하는 경우 Vertex AI 기반 Ray 클러스터에 대해 VPC 피어링이 지원됩니다. 비공개 엔드포인트가 있는 클러스터는 Vertex AI와 피어링된 VPC 네트워크 내의 클라이언트에서만 액세스할 수 있습니다.

Vertex AI 기반 Ray에 VPC 피어링을 사용하여 비공개 연결을 설정하려면 클러스터를 만들 때 VPC 네트워크를 선택합니다. VPC 네트워크에는 VPC 네트워크와 Vertex AI 간에 비공개 서비스 연결이 필요합니다. 콘솔에서 Vertex AI 기반 Ray를 사용하는 경우 클러스터를 만들 때 비공개 서비스 액세스 연결을 설정할 수 있습니다.

Vertex AI에서 Ray 클러스터와 함께 VPC 서비스 제어 및 VPC 피어링을 사용하려면 Ray 대시보드 및 대화형 셸을 사용하기 위한 추가 설정이 필요합니다. Ray 대시보드 및 VPC-SC + VPC 피어링을 사용한 대화형 셸에 설명된 안내에 따라 사용자 프로젝트에서 VPC-SC 및 VPC 피어링을 사용한 대화형 셸 설정을 구성합니다.

Vertex AI에서 Ray 클러스터를 만든 후 Vertex AI SDK for Python을 사용하여 헤드 노드에 연결할 수 있습니다. Compute Engine VM 또는 Vertex AI Workbench 인스턴스와 같은 연결 환경은 Vertex AI와 피어링된 VPC 네트워크에 있어야 합니다. 비공개 서비스 연결에는 IP 주소 수가 제한되어 있어 IP 주소가 소진될 수 있습니다. 따라서 장기 실행 클러스터에는 비공개 연결을 사용하는 것이 좋습니다.

Ray 대시보드 및 VPC-SC + VPC 피어링을 사용한 대화형 셸

  1. peered-dns-domains를 구성합니다.

    {
      VPC_NAME=NETWORK_NAME
      REGION=LOCATION
      gcloud services peered-dns-domains create training-cloud \
      --network=$VPC_NAME \
      --dns-suffix=$REGION.aiplatform-training.cloud.google.com.
    
      # Verify
      gcloud beta services peered-dns-domains list --network $VPC_NAME);
    }
        
    • NETWORK_NAME: 피어링된 네트워크로 변경합니다.

    • LOCATION: 원하는 위치입니다(예: us-central1).

  2. DNS managed zone를 구성합니다.

    {
      PROJECT_ID=PROJECT_ID
      ZONE_NAME=$PROJECT_ID-aiplatform-training-cloud-google-com
      DNS_NAME=aiplatform-training.cloud.google.com
      DESCRIPTION=aiplatform-training.cloud.google.com
    
      gcloud dns managed-zones create $ZONE_NAME  \
      --visibility=private  \
      --networks=https://www.googleapis.com/compute/v1/projects/$PROJECT_ID/global/networks/$VPC_NAME  \
      --dns-name=$DNS_NAME  \
      --description="Training $DESCRIPTION"
    }
        
    • PROJECT_ID: 프로젝트 ID입니다. 이러한 ID는 Google Cloud Console 시작 페이지에서 찾을 수 있습니다.

  3. DNS 트랜잭션을 기록합니다.

    {
      gcloud dns record-sets transaction start --zone=$ZONE_NAME
    
      gcloud dns record-sets transaction add \
      --name=$DNS_NAME. \
      --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
      --zone=$ZONE_NAME \
      --ttl=300
    
      gcloud dns record-sets transaction add \
      --name=*.$DNS_NAME. \
      --type=CNAME $DNS_NAME. \
      --zone=$ZONE_NAME \
      --ttl=300
    
      gcloud dns record-sets transaction execute --zone=$ZONE_NAME
    }
        
  4. 대화형 셸 + VPC-SC + VPC 피어링을 사용 설정한 학습 작업을 제출합니다.

다음 단계