Flex Start プロビジョニング モードで小規模なバッチ ワークロードを実行する


このガイドでは、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 を実行して最新のバージョンを取得する。

Flex Start プロビジョニング モードでノードプールを作成する

既存の Standard クラスタで Flex Start プロビジョニング モードを有効にしてノードプールを作成するには、gcloud CLI または Terraform を使用します。

Autopilot モードでクラスタを使用している場合は、このセクションをスキップして、トレーニング ワークロードを実行するに進みます。

gcloud

  1. 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 ノードに自動的にスケーリングします。

  2. ノードプールで Flex-Start プロビジョニング モードのステータスを確認します。

    gcloud container node-pools describe NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location LOCATION_NAME \
        --format="get(config.flexStart)"
    

    ノードプールで Flex Start プロビジョニング モードが有効になっている場合、フィールド flexStartTrue に設定されます。

Terraform

GPU で Flex Start プロビジョニング モードを使用するには、Terraform モジュールを使用します。

  1. 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 を作成し、特定のタスクが正常に実行されるようにします。

  1. Google Cloud コンソールで、Google Cloud コンソールCloud Shell 有効化アイコン [Cloud Shell をアクティブにする] をクリックして、Cloud Shell セッションを起動します。Google Cloud コンソールの下部ペインにセッションが開きます。

  2. 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
    
  3. dws-flex-start.yaml マニフェストを適用します。

    kubectl apply -f dws-flex-start.yaml
    
  4. 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 アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトを削除する

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

個々のリソースを削除する

  1. ジョブを削除します。

    kubectl delete job -l "job-name in (gpu-job-1,gpu-job-2)"
    
  2. ノードプールを削除します。

    gcloud container node-pools delete NODE_POOL_NAME \
          --location LOCATION_NAME
    
  3. クラスタを削除します。

    gcloud container clusters delete CLUSTER_NAME
    

次のステップ