このドキュメントでは、マルチインスタンス GPU を実行して使用率を高め、費用を削減する方法について説明します。この構成では、NVIDIA A100 または H100 グラフィック プロセッシング ユニット(GPU)をパーティショニングし、Google Kubernetes Engine(GKE)の複数のコンテナ間で単一の GPU を共有します。
このドキュメントをお読みになる前に、Pod、ノード、デプロイ、名前空間などの 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 、nvidia-h100-mega-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.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 は 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
と一緒に acceleratorType
と acceleratorCount
を指定する必要があります。acceleratorType
は、nvidia-tesla-a100
、nvidia-a100-80gb
、nvidia-h100-80gb
のいずれかにする必要があります。
次の例では、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 \
--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
を省略すると、これがデフォルトのオプションになります。
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
ノードセレクタも設定します。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 をリクエストします。
-
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
ログを表示し、前のコマンドの任意の 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 の時間共有を構成する方法を確認する。
- クラスタ マルチテナンシーについて学習する。
- エンタープライズ マルチテナンシーのベスト プラクティスについて学習する。