このページでは、マルチインスタンス GPU を実行して使用率を高め、費用を削減する方法について説明します。この構成では、NVIDIA GB200、B200、H200、H100、A100、または RTX PRO 6000 グラフィック プロセッシング ユニット(GPU)をパーティショニングし、Google Kubernetes Engine(GKE)の複数のコンテナ間で単一の GPU を共有します。
このページをお読みになる前に、Pod、ノード、Deployment、Namespace などの 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 GB200(1.33.0-gke.1636000 以降)
- NVIDIA B200(180 GB)(1.32.2-gke.1586000 以降)
- NVIDIA H200(141 GB)
- NVIDIA H100(80 GB)
- NVIDIA A100(80 GB)
- NVIDIA A100(40 GB)
- NVIDIA RTX PRO 6000
- サフィックスのないパーティションの場合: 1.34.0-gke.1662000 以降
- 接尾辞付きのパーティションの場合:
- 1.35 以降: 1.35.2-gke.1842000 以降
- 1.34: 1.34.6-gke.1154000 以降
マルチインスタンス GPU のパーティション
GB200、B200、H200、H100、A100 GPU はそれぞれ 7 つのコンピューティング単位数と 8 つのメモリユニットで構成されており、さまざまなサイズの GPU インスタンスにパーティショニングできます。GPU パーティションのサイズを構成するには、[compute]g.[memory]gb という構文を使用します。たとえば、GPU パーティション サイズが 1g.5gb の場合、1 つのコンピューティング ユニット(GPU のストリーミング マルチプロセッサの 7 分の 1)と 1 つのメモリユニット(5 GB)から構成された GPU インスタンスを意味します。GPU のパーティション サイズは、Autopilot ワークロードのデプロイ時または Standard クラスタの作成時に指定できます。
NVIDIA RTX PRO 6000 の場合、GKE は、表に示されている接尾辞で指定された MIG プロファイルをサポートしています。詳細については、RTX PRO 6000 Blackwell MIG プロファイルをご覧ください。
NVIDIA マルチインスタンス GPU ユーザーガイドにあるパーティショニングの表に、GPU パーティション サイズと、各 GPU パーティションで使用可能なコンピューティング リソースとメモリリソースの量が記載されています。この表には、GPU で作成可能な各パーティション サイズで使用可能な GPU インスタンスの数も示されています。
次の表に、GKE がサポートするパーティション サイズを示します。
| パーティション サイズ | GPU インスタンス |
|---|---|
GPU: NVIDIA GB200(nvidia-gb200) |
|
1g.23gb |
7 |
1g.47gb |
4 |
2g.47gb |
3 |
3g.93gb |
2 |
4g.93gb |
1 |
7g.186gb |
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: 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 H100(80 GB)(nvidia-h100-80gb、nvidia-h100-mega-80gb) |
|
1g.10gb |
7 |
1g.20gb |
4 |
2g.20gb |
3 |
3g.40gb |
2 |
7g.80gb |
1 |
GPU: NVIDIA A100(80 GB)(nvidia-a100-80gb) |
|
1g.10gb |
7 |
2g.20gb |
3 |
3g.40gb |
2 |
7g.80gb |
1 |
GPU: NVIDIA A100(40 GB)(nvidia-tesla-a100) |
|
1g.5gb |
7 |
2g.10gb |
3 |
3g.20gb |
2 |
7g.40gb |
1 |
GPU: NVIDIA RTX PRO 6000(nvidia-rtx-pro-6000) |
|
1g.24gb |
4 |
1g.24gb.me |
1 |
1g.24gb.gfx |
4 |
1g.24gb.me.all |
1 |
1g.24gb-me |
4 |
2g.48gb |
2 |
2g.48gb.gfx |
2 |
2g.48gb.me.all |
1 |
2g.48gb-me |
2 |
4g.96gb |
1 |
4g.96gb.gfx |
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.5gb と 3g.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 を使用するには、次の作業を行います。
- マルチインスタンス GPU を有効にしてクラスタを作成する。
- ドライバを手動でインストールする。
- ノード上の GPU リソースの数を確認する。
- マルチインスタンス GPU を使用してコンテナをデプロイする。
料金
マルチインスタンス GPU は GB200、B200、H200、H100、A100、RTX PRO 6000 の各 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 つまでです。
- GPU が 1 つ未満の G4 マシンタイプでマルチインスタンス GPU を実行することはできません(プレビュー)。
始める前に
作業を始める前に、次のタスクが完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API を有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。gcloud CLI をインストール済みの場合は、
gcloud components updateコマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。
- 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 と一緒に acceleratorType と acceleratorCount を指定する必要があります。acceleratorType は以下のいずれかにする必要があります。
nvidia-gb200nvidia-b200nvidia-h200-141gbnvidia-h100-80gbnvidia-a100-80gbnvidia-tesla-a100nvidia-rtx-pro-6000
次の例では、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 が有効なクラスタを作成するには、次の例を参照してください。
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 個までデプロイできます。
次に、cuda:11.0.3-base-ubi7 コンテナを起動して、nvidia-smi でコンテナ内の GPU の UUID を出力する例を示します。この例では、7 個のコンテナがあり、各コンテナが 1 つの GPU パーティションを使用できます。この例では、1g.5gb GPU パーティションを持つノードをターゲットとする cloud.google.com/gke-gpu-partition-size ノードセレクタも設定します。
次のサンプル マニフェストを
cuda-simple.yamlとして保存します。Autopilot
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
このマニフェストの内容は次のとおりです。
-
cloud.google.com/gke-acceleratorノードセレクタを設定して、nvidia-tesla-a100GPU タイプをリクエストします。 - GPU を
1g.5gbのパーティション サイズに分割します。 -
cloud.google.com/gke-accelerator-countノードセレクタを設定して、単一の GPU をノードに接続します。
Standard
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
このマニフェストの内容は次のとおりです。
- パーティション サイズが
1g.5gbの単一の GPU をリクエストします。
-
マニフェストをクラスタに適用します。
kubectl apply -f cuda-simple.yaml7 つの 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ログを表示し、前のコマンドの任意の 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)
次のステップ
- GPU について学習する。
- GPU の時間共有を構成する方法を確認する。
- クラスタ マルチテナンシーについて学習する。
- エンタープライズ マルチテナンシーのベスト プラクティスについて学習する。