Vertex AI で Ray クラスタを作成する

Ray クラスタを作成するには、Google Cloud コンソールまたは Vertex AI SDK for Python を使用します。クラスタには最大 2,000 個のノードを配置できます。1 つのワーカープール内のノード数の上限は 1,000 です。ワーカープールの数に上限はありませんが、1 ノードあたり 1,000 個のワーカープールなど、ワーカープールの数が多くなると、クラスタのパフォーマンスに影響する可能性があります。

始める前に、Ray on Vertex AI の概要を読み、前提条件となるすべてのツールを設定してください。

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. (省略可)クラスタのパブリック エンドポイントの代わりにプライベート エンドポイントを設定するには、Ray on Vertex AI に使用する VPC ネットワークを指定します。詳細については、プライベート接続とパブリック接続をご覧ください。

      VPC ネットワークの接続をまだ設定していない場合は、[接続を設定] をクリックします。[プライベート サービス アクセス接続の作成] パネルで、次の各ステップを完了して [続行] をクリックします。

      1. Service Networking API を有効にします。

      2. [IP 範囲を割り振る] で、IP 範囲を選択または作成できます。また、IP 範囲が自動的に割り振られるように設定することもできます。

      3. [接続を作成する] で、[ネットワーク] と [割り振られている IP 範囲] の情報を確認します。

      4. [接続を作成] をクリックします。

  4. [作成] をクリックします。

Ray on Vertex AI SDK

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:(省略可)VPC ネットワークの完全な名前(projects/PROJECT_ID/global/networks/VPC_NAME 形式)。クラスタのパブリック エンドポイントではなくプライベート エンドポイントを設定するには、Ray on Vertex AI で使用する VPC ネットワークを指定します。詳細については、プライベート接続とパブリック接続をご覧ください。

  • VPC_NAME:(省略可)VM が動作している VPC。

  • PROJECT_ID: Google Cloud プロジェクト ID。プロジェクト ID は、Google Cloud コンソールの [ようこそ] ページで確認できます。

  • SERVICE_ACCOUNT:(省略可)クラスタで Ray アプリケーションを実行するサービス アカウント。必要なロールが付与されている必要があります。

  • LABELS: (省略可)Ray クラスタの編成に使用されるユーザー定義のメタデータを含むラベル。ラベルのキーと値は 64 文字(Unicode コードポイント)以下にする必要があります。使用できるのは小文字、数字、アンダースコア、ダッシュのみです。国際文字も使用できます。ラベルの詳細と例については 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 いいえ いいえ いいえ
ユーザーが手動でスケールアップまたはスケールダウンしている UPDATING はい、リアルタイムのサイズに基づきます はい いいえ
クラスタを実行しています RUNNING はい はい 該当なし。削除可能です
クラスタが自動的にスケールアップまたはスケールダウンしている UPDATING はい、リアルタイムのサイズに基づきます はい いいえ
ユーザーがクラスタを削除している STOPPING いいえ いいえ 該当なし。すでに停止しています
クラスタがエラー状態になる ERROR いいえ はい 該当なし。削除可能です
該当なし STATE_UNSPECIFIED いいえ 該当なし

カスタム イメージ(省略可)

ビルド済みイメージは、ほとんどのユースケースに対応しています。独自のイメージをビルドする場合は、Ray on Vertex のビルド済みイメージをベースイメージとして使用することをおすすめします。ベースイメージからイメージを作成する方法については、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.
  • rsync

Google のベースイメージを使用せずに独自のイメージをビルドする場合(上級者向け)は、イメージに以下が含まれていることを確認してください。

  • Ray 2.33.0 または 2.9.3
  • Python 3.10
  • python-json-logger==2.0.7

プライベート接続とパブリック接続

デフォルトでは、Ray on Vertex AI は、Vertex AI の Ray クラスタで Ray クライアントを使用してインタラクティブな開発を行うための、安全なパブリック エンドポイントを作成します。開発や一時的なユースケースには、パブリック接続を使用することをおすすめします。このパブリック エンドポイントには、インターネット経由でアクセスできます。クラスタにアクセスできるのは、Ray クラスタのユーザー プロジェクトに対する Vertex AI ユーザーロール権限が付与されている承認済みユーザーのみです。

クラスタへのプライベート接続が必要な場合や、VPC Service Controls を使用している場合は、Vertex AI の Ray クラスタで VPC ピアリングがサポートされています。プライベート エンドポイントを使用するクラスタには、Vertex AI とピアリングされている VPC ネットワーク内のクライアントからのみアクセスできます。

Ray on Vertex AI の VPC ピアリングを使用してプライベート接続を設定するには、クラスタの作成時に VPC ネットワークを選択します。VPC ネットワークには、VPC ネットワークと Vertex AI の間に限定公開サービス接続が必要です。コンソールで Ray on Vertex AI を使用する場合は、クラスタを作成するときに限定公開サービス アクセス接続を設定できます。

Vertex AI の Ray クラスタで VPC Service Controls と VPC ピアリングを使用する場合は、Ray ダッシュボードとインタラクティブ シェルを使用するために追加の設定が必要になります。VPC-SC と VPC ピアリングを使用した Ray ダッシュボードとインタラクティブ シェルの手順に沿って、ユーザー プロジェクトで VPC-SC と VPC ピアリングを使用してインタラクティブ シェルの設定を構成します。

Vertex AI に Ray クラスタを作成したら、Vertex AI SDK for Python を使用してヘッドノードに接続できます。接続環境(Compute Engine VM や Vertex AI Workbench インスタンスなど)は、Vertex AI とピアリングされている VPC ネットワークに存在する必要があります。限定公開サービス接続の IP アドレスの数には上限があるため、IP アドレスが枯渇する可能性があります。そのため、長時間実行されるクラスタにはプライベート接続を使用することをおすすめします。

VPC-SC と VPC ピアリングを使用した Ray ダッシュボードとインタラクティブ シェル

  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 コンソールの [ようこそ] ページで確認できます。

  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 ピアリングを有効にしてトレーニング ジョブを送信します。

次のステップ