このガイドでは、Flex Start プロビジョニング モードを使用して、中規模および小規模のトレーニング ワークロードの GPU プロビジョニングを最適化する方法について説明します。このガイドでは、Flex Start プロビジョニング モードを使用して、それぞれ 1 つの GPU を必要とする 2 つの Kubernetes Job で構成されるワークロードをデプロイします。GKE は、2 つの A100 GPU を備えた単一ノードを自動的にプロビジョニングして、両方の Job を実行します。
ワークロードにマルチノード分散処理が必要な場合は、キューに格納されたプロビジョニングで Flex Start プロビジョニング モードの使用を検討してください。詳細については、キューに格納されたプロビジョニングで Flex Start を使用して大規模なワークロードを実行するをご覧ください。
このガイドは、バッチ ワークロードの実行に Kubernetes コンテナ オーケストレーション機能を使用することを検討している ML エンジニア、プラットフォーム管理者、オペレーター、データおよび AI のスペシャリストを対象としています。 Google Cloud のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE Enterprise ユーザーロールとタスクをご覧ください。
始める前に
作業を始める前に、次のことを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components update
を実行して最新のバージョンを取得する。
- バージョン 1.32.2-gke.1652000 以降の Autopilot クラスタまたは Standard クラスタがあることを確認します。
- Flex Start プロビジョニング モードの制限事項を理解しておいてください。
- Standard クラスタを使用する場合は、クラスタが正常に機能するように、Flex Start プロビジョニング モードを有効にしていないノードプールを少なくとも 1 つ維持するようにしてください。
Flex Start プロビジョニング モードでノードプールを作成する
既存の Standard クラスタで Flex Start プロビジョニング モードを有効にしてノードプールを作成するには、gcloud CLI または Terraform を使用します。
Autopilot モードでクラスタを使用している場合は、このセクションをスキップして、トレーニング ワークロードを実行するに進みます。
gcloud
Flex Start プロビジョニング モードでノードプールを作成します。
gcloud container node-pools create NODE_POOL_NAME \ --cluster=CLUSTER_NAME \ --location LOCATION_NAME \ --project CLUSTER_PROJECT_ID \ --accelerator=type=nvidia-a100-80gb,count=2 \ --machine-type=a2-ultragpu-2g \ --flex-start \ --num-nodes=0 \ --enable-autoscaling \ --total-min-nodes=0 \ --total-max-nodes=5 \ --location-policy=ANY \ --reservation-affinity=none \ --no-enable-autorepair
次のように置き換えます。
NODE_POOL_NAME
: ノードプールに付ける名前。LOCATION_NAME
: クラスタ コントロール プレーンのコンピューティング リージョン。CLUSTER_NAME
: 変更する Standard クラスタの名前。
このコマンドでは、
--flex-start
フラグを使用して、Flex Start プロビジョニング モードが有効なノードプールを作成するようにgcloud
に指示します。GKE は、2 つの A100 GPU(
a2-ultragpu-2g
)が割り当てられたノードを含むノードプールを作成します。このノードプールは、ノードを 0 から最大 5 ノードに自動的にスケーリングします。ノードプールで Flex-Start プロビジョニング モードのステータスを確認します。
gcloud container node-pools describe NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --location LOCATION_NAME \ --format="get(config.flexStart)"
ノードプールで Flex Start プロビジョニング モードが有効になっている場合、フィールド
flexStart
はTrue
に設定されます。
Terraform
GPU で Flex Start プロビジョニング モードを使用するには、Terraform モジュールを使用します。
Terraform 構成に次のブロックを追加します。
resource "google_container_node_pool" " "gpu_dws_pool" { name = "gpu-dws-pool" queued_provisioning { enabled = false } } node_config { machine_type = "a3-highgpu-8g" flex_start = true }
Terraform が Google Cloud API を呼び出して、GPU で Flex Start プロビジョニング モードを使用するノードプールを含むクラスタを作成します。ノードプールには最初に 0 個のノードがあり、自動スケーリングが有効になっています。Terraform の詳細については、terraform.io の google_container_node_pool
リソースの仕様をご覧ください。
トレーニング ワークロードを実行する
このセクションでは、それぞれ 1 つの GPU を必要とする 2 つの Kubernetes Job を作成します。Kubernetes の Job コントローラは、1 つ以上の Pod を作成し、特定のタスクが正常に実行されるようにします。
Google Cloud コンソールで、Google Cloud コンソールの
[Cloud Shell をアクティブにする] をクリックして、Cloud Shell セッションを起動します。Google Cloud コンソールの下部ペインにセッションが開きます。
dws-flex-start.yaml
という名前のファイルを作成します。apiVersion: batch/v1 kind: Job metadata: name: gpu-job-1 spec: template: spec: nodeSelector: cloud.google.com/gke-flex-start: "true" containers: - name: gpu-container-1 image: gcr.io/k8s-staging-perf-tests/sleep:latest args: ["10s"] # Sleep for 10 seconds resources: requests: nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1 restartPolicy: OnFailure --- apiVersion: batch/v1 kind: Job metadata: name: gpu-job-2 spec: template: spec: nodeSelector: cloud.google.com/gke-flex-start: "true" containers: - name: gpu-container-2 image: gcr.io/k8s-staging-perf-tests/sleep:latest args: ["10s"] # Sleep for 10 seconds resources: requests: nvidia.com/gpu: 1 limits: nvidia.com/gpu: 1 restartPolicy: OnFailure
dws-flex-start.yaml
マニフェストを適用します。kubectl apply -f dws-flex-start.yaml
Job が同じノードで実行されていることを確認します。
kubectl get pods -l "job-name in (gpu-job-1,gpu-job-2)" -o wide
出力は次のようになります。
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES gpu-job-1 0/1 Completed 0 19m 10.(...) gke-flex-zonal-a2 <none> <none> gpu-job-2 0/1 Completed 0 19m 10.(...) gke-flex-zonal-a2 <none> <none>
クリーンアップ
このページで使用したリソースについて、 Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。
プロジェクトを削除する
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
個々のリソースを削除する
ジョブを削除します。
kubectl delete job -l "job-name in (gpu-job-1,gpu-job-2)"
ノードプールを削除します。
gcloud container node-pools delete NODE_POOL_NAME \ --location LOCATION_NAME
クラスタを削除します。
gcloud container clusters delete CLUSTER_NAME
次のステップ
- GKE での GPU の詳細を確認する。
- ノードの自動プロビジョニングの詳細を確認する。
- GKE でバッチ ワークロードを実行するためのベスト プラクティスの詳細を確認する。