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


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

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

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

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 を実行して最新のバージョンを取得する。
  • バージョン 1.33.0-gke.1712000 以降を実行している Autopilot クラスタまたは Standard クラスタがあることを確認します。
  • Flex Start の制限事項を理解していることを確認します。
  • Standard クラスタを使用する場合は、クラスタが正常に機能するように、Flex Start を有効にしていないノードプールを少なくとも 1 つ維持していることを確認します。
  • ノードのロケーションにプリエンプティブル GPU の割り当てがあることを確認します。

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 PROJECT_ID \
        --accelerator type=nvidia-a100-80gb,count=2 \
        --machine-type a2-ultragpu-2g \
        --max-run-duration MAX_RUN_DURATION \
        --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: クラスタ コントロール プレーンのコンピューティング リージョン
    • PROJECT_ID: プロジェクト ID。
    • CLUSTER_NAME: 変更する Standard クラスタの名前。
    • MAX_RUN_DURATION: 省略可。ノードの最大実行時間(秒)。最大実行時間はデフォルトの 7 日間です。

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

    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 が有効になっている場合、flexStart フィールドは True に設定されます。

Terraform

GPU で Flex Start を使用するには、Terraform モジュールを使用します。

  1. Terraform 構成に次のブロックを追加します。
```hcl
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 によって Trusted Cloud API が呼び出され、GPU で Flex Start を使用するノードプールを含むクラスタが作成されます。ノードプールには最初に 0 個のノードがあり、自動スケーリングが有効になっています。Terraform の詳細については、terraform.io の google_container_node_pool リソースの仕様をご覧ください。

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

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

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

  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"
          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"
          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>
    

クリーンアップ

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

プロジェクトを削除する

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

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

    gcloud container clusters delete CLUSTER_NAME
    

次のステップ