GPU と Flex Start VM で小規模なバッチ ワークロードを実行する

このガイドでは、Flex Start VM を使用して、中規模および小規模のトレーニング ワークロードの GPU プロビジョニングを最適化する方法について説明します。Flex Start VM は、Flex Start 使用オプションを使用して作成されます。このガイドでは、Flex Start VM を使用して、2 つの Kubernetes Job で構成されるワークロードをデプロイします。各 Job には 1 つの GPU が必要です。両方の Job を実行するために 2 つの A100 GPU を備えた単一ノードが GKE で自動的にプロビジョニングされます。

ワークロードにマルチノード分散処理が必要な場合は、キューに格納されたプロビジョニングで Flex Start の使用を検討してください。詳細については、キューに格納されたプロビジョニングで Flex Start を使用して大規模なワークロードを実行するをご覧ください。

このガイドは、バッチ ワークロードの実行に Kubernetes コンテナ オーケストレーション機能を使用することを検討している ML エンジニア、プラットフォーム管理者、オペレーター、データおよび AI のスペシャリストを対象としています。 Cloud de Confiance by S3NS のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE ユーザーのロールとタスクをご覧ください。

Flex Start の料金

Flex Start は、リソースを必要に応じて動的にプロビジョニングする必要があり、最長 7 日間の短期間での利用が想定され、複雑な割り当て管理が必要なく、コスト効率よく使いたいワークロードにおすすめです。Flex Start は Dynamic Workload Scheduler によって動いており、料金も Dynamic Workload Scheduler に基づいたものになります。

  • vCPU、GPU、TPU が最大 53% 割引になります。
  • 従量課金制です。

始める前に

作業を始める前に、次のタスクが完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update コマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。
  • バージョン 1.33.0-gke.1712000 以降を実行している Autopilot クラスタまたは Standard クラスタがあることを確認します。
  • Flex Start の制限事項を理解していることを確認します。
  • Standard クラスタを使用する場合は、クラスタが正常に機能するように、Flex Start を有効にしていないノードプールを少なくとも 1 つ維持していることを確認します。
  • ノードのロケーションにプリエンプティブル GPU の割り当てがあることを確認します。

クラスタがない場合や、クラスタが要件を満たしていない場合は、gcloud CLI を使用して Standard リージョン クラスタを作成できます。flex-start について学習できるように、次のフラグを追加します。

--location=us-central1 \
--node-locations=us-central1-a,us-central1-b \
--machine-type=g2-standard-8

Flex Start ノードプールを作成する場合は、前述のフラグと --accelerator type=nvidia-l4,count=1 を使用します。

要件を満たす Standard クラスタがある場合は、次のセクションで、クラスタの GPU アクセラレータ タイプとマシンタイプの選択について説明します。

GPU アクセラレータ タイプを選択する

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

GPU の可用性はゾーンごとに異なります。Standard クラスタが存在するゾーンで使用可能な GPU アクセラレータ タイプを見つける必要があります。リージョン Standard クラスタがある場合、GPU アクセラレータ タイプを使用できるゾーンは、クラスタが存在するリージョン内にある必要があります。ノードプールを作成するときに、アクセラレータ タイプとノードのゾーンを指定します。クラスタのロケーションで使用できないアクセラレータ タイプを指定すると、ノードプールの作成は失敗します。

次のコマンドを実行して、クラスタのロケーションとサポートされている GPU アクセラレータ タイプを取得します。

  1. クラスタが存在するロケーションを取得します。

    gcloud container clusters list
    

    出力は次のようになります。

    NAME                LOCATION  MASTER_VERSION      MASTER_IP     MACHINE_TYPE  NODE_VERSION        NUM_NODES  STATUS   STACK_TYPE
    example-cluster-1   us-west2  1.33.2-gke.1111000  34.102.3.122  e2-medium     1.33.2-gke.1111000  9          RUNNING  IPV4
    
  2. 次のロケーションの仮想ワークステーションを除く、使用可能な GPU アクセラレータ タイプを一覧表示します。

    gcloud compute accelerator-types list | grep LOCATION_NAME | grep -v "Workstation"
    

    LOCATION_NAME は、クラスタのロケーションに置き換えます。

    たとえば、us-west2 リージョンの GPU アクセラレータ タイプのリストを取得するには、次のコマンドを実行します。

    gcloud compute accelerator-types list | grep us-west2 | grep -v "Workstation"
    

    出力は次のようになります。

    nvidia-b200            us-west2-c                 NVIDIA B200 180GB
    nvidia-tesla-p4        us-west2-c                 NVIDIA Tesla P4
    nvidia-tesla-t4        us-west2-c                 NVIDIA T4
    nvidia-tesla-p4        us-west2-b                 NVIDIA Tesla P4
    nvidia-tesla-t4        us-west2-b                 NVIDIA T4
    

互換性のあるマシンタイプを選択する

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

クラスタのロケーションで使用可能な GPU を確認したら、互換性のあるマシンタイプを特定できます。 Cloud de Confiance by S3NS は、GPU を特定のマシンシリーズに制限します。マシンタイプを見つける手順は次のとおりです。

  1. 利用可能な GPU モデルの表をご覧ください。
  2. 選択した GPU アクセラレータ タイプの行を見つけます。
  3. その行の [マシンシリーズ] 列を確認します。この列には、使用する必要があるマシンシリーズが表示されます。
  4. 指定できるマシンタイプ名を確認するには、マシンシリーズのリンクをクリックします。

唯一の例外は N1 マシンシリーズです。このシリーズでは、選択したアクセラレータ タイプで使用できる N1 マシンタイプに関する追加のガイダンスが提供されます。

アクセラレータ最適化マシンを使用する前に、マシンタイプ別の消費オプションの可用性に示すように、Flex Start プロビジョニング モードでサポートされていることを確認してください。

アクセラレータの数を決定する

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

ノードプールを作成するには、ノードプール内の各ノードに接続するアクセラレータの数を決定する必要があります。有効な値は、アクセラレータ タイプとマシンタイプによって異なります。各マシンタイプには、サポートできる GPU の数に上限があります。使用する値(デフォルトの 1 以外)を判断するには:

  1. GPU マシンタイプをご覧ください。
  2. 表で、マシンシリーズ タイプに対応するアクセラレータ タイプを探します。
  3. [GPU 数] 列の値を使用します。

Flex Start を使用してノードプールを作成する

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

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

gcloud

  1. Flex Start を使用してノードプールを作成します。

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster CLUSTER_NAME \
        --location LOCATION_NAME \
        --project PROJECT_ID \
        --accelerator type=ACCELERATOR_TYPE,count=COUNT \
        --machine-type MACHINE_TYPE \
        --max-run-duration MAX_RUN_DURATION \
        --flex-start \
        --node-locations NODE_ZONES \
        --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: ノードプールに付ける名前。
    • CLUSTER_NAME: 変更する Standard クラスタの名前。
    • LOCATION_NAME: クラスタ コントロール プレーンのコンピューティング リージョン
    • PROJECT_ID: プロジェクト ID。
    • ACCELERATOR_TYPE: インスタンスにアタッチするアクセラレータの特定のタイプ(NVIDIA T4 の場合は nvidia-tesla-t4 など)。
    • COUNT: インスタンスに接続するアクセラレータの数。デフォルト値は 1 です。
    • MACHINE_TYPE: ノードに使用するマシンのタイプ。
    • MAX_RUN_DURATION: 省略可。ノードの最大実行時間(秒)。最大実行時間はデフォルトの 7 日間です。入力する番号は s で終わる必要があります。たとえば、1 日を指定するには、「86400s」と入力します。
    • NODE_ZONES: GKE がノードプールを作成する 1 つ以上のゾーンのカンマ区切りリスト。

    このコマンドで --flex-start フラグを指定すると、gcloud は Flex Start VM を使用してノードプールを作成します。

    GKE は、指定されたアクセラレータ タイプのインスタンスを 2 つ含むノードを含むノードプールを作成します。ノードプールには最初に 0 個のノードがあり、自動スケーリングが有効になっています。

  2. ノードプールで 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 モジュールを使用します。

  1. Terraform 構成に次のブロックを追加します。
resource "google_container_node_pool" " "gpu_dws_pool" {
name = "gpu-dws-pool"

queued_provisioning {
    enabled = false
}

}
node_config {
    machine_type = "MACHINE_TYPE"
    accelerator_type = "ACCELERATOR_TYPE"
    accelerator_count = COUNT
    node_locations = ["NODE_ZONES"]
    flex_start = true
}

次のように置き換えます。

  • MACHINE_TYPE: ノードに使用するマシンのタイプ。
  • ACCELERATOR_TYPE: インスタンスにアタッチするアクセラレータの特定のタイプ(NVIDIA T4 の場合は nvidia-tesla-t4 など)。
  • COUNT: インスタンスに接続するアクセラレータの数。デフォルト値は 1 です。
  • NODE_ZONES: GKE がノードプールを作成する 1 つ以上のゾーンのカンマ区切りリスト。

Terraform によって Cloud de Confiance API が呼び出され、GPU を使用する Flex Start VM を含むノードプールを含むクラスタが作成されます。ノードプールには最初に 0 個のノードがあり、自動スケーリングが有効になっています。Terraform の詳細については、terraform.io の google_container_node_pool リソースの仕様をご覧ください。

バッチ ワークロードを実行する

このセクションでは、それぞれ 1 つの GPU を必要とする 2 つの Kubernetes Job を作成します。 Kubernetes の Job コントローラは、1 つ以上の Pod を作成し、特定のタスクが正常に実行されるようにします。

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

  2. dws-flex-start.yaml という名前のファイルを作成します。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: job-1
    spec:
      template:
        spec:
          nodeSelector:
            cloud.google.com/gke-flex-start: "true"
            cloud.google.com/gke-accelerator: ACCELERATOR_TYPE
          containers:
          - name: 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: job-2
    spec:
      template:
        spec:
          nodeSelector:
            cloud.google.com/gke-flex-start: "true"
            cloud.google.com/gke-accelerator: ACCELERATOR_TYPE
          containers:
          - name: 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 (job-1,job-2)" -o wide
    

    出力は次のようになります。

    NAME    READY   STATUS      RESTARTS   AGE   IP       NODE               NOMINATED NODE   READINESS GATES
    job-1   0/1     Completed   0          19m   10.(...) gke-flex-zonal-a2  <none>           <none>
    job-2   0/1     Completed   0          19m   10.(...) gke-flex-zonal-a2  <none>           <none>
    

クリーンアップ

このページで使用したリソースについて、 Cloud de Confiance by S3NS アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトを削除する

  1. In the Cloud de Confiance 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 (job-1,job-2)"
    
  2. ノードプールを削除します。

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

    gcloud container clusters delete CLUSTER_NAME
    

次のステップ