マルチインスタンス GPU を実行する


このページでは、マルチインスタンス GPU を実行して使用率を高め、費用を削減する方法について説明します。この構成では、NVIDIA A100、H100、H200、または B200 画像処理装置(GPU)をパーティショニングし、Google Kubernetes Engine(GKE)の複数のコンテナ間で単一の GPU を共有します。

このページをお読みになる前に、PodノードDeploymentNamespace などの Kubernetes のコンセプトと、ノードプール自動スケーリング自動プロビジョニングなどの GKE のコンセプトを理解していることを確認してください。

はじめに

コンテナのワークロードで一部の GPU しか必要としない場合でも、Kubernetes はコンテナごとに 1 つのフル GPU を割り当てます。このため、特に、最新世代の高性能な GPU を使用している場合などは、リソースの無駄やコスト超過が発生する可能性があります。GPU 使用率を向上させるには、マルチインスタンス GPU を使用します。サポートされる 1 つの GPU は最大 7 つのスライスに分割できます。各スライスはノード上の 1 つのコンテナに個別に割り当てることができるので、1 つの GPU を最大 7 つのコンテナで共有できます。マルチインスタンス GPU を使用すると、ワークロード間でハードウェアを分離し、GPU で実行中のすべてのコンテナに予測可能で一貫性のある QoS を提供できます。

CUDA® アプリケーションの場合、マルチインスタンス GPU を意識する必要はほとんどありません。各 GPU パーティションは通常の GPU リソースとして表示されるので、プログラミング モデルに変わりはありません。

マルチインスタンス GPU の詳細については、NVIDIA マルチインスタンス GPU のユーザーガイドをご覧ください。

サポートされている GPU

マルチインスタンス GPU をサポートする GPU タイプは、次のとおりです。

  • NVIDIA A100(40 GB)
  • NVIDIA A100(80 GB)
  • NVIDIA H100(80 GB)
  • NVIDIA H200(141 GB)
  • NVIDIA B200(180 GB)(1.32.2-gke.1586000 以降)

マルチインスタンス GPU のパーティション

A100、H100、H200、B200 GPU はそれぞれ 7 つのコンピューティング ユニットと 8 つのメモリユニットで構成されており、さまざまなサイズの GPU インスタンスにパーティショニングできます。GPU パーティションのサイズを構成するには、[compute]g.[memory]gb という構文を使用します。たとえば、GPU パーティション サイズが 1g.5gb の場合、1 つのコンピューティング ユニット(GPU のストリーミング マルチプロセッサの 7 分の 1)と 1 つのメモリユニット(5 GB)から構成された GPU インスタンスを意味します。GPU のパーティション サイズは、Autopilot ワークロードのデプロイ時または Standard クラスタの作成時に指定できます。

NVIDIA マルチインスタンス GPU ユーザーガイドにあるパーティショニングの表に、GPU パーティション サイズと、各 GPU パーティションで使用可能なコンピューティング リソースとメモリリソースの量が記載されています。この表には、GPU で作成可能な各パーティション サイズで使用可能な GPU インスタンスの数も示されています。

次の表に、GKE がサポートするパーティション サイズを示します。

パーティション サイズ GPU インスタンス
GPU: NVIDIA A100(40 GB)(nvidia-tesla-a100
1g.5gb 7
2g.10gb 3
3g.20gb 2
7g.40gb 1
GPU: NVIDIA A100(80 GB)(nvidia-a100-80gb
1g.10gb 7
2g.20gb 3
3g.40gb 2
7g.80gb 1
GPU: NVIDIA H100(80 GB)(nvidia-h100-80gbnvidia-h100-mega-80gb
1g.10gb 7
1g.20gb 4
2g.20gb 3
3g.40gb 2
7g.80gb 1
GPU: NVIDIA H200(141GB)(nvidia-h200-141gb
1g.18gb 7
1g.35gb 4
2g.35gb 3
3g.71gb 2
4g.71gb 1
7g.141gb 1
GPU: NVIDIA B200(nvidia-b200
1g.23gb 7
1g.45gb 4
2g.45gb 3
3g.90gb 2
4g.90gb 1
7g.180gb 1

ノードプール内の各ノードの GPU は同じ方法でパーティション分割されます。たとえば、ノードプールに 2 つのノードが存在し、各ノードに 4 つの GPU が割り当てられ、パーティション サイズが 1g.5gb とします。GKE は、各 GPU にサイズが 1g.5gb のパーティションを 7 個作成します。各ノードに 4 つの GPU があるため、各ノードで使用可能な 1g.5gb GPU パーティションは 28 個になります。このノードプールにはノードが 2 つあるため、ノードプール全体では合計で 56 個の 1g.5gb GPU パーティションを使用できます。

複数の GPU パーティション タイプを持つ GKE Standard クラスタを作成する場合は、複数のノードプールを作成する必要があります。たとえば、1 つのクラスタ内で GPU パーティションが 1g.5gb3g.20gb のノードがそれぞれ必要な場合は、2 つのノードプールを作成して、1 つのプールの GPU パーティション サイズを 1g.5gb に、もう 1 つのプールは 3g.20gb に設定します。

GKE Autopilot クラスタは、異なるパーティション サイズを必要とするワークロードを作成すると、自動的に正しいパーティション構成でノードを作成します。

各ノードには、そのノードで使用可能な GPU パーティション サイズのラベルが設定されます。これにより、ワークロードは必要な GPU パーティション サイズのノードをターゲットにできます。たとえば、1g.5gb GPU インスタンスのあるノードには、次のようなラベルが設定されます。

cloud.google.com/gke-gpu-partition-size=1g.5gb

仕組み

マルチインスタンス GPU を使用するには、次の作業を行います。

  1. マルチインスタンス GPU を有効にしてクラスタを作成する
  2. ドライバを手動でインストールする
  3. ノード上の GPU リソースの数を確認する
  4. マルチインスタンス GPU を使用してコンテナをデプロイする

料金

マルチインスタンス GPU は A100 GPU、H100 GPU、H200 GPU、B200 GPU 専用です。ワークロードの実行に使用される他のプロダクトに加えて、対応する GPU の料金が適用されます。GPU 全体をクラスタ内のノードに接続し、パーティショニングできます。GPU の料金情報については、GPU の料金ページをご覧ください。

制限事項

  • GKE で、信頼性の低いワークロードにマルチインスタンス GPU パーティションを使用することはおすすめしません。
  • GPU パーティションの自動スケーリングと自動プロビジョニングは、GKE バージョン 1.20.7-gke.400 以降で完全にサポートされています。それ以前のバージョンでは、ワークロードに必要な特定の GPU パーティション サイズに基づいて自動スケーリングを行うには、ノードプールに 1 つ以上のノードが存在している必要があります。
  • マルチインスタンス GPU では、GPU 使用率の指標(duty_cycle など)は使用できません。
  • マルチインスタンスでは、物理 GPU が個別のインスタンスに分割されます。各インスタンスは、ハードウェア レベルで他のインスタンスから分離されます。マルチインスタンス GPU のインスタンスを使うコンテナでは、そのインスタンスで利用可能な CPU とメモリリソースのみにアクセスできます。
  • 1 つの Pod で使用できるマルチインスタンス GPU インスタンスは 1 つまでです。

始める前に

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

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。
  • Autopilot では、GKE バージョン 1.29.3-gke.1093000 以降でマルチインスタンス GPU がサポートされています。
  • 十分な量の NVIDIA A100 GPU 割り当てが必要です。割り当ての増加をリクエストするをご覧ください。
  • Autopilot でマルチインスタンス GPU を使用する場合は、Autopilot で GPU を使用する方法について、Autopilot に GPU ワークロードをデプロイするをご覧ください。
  • GKE は、Autopilot クラスタ内のすべてのマルチインスタンス GPU ワークロードに Accelerator コンピューティング クラスを割り当てます。

マルチインスタンス GPU を使用するクラスタを作成する

GKE Standard を使用する場合は、クラスタでマルチインスタンス GPU を有効にする必要があります。バージョン 1.29.3-gke.1093000 以降を実行する Autopilot クラスタでは、マルチインスタンス GPU がデフォルトで有効になります。Autopilot でマルチインスタンス GPU を使用するには、このページのマルチインスタンス GPU を使用してコンテナをデプロイするをご覧ください。

マルチインスタンス GPU を使用する Standard クラスタを作成する場合は、gpuPartitionSize と一緒に acceleratorTypeacceleratorCount を指定する必要があります。acceleratorType は、nvidia-tesla-a100nvidia-a100-80gbnvidia-h100-80gbnvidia-h200-141gbnvidia-b200 のいずれかにする必要があります。

次の例では、1 つのノードを含む GKE クラスタを作成し、そのノードに 1g.5gb サイズの GPU パーティションを 7 つ設定します。このページの他の手順では GPU パーティション サイズ 1g.5gb を使用します(各 GPU に 7 つのパーティションを作成します)。前述のサポート対象の GPU パーティション サイズを使用することもできます。

Google Cloud CLI または Terraform を使用できます。

gcloud

マルチインスタンス GPU が有効なクラスタを作成するには:

gcloud container clusters create CLUSTER_NAME  \
    --project=PROJECT_ID  \
    --location CONTROL_PLANE_LOCATION  \
    --cluster-version=CLUSTER_VERSION  \
    --accelerator type=nvidia-tesla-a100,count=1,gpu-partition-size=1g.5gb,gpu-driver-version=DRIVER_VERSION  \
    --machine-type=a2-highgpu-1g  \
    --num-nodes=1

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

  • CLUSTER_NAME: 新しいクラスタの名前。
  • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
  • CONTROL_PLANE_LOCATION: クラスタのコントロール プレーンの Compute Engine のロケーション。リージョン クラスタの場合はリージョン、ゾーンクラスタの場合はゾーンを指定します。
  • CLUSTER_VERSION: バージョンは 1.19.7-gke.2503 以降にする必要があります。
  • DRIVER_VERSION: インストールする NVIDIA ドライバのバージョン。次のいずれか 1 つを指定できます。
    • default: GKE バージョンのデフォルトのドライバ バージョンをインストールします。
    • latest: お使いの GKE バージョン向けの最新のドライバ バージョンをインストールします。Container-Optimized OS を使用するノードでのみ使用できます。
    • disabled: ドライバの自動インストールをスキップします。クラスタの作成後に、ドライバを手動でインストールする必要がありますgpu-driver-version を省略すると、これがデフォルトのオプションになります。

Terraform

Terraform を使用してマルチインスタンス GPU が有効なクラスタを作成するには、次の例を参照してください。

resource "google_container_cluster" "default" {
  name               = "gke-standard-zonal-gpu"
  location           = "us-central1-a"
  initial_node_count = 1

  node_config {
    guest_accelerator {
      type  = "nvidia-tesla-t4"
      count = 1
      gpu_driver_installation_config {
        gpu_driver_version = "LATEST"
      }
    }
    machine_type = "n1-standard-2"
  }
}

Terraform の使用方法の詳細については、GKE での Terraform のサポートをご覧ください。

クラスタに接続する

新しく作成したクラスタに接続するように kubectl を構成します。

gcloud container clusters get-credentials CLUSTER_NAME

ドライバをインストールする

クラスタの作成時に自動ドライバ インストールを無効にする場合や、1.27.2-gke.1200 よりも前のバージョンの GKE を実行している場合は、作成完了後に互換性のある NVIDIA ドライバを手動でインストールする必要があります。マルチインスタンス GPU を使用するには、バージョン 450.80.02 以降の NVIDIA ドライバが必要です。

ドライバのインストール後、マルチインスタンス GPU モードが有効になります。ドライバを自動的にインストールした場合は、GPU デバイス プラグインが GPU パーティションの作成を開始すると、ノードが再起動されます。ドライバを手動でインストールした場合、ドライバのインストールが完了するとノードが再起動されます。再起動が完了するまで数分かかることがあります。

ノード上の GPU リソースの数を確認する

次のコマンドを実行し、nvidia.com/gpu リソースの容量と割り当て可能な数が 7 であることを確認します。

kubectl describe nodes

コマンドの出力は次のとおりです。

...
Capacity:
  ...
  nvidia.com/gpu:             7
Allocatable:
  ...
  nvidia.com/gpu:             7

マルチインスタンス GPU を使用してコンテナをデプロイする

ノード上のマルチインスタンス GPU デバイスごとに 1 つのコンテナをデプロイできます。この例では、パーティション サイズが 1g.5gb で、ノードで 7 つのマルチインスタンス GPU パーティションを使用できます。このノードには、GPU を使用するコンテナを最大 7 個までデプロイできます。

  1. 次に、cuda:11.0.3-base-ubi7 コンテナを起動して、nvidia-smi でコンテナ内の GPU の UUID を出力する例を示します。この例では、7 個のコンテナがあり、各コンテナが 1 つの GPU パーティションを使用できます。この例では、1g.5gb GPU パーティションを持つノードをターゲットとする cloud.google.com/gke-gpu-partition-size ノードセレクタも設定します。

    Autopilot

    kubectl apply -f -  <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cuda-simple
    spec:
      replicas: 7
      selector:
        matchLabels:
          app: cuda-simple
      template:
        metadata:
          labels:
            app: cuda-simple
        spec:
          nodeSelector:
            cloud.google.com/gke-gpu-partition-size: 1g.5gb
            cloud.google.com/gke-accelerator: nvidia-tesla-a100
            cloud.google.com/gke-accelerator-count: "1"
          containers:
          - name: cuda-simple
            image: nvidia/cuda:11.0.3-base-ubi7
            command:
            - bash
            - -c
            - |
              /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
            resources:
              limits:
                nvidia.com/gpu: 1
    EOF
          

    このマニフェストの内容は次のとおりです。

    • cloud.google.com/gke-accelerator ノードセレクタを設定して、nvidia-tesla-a100 GPU タイプをリクエストします。
    • GPU を 1g.5gb のパーティション サイズに分割します。
    • cloud.google.com/gke-accelerator-count ノードセレクタを設定して、単一の GPU をノードに接続します。

    Standard

    kubectl apply -f -  <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cuda-simple
    spec:
      replicas: 7
      selector:
        matchLabels:
          app: cuda-simple
      template:
        metadata:
          labels:
            app: cuda-simple
        spec:
          nodeSelector:
            cloud.google.com/gke-gpu-partition-size: 1g.5gb
          containers:
          - name: cuda-simple
            image: nvidia/cuda:11.0.3-base-ubi7
            command:
            - bash
            - -c
            - |
              /usr/local/nvidia/bin/nvidia-smi -L; sleep 300
            resources:
              limits:
                nvidia.com/gpu: 1
    EOF
          

    このマニフェストの内容は次のとおりです。

    • パーティション サイズが 1g.5gb の単一の GPU をリクエストします。
  2. 7 つの Pod すべてが稼働していることを確認します。

    kubectl get pods
    

    コマンドの出力は次のとおりです。

    NAME                           READY   STATUS    RESTARTS   AGE
    cuda-simple-849c47f6f6-4twr2   1/1     Running   0          7s
    cuda-simple-849c47f6f6-8cjrb   1/1     Running   0          7s
    cuda-simple-849c47f6f6-cfp2s   1/1     Running   0          7s
    cuda-simple-849c47f6f6-dts6g   1/1     Running   0          7s
    cuda-simple-849c47f6f6-fk2bs   1/1     Running   0          7s
    cuda-simple-849c47f6f6-kcv52   1/1     Running   0          7s
    cuda-simple-849c47f6f6-pjljc   1/1     Running   0          7s
    
  3. ログを表示し、前のコマンドの任意の Pod 名を使用して GPU UUID を確認します。

    kubectl logs cuda-simple-849c47f6f6-4twr2
    

    コマンドの出力は次のとおりです。

    GPU 0: A100-SXM4-40GB (UUID: GPU-45eafa61-be49-c331-f8a2-282736687ab1)
      MIG 1g.5gb Device 0: (UUID: MIG-GPU-45eafa61-be49-c331-f8a2-282736687ab1/11/0)
    

次のステップ