GKE に GPU アクセラレーションを備えた Ray for AI ワークロードをデプロイする
このページでは、Google Kubernetes Engine(GKE)で GPU 対応の Ray クラスタを設定して実行し、AI/ML ワークロードをスケールする方法について説明します。
Ray を使用する理由
GKE で KubeRay を介して Ray を使用すると、Python アプリケーションと AI アプリケーションをスケールできます。アプリケーションのスケーリングを Ray が処理し、基盤となるサーバーおよびリソースを GKE が管理します。
この 2 つの組み合わせにより、リソースの管理、容量の自動調整、信頼性の確保、さまざまな環境へのアプリケーションのデプロイが容易になります。分散型の Ray アプリケーションを GKE 上の既存のクラウド インフラストラクチャとツールに接続することで、標準の Kubernetes メソッドでオペレーションを簡素化し、複雑なタスク向けに堅牢でスケーラブルなプラットフォームをプロビジョニングできます。
詳細については、ブログ投稿の Ray AI ワークロードに GKE を使用する理由をご覧ください。
始める前に
始める前に、次の作業が完了していることを確認してください。
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
-
Install the Google Cloud CLI.
-
フェデレーション ID を使用するように gcloud CLI を構成します。
詳細については、フェデレーション ID を使用して gcloud CLI にログインするをご覧ください。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init
kubectl
をインストールする:kubectl
は、GKE クラスタの操作で主に使用するコマンドライン ツールです。Cloud Shell を使用する場合、kubectl
はすでにインストールされています。インストールされていない場合は、gcloud components install kubectl
コマンドを実行してターミナルにインストールします。インストールを確認するには、
kubectl version --client
コマンドを実行します。- Ray をインストールする: Ray をインストールする前に、Python 仮想環境(
venv
)を作成して入力し、依存関係を分離することを強くおすすめします。- Python をインストールする
- 新しい仮想環境を作成して有効にする。
- 仮想環境内で
pip install -U "ray[default]"
コマンドを実行して、Ray の最新の安定版をインストールします。 - インストールを確認するには、
ray --version
コマンドを実行します。出力にある Ray バージョン(2.44.1 など)をメモします。
- Google Cloud プロジェクトに L4 GPU のための十分な割り当てがあることを確認します。詳細については、GPU についてと数量に基づく割り当てをご覧ください。
次の
gcloud container clusters create-auto
コマンドをターミナルで実行します。gcloud container clusters create-auto my-ray-enabled-cluster \ --enable-ray-operator \ --enable-ray-cluster-monitoring \ --enable-ray-cluster-logging \ --location=us-central1
この Google Cloud CLI コマンドを実行することで、
my-ray-enabled-cluster
という名前の Autopilot クラスタが次の設定で作成されます。--enable-ray-operator
: Ray Operator をクラスタにインストールします。これにより、Kubernetes 内の Ray クラスタの管理が簡素化されます。--enable-ray-cluster-monitoring
: Ray のクラスタ指標と Cloud Monitoring との統合を設定します。--enable-ray-cluster-logging
: Ray クラスタからログを収集するよう Cloud Logging との統合を構成します。--location=us-central1
: GKE クラスタが作成される地理的リージョンを指定します。アクセラレータの提供状況とサポートされているタイプは、地域によって異なります。詳細については、GPU のリージョンとゾーンをご覧ください。
Autopilot クラスタは、ワークロードの需要に基づいてノードをプロビジョニングしてスケール(コンピューティング クラスを使用する GPU 対応ノードを含む)し、使用率と費用の両方を最適化します。Autopilot クラスタでリソースを自動的にプロビジョニングしてスケールすることで、リソース管理が簡素化され、インフラストラクチャではなくモデルに集中できます。
GKE Standard クラスタを使用する場合、Ray を有効にするフラグと設定が異なる場合があります。詳細については、GKE で Ray オペレーターを有効にするをご覧ください。
クラスタと通信を行うように
kubectl
を構成します。gcloud container clusters get-credentials my-ray-enabled-cluster \ --region=us-central1
次の
gcloud container clusters create
コマンドをターミナルで実行します。gcloud container clusters create my-ray-enabled-cluster \ --addons=RayOperator \ --enable-ray-cluster-monitoring \ --enable-ray-cluster-logging \ --region=us-central1 \ --enable-autoprovisioning \ --max-cpu=10 \ --max-memory=64
この Google Cloud CLI コマンドを実行することで、
my-ray-enabled-cluster
という名前の Standard クラスタが次の設定で作成されます。--addons=RayOperator
: Ray Operator をクラスタにインストールします。これにより、Kubernetes 内の Ray クラスタの管理が簡素化されます。--enable-ray-cluster-monitoring
: Ray のクラスタ指標と Cloud Monitoring との統合を設定します。--enable-ray-cluster-logging
: Ray クラスタからログを収集するよう Cloud Logging との統合を構成します。--region=us-central1
: GKE クラスタが作成される地理的リージョンを指定します。アクセラレータの提供状況とサポートされているタイプは、地域によって異なります。詳細については、GPU のリージョンとゾーンをご覧ください。--enable-autoprovisioning
: ワークロードの需要に基づいて、ノードプールを自動的に作成および削除し、それらのプール内のノードをスケーリングします。--max-cpu
: クラスタがスケーリングできる最大コア数。--max-memory
: クラスタがスケーリングできる最大メモリ量(GB)。
クラスタと通信を行うように
kubectl
を構成します。gcloud container clusters get-credentials my-ray-enabled-cluster \ --region=us-central1
リリース ページに移動し、プラットフォームのバイナリをダウンロードします。たとえば、Linux amd64 に
kubectl ray
プラグイン バージョン 1.3.2 をインストールするには、次のコマンドを実行します。curl -LO https://github.com/ray-project/kuberay/releases/download/v1.3.2/kubectl-ray_v1.3.2_linux_amd64.tar.gz tar -xvf kubectl-ray_v1.3.2_linux_amd64.tar.gz cp kubectl-ray ~/.local/bin
~/.local/bin
は、PATH
のディレクトリに置き換えます。インストールされたことを確認します。
kubectl ray version
KubeRay operator installation cannot be found: no KubeRay operator deployments found in any namespace.
のように警告が表示された場合は、無視してかまいません。インストールが成功した場合は、kubectl ray
プラグインのバージョンが出力されます。次のコンピューティング クラスの仕様を
nvidia-l4-compute-class.yaml
として保存します。apiVersion: cloud.google.com/v1 kind: ComputeClass metadata: name: gpu-compute-class spec: priorities: - gpu: type: nvidia-l4 count: 1 spot: true - gpu: type: nvidia-l4 count: 1 spot: false nodePoolAutoCreation: enabled: true whenUnsatisfiable: DoNotScaleUp
次のコマンドを実行して、コンピューティング クラスを作成します。
kubectl apply -f nvidia-l4-compute-class.yaml
カスタム コンピューティング クラス適用後: コンピューティング クラスの YAML ファイルを適用すると、Ray クラスタがリクエストした際に、NVIDIA L4 GPU を 1 つ備えたノードが GKE により自動的にプロビジョニングされます。マニフェストで定義されているように、Spot VM の優先度が設定されます。
whenUnsatisfiable: DoNotScaleUp
設定は、指定された要件を満たさないノードを作成しないよう GKE に指示します。Ray クラスタを作成します。
kubectl ray create cluster
コマンドを使用して、Ray クラスタの定義と作成を行います。基盤となる Kubernetes リソースの作成をこのコマンドを使用して処理することで、プロセスを簡素化できます。kubectl ray create cluster my-ray-cluster \ --worker-replicas=1 \ --worker-cpu=2 \ --worker-memory=4Gi \ --worker-gpu=1 \ --worker-node-selectors="cloud.google.com/compute-class=gpu-compute-class"
kubectl ray create cluster
コマンドは、KubeRay プラグインを使用して仕様を RayCluster カスタム リソース定義に変換し、Kubernetes API に送信して RayCluster オブジェクトを作成します。このオブジェクトはブループリントとして機能し、GKE 内で実際の Ray クラスタ コンポーネント(ヘッドノードとワーカーノード)をプロビジョニングして管理する方法を Ray Operator に指示します。デフォルトでは、GKE は E2 マシンシリーズのノードにヘッド Pod をスケジュールします。この例では次の設定が使われています。
kubectl ray create cluster my-ray-cluster
: 作成する Ray クラスタの名前を指定します。--worker-node-selectors
:cloud.google.com/compute-class=gpu-compute-class
というラベルが付いたノードにワーカー Pod をスケジュールするように Kubernetes に指示します。
Ray クラスタのステータスを確認します。次のコマンドを使用して、Ray クラスタが稼働していることを確認します。
次のコマンドを実行して、RayCluster リソースを確認します。
kubectl ray get cluster
このコマンドを実行すると、Kubernetes の名前空間にある Ray クラスタの全一覧を表示できます。
my-ray-cluster
も表示されるはずです。クラスタの初期化には数分かかることがあります。次のコマンドを実行して、Kubernetes Pod を確認します。
kubectl get pods
このコマンドを実行すると、Kubernetes の名前空間で実行されている Pod の全一覧を表示できます。Ray クラスタに関連する Pod が表示されます。
- Ray ヘッドノードの Pod(
my-ray-cluster-head-0
などの名前)。 - 1 つ以上の Ray ワーカーノードの Pod(
my-ray-cluster-worker-group-0-xxxxx
などの名前)。ワーカー Pod の数は、Ray クラスタの初期構成と、発生した可能性のある自動スケーリングによって異なります。
- Ray ヘッドノードの Pod(
Ray インタラクティブ セッションを開始します。Ray クラスタへのローカル接続を確立するには、次のコマンドを実行します。
kubectl ray session my-ray-cluster
このコマンドにより、ローカルマシンと GKE クラスタ内の Ray ヘッドノード間のポート転送が開始されます。このセッションがアクティブになっている間は、ターミナルが占有されます。続行するには、別のターミナル インスタンスを開きます。
実行するサンプルコードを作成します。次のサンプルコードを
sample_code.py
という名前のファイルに保存します。import ray import os import requests ray.init() @ray.remote class Counter: def __init__(self): # Used to verify runtimeEnv self.name = os.getenv("counter_name") assert self.name == "test_counter" self.counter = 0 def inc(self): self.counter += 1 def get_counter(self): return "{} got {}".format(self.name, self.counter) counter = Counter.remote() for _ in range(5): ray.get(counter.inc.remote()) print(ray.get(counter.get_counter.remote())) # Verify that the correct runtime env was used for the job. assert requests.__version__ == "2.26.0"
新しいターミナルを開いて Ray ジョブを送信します。
- ローカルマシンで新しいターミナルを開きます。Ray のインストール用に仮想環境を作成した場合は、この新しいターミナルでも有効にしてください。
sample_code.py
ファイルを保存したディレクトリに移動します。次のコマンドを実行します。
ray job submit \ --working-dir=. \ --runtime-env-json='{"pip": ["requests==2.26.0"], "env_vars": {"counter_name": "test_counter"}}' \ --address http://localhost:8265 python sample_code.py
この例では次の設定が使われています。
--working-dir=.
: クラスタ上の Ray ジョブで使用できるように、現在のディレクトリを作業ディレクトリとして指定します。このディレクトリには、Ray で実行するアプリケーションのソースコードのみが含まれるようにします。この例では、sample_code.py
ファイルです。--runtime-env-json='{"pip": ["requests==2.26.0"], "env_vars": {"counter_name": "test_counter"}}'
: ジョブのランタイム環境を定義します。必要な Python ライブラリ バージョン(requests==2.26.0
)を指定し、ジョブの実行用に環境変数(counter_name
)を設定します。
Ray ジョブを表示します。ジョブは次のいずれかの方法でモニタリングできます。
- Ray ダッシュボード: ウェブブラウザを開いて
http://localhost:8265
に移動すると、Ray ダッシュボードが開きます。ここでは、ステータス、ログ、リソース使用量など、実行中のジョブに関する情報を確認できます。 - Metrics Explorer:Google Cloud コンソールの事前構築された指標ダッシュボードを使用できます。詳細については、Ray on GKE クラスタのログと指標を収集して表示するをご覧ください。
- Ray ダッシュボード: ウェブブラウザを開いて
Ray セッションを終了します。Ray クラスタの操作やジョブのモニタリングが完了したら、
kubectl ray session
コマンドを実行したターミナルでCtrl+C
を押して、インタラクティブ セッションを終了できます。- Google Cloud コンソールで [リソースの管理] ページに移動します。
- プロジェクト リストにある削除するプロジェクトを選択し、[削除] をクリックします。
- ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。
- Ray on GKE のその他の例、ベスト プラクティス、ツールを確認する: 詳細については、ai-on-gke GitHub リポジトリをご覧ください。
- GKE でアクセラレータを使用する方法の詳細: GPU を使用して、ML タスクとデータ分析タスクの並列処理を行います。大規模なディープ ラーニング モデルのトレーニングと推論を高速化するには、TPU を使用します。
- Ray オペレーターの詳細: Ray オペレーターを使用して Ray デプロイ(Ray ジョブなど)を管理する方法については、GKE 上の Ray についてをご覧ください。
- ジョブ キューイングに Kueue を使用する: Kubernetes ネイティブのジョブ キューイング システムである Kueue で AI/ML ワークロードの管理と優先順位付けを行うことで、リソース使用率を改善する方法を確認します。詳細については、混合 AI/ML トレーニング ワークロードと推論ワークロードの GKE リソース使用率を最適化するをご覧ください。
GKE クラスタを作成する
ワークロードは、GKE Autopilot クラスタまたは GKE Standard クラスタにデプロイできます。フルマネージドの Kubernetes エクスペリエンスを実現するには、Autopilot クラスタを使用することをおすすめします。ワークロードに最適な GKE の運用モードを選択するには、GKE の運用モードを選択するをご覧ください。
Autopilot
Autopilot モードでは、スケーリング、セキュリティなどの事前構成済みの設定を含むクラスタの構成が Google によって管理されます。Autopilot クラスタは、ほとんどの本番環境ワークロードを実行するように最適化されており、Kubernetes マニフェストに基づいてコンピューティング リソースをプロビジョニングします。
Standard
Standard モードでは、GKE クラスタの基盤となるインフラストラクチャをより細かく制御できます。ノードプール、ノードサイズ、その他の構成を直接管理するため、カスタマイズの自由度が高くなります。Standdard クラスタは、特定の構成やリソースの厳密な制御が必要なワークロードに適しています。
KubeRay の kubectl ray
プラグインをインストールする
kubectl ray
プラグインを使用すると、Kubernetes での一般的な Ray ワークフローを簡素化できます。最新のインストール手順については、KubeRay のドキュメントをご覧ください。
クラスタにカスタム コンピューティング クラスを作成する
GKE のカスタム コンピューティング クラスを使用すると、GPU のタイプや数といった特定のハードウェア要件を優先度別に定義できます。GKE は、ワークロードのノードをプロビジョニングするときにこの優先度を使用します。
このガイドのカスタム コンピューティング クラスのサンプルを作成するには、次の操作を行います。
Ray クラスタを作成して確認する
GKE クラスタに Ray クラスタを作成できるようになりました。
Ray ジョブを送信する
Ray クラスタの準備ができたら、GKE で実行中の Ray クラスタに Ray ジョブを送信できます。
これを行うには、kubectl ray session
コマンドを使用してインタラクティブ セッションを開始し、ray job submit
コマンドを使用してジョブの実行を開始します。
クリーンアップ
このページで使用したリソースについて、 Google Cloud アカウントに課金されないようにするには、次の手順で操作します。
クイックスタートを Google Cloud 新しいプロジェクトにデプロイした後、そのプロジェクトが不要になった場合は、次の手順で削除します。
新しい Google Cloud プロジェクトを作成しなかった場合、GKE クラスタが不要になった場合は、次のコマンドを実行することで削除できます。
gcloud container clusters delete my-ray-enabled-cluster \ --location=us-central1