マルチインスタンス GPU の実行


このページでは、NVIDIA A100 または H100 グラフィック プロセッシング ユニット(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)

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

A100 GPU と H100 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-80gb
1g.10gb 7
1g.20gb 4
2g.20gb 3
3g.40gb 2
7g.80gb 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 専用です。ワークロードの実行に使用される他のプロダクトに加えて、対応する 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-80gb のいずれかにする必要があります。

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

  1. Google Cloud CLI を使用してマルチインスタンス GPU を有効にしたクラスタを作成するには、次のコマンドを実行します。

    gcloud container clusters create CLUSTER_NAME  \
        --project=PROJECT_ID  \
        --zone ZONE  \
        --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。
    • ZONE: クラスタ コントロール プレーンのコンピューティング ゾーン
    • CLUSTER_VERSION: バージョンは 1.19.7-gke.2503 以降にする必要があります。
    • DRIVER_VERSION: インストールする NVIDIA ドライバのバージョン。次のいずれか 1 つを指定できます。
      • default: GKE バージョンのデフォルトのドライバ バージョンをインストールします。
      • latest: お使いの GKE バージョン向けの最新のドライバ バージョンをインストールします。Container-Optimized OS を使用するノードでのみ使用できます。
      • disabled: ドライバの自動インストールをスキップします。クラスタの作成後に、ドライバを手動でインストールする必要がありますgpu-driver-version を省略すると、これがデフォルトのオプションになります。
  2. 新しく作成したクラスタに接続するように 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

          cat <<EOF | kubectl apply -f -
          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

          cat <<EOF | kubectl apply -f -
          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)
    

次のステップ