Autopilot に GPU ワークロードをデプロイする


このページでは、Google Kubernetes Engine(GKE)Autopilot ワークロードでハードウェア アクセラレータ(GPU)をリクエストする方法について説明します。

Autopilot には、GPU Pod を実行するための専用の Accelerator コンピューティング クラスが用意されています。このコンピューティング クラスを使用すると、GKE は GPU ノードに Pod を配置し、仮想マシン(VM)の高度な機能に Pod からアクセスできるようにします。Accelerator コンピューティング クラスを選択せずに、GPU Pod を実行することもできます。Accelerator コンピューティング クラスのメリットについて詳しくは、コンピューティング クラス別の用途をご覧ください。

料金

Autopilot の料金は、GPU ワークロードを実行するために Accelerator コンピューティング クラスをリクエストしたかどうかによって異なります。

Accelerator コンピューティング クラスを使用するかどうか 料金 GKE 機能との互換性
GPU ワークロードを実行する Compute Engine ハードウェアに加え、自動ノード管理とスケーラビリティで Autopilot プレミアムの料金が発生します。詳細については、Autopilot モードの料金をご覧ください。

以下と互換性があります。

GPU Pod のリソース リクエストに基づいて課金されます。詳細については、Kubernetes Engine の料金の「GPU Pod」をご覧ください。

以下と互換性があります。

始める前に

作業を始める前に、次のことを確認してください。

  • Google Kubernetes Engine API を有効にします。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化します。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得します。

制限事項

  • タイム シェアリング GPUマルチインスタンス GPU は、GKE バージョン 1.29.3-gke.1093000 以降の Autopilot で使用できます。
  • 使用できる GPU は、Autopilot クラスタの Google Cloud リージョンと GPU の割り当てによって異なります。リージョンまたはゾーンで利用可能な GPU モデルを確認するには、利用できる GPU のリージョンとゾーンをご覧ください。
  • NVIDIA A100(80 GB)GPU の場合、ノードにアタッチされたローカル SSD に対して、Pod がその容量を使用するかどうかにかかわらず、固定料金が発生します。
  • 1.29.2-gke.1355000 より前の GKE バージョンでは、ある Pod 用に既存の特定の GPU ノードを明示的にリクエストした場合、その Pod ではノード上のすべての GPU リソースを使用する必要があります。たとえば、既存のノードに 8 個の GPU があり、Pod のコンテナが合計 4 個の GPU をリクエストした場合、Autopilot はその Pod を拒否します。
  • GKE バージョン 1.29.2-gke.1355000 以降で、複数の GPU Pod を単一のノードに収めるには、それらの Pod の GPU リクエストの合計が、そのノードに接続されている GPU リソースの数「以下」である必要があります。たとえば、gke-accelerator-count が 4 のノードには、それぞれ 1 つの GPU をリクエストする Pod を最大 4 つまで配置できます。

単一の GPU ノードに複数の Pod を配置すると、次のような場合に役立ちます。

  • 大規模なアクセラレータ マシンタイプの容量を予約していて、単一 GPU のワークロードを実行している。このような場合、ノードごとに 1 つの Pod を展開すると、そのマシン上の他の GPU が無駄になってしまいます。
  • 同じホストで実行する必要がある GPU ワークロードがある。

このような状況では、ノード上の Pod GPU リソース リクエストの合計が、ノードに接続されている GPU の数と等しくなるように、ノード上のすべての GPU を使用することをおすすめします。

コンテナで GPU をリクエストする

コンテナの GPU リソースをリクエストするには、次のフィールドを Pod 仕様に追加します。ワークロードの要件に応じて、必要に応じて cloud.google.com/compute-class: "Accelerator" フィールドと cloud.google.com/gke-accelerator-count フィールドを省略できます。

apiVersion: v1
kind: Pod
metadata:
  name: my-gpu-pod
spec:
  nodeSelector:
    cloud.google.com/compute-class: "Accelerator"
    cloud.google.com/gke-accelerator: GPU_TYPE
    cloud.google.com/gke-accelerator-count: GPU_COUNT
  containers:
  - name: my-gpu-container
    image: nvidia/cuda:11.0.3-runtime-ubuntu20.04
    command: ["/bin/bash", "-c", "--"]
    args: ["while true; do sleep 600; done;"]
    resources:
      limits:
        nvidia.com/gpu: GPU_QUANTITY

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

  • GPU_TYPE: GPU ハードウェアのタイプ。使用できる値は次のとおりです。
    • nvidia-h100-80gb: NVIDIA H100(80 GB)(Accelerator コンピューティング クラスでのみ使用可能)
    • nvidia-a100-80gb: NVIDIA A100(80 GB)
    • nvidia-tesla-a100: NVIDIA A100(40 GB)
    • nvidia-l4: NVIDIA L4
    • nvidia-tesla-t4: NVIDIA T4
  • GPU_COUNT: ノードに接続できる GPU の合計数。GPU_QUANTITY および選択した GPU タイプでサポートされている GPU 数以上にする必要があります。この nodeSelector を省略すると、Autopilot は各 GPU ノードに 1 つの Pod を配置します。
  • GPU_QUANTITY: コンテナに割り当てる GPU の数。GPU_COUNT および選択した GPU タイプのサポートされている GPU 数以下にする必要があります。

Pod 仕様には、GPU タイプと GPU 数の両方を指定する必要があります。いずれかの値を省略すると、Autopilot によって Pod が拒否されます。

このマニフェストをデプロイすると、Autopilot によって、ノードの GKE バージョンに対応するデフォルトの NVIDIA ドライバが自動的にインストールされます。バージョン 1.29.2-gke.1108000 以降では、マニフェストに次のノードセレクタを追加することで、その GKE バージョンの最新のドライバ バージョンをインストールすることを選択できます。

spec:
  nodeSelector:
    cloud.google.com/gke-gpu-driver-version: "DRIVER_VERSION"

DRIVER_VERSION は次のいずれかの値に置き換えます。

  • default - ノードの GKE バージョンに対応するデフォルトの安定版ドライバ。マニフェストで nodeSelector を省略すると、これがデフォルトのオプションになります。
  • latest - ノードの GKE バージョンに対応する最新のドライバ バージョン。

Autopilot GPU Pod の CPU とメモリのリクエスト

GPU Pod を定義するときは、コンテナが想定どおりに機能するように、CPU リソースとメモリリソースもリクエストする必要があります。Autopilot は、GPU のタイプと数量に基づいて特定の CPU とメモリの最小数、最大数、デフォルト数を適用します。1 つのノードで複数の GPU Pod を実行する場合は、CPU とメモリを指定します。指定しないと、デフォルトでノードの容量全体が使用されます。詳細については、Autopilot のリソース リクエストをご覧ください。

Pod の仕様は、次の例のようになります。この例では、4 つの T4 GPU をリクエストします。

apiVersion: v1
kind: Pod
metadata:
  name: t4-pod
spec:
  nodeSelector:
    cloud.google.com/compute-class: "Accelerator"
    cloud.google.com/gke-accelerator: "nvidia-tesla-t4"
  containers:
  - name: t4-container-1
    image: nvidia/cuda:11.0.3-runtime-ubuntu20.04
    command: ["/bin/bash", "-c", "--"]
    args: ["while true; do sleep 600; done;"]
    resources:
      limits:
        nvidia.com/gpu: 3
        cpu: "54"
        memory: "54Gi"
      requests:
        cpu: "54"
        memory: "54Gi"
  - name: t4-container-2
    image: nvidia/cuda:11.0.3-runtime-ubuntu20.04
    command: ["/bin/bash", "-c", "--"]
    args: ["while true; do sleep 600; done;"]
    resources:
      limits:
        nvidia.com/gpu: 1
        cpu: "18"
        memory: "18Gi"
      requests:
        cpu: "18"
        memory: "18Gi"

このマニフェストでは、CPU リソースとメモリリソースに limits を指定しています。GKE バージョン 1.29.2-gke.1060000 以降では、CPU またはメモリの limits を省略すると、GKE は Pod に Burstable QoS クラスを設定し、Pod がノードのリソース リクエストの合計数に応じて未使用のリソースを利用できるようにします。詳細については、GKE で Pod バーストを構成するをご覧ください。

Autopilot GPU Pod のエフェメラル ストレージ リクエスト

有効期間が短いストレージを必要とする Pod では、エフェメラル ストレージをリクエストすることもできます。使用可能なエフェメラル ストレージの最大量と使用されるストレージ ハードウェアのタイプは、Pod がリクエストする GPU のタイプと数量によって異なります。NVIDIA L4 GPU、Accelerator コンピューティング クラスを使用し、GKE パッチ バージョン 1.28.6-gke.1369000 以降または 1.29.1-gke.1575000 以降を実行している場合は、エフェメラル ストレージにローカル SSD を使用できます。

エフェメラル ストレージにローカル SSD を使用するには、ワークロード マニフェストに cloud.google.com/gke-ephemeral-storage-local-ssd: "true" nodeSelector を追加します。ローカル SSD を使用するエフェメラル ストレージを Autopilot クラスタで使用するのマニフェストの例をご覧ください。NVIDIA H100(80 GB)GPU と NVIDIA A100(80 GB)GPU は、エフェメラル ストレージに常にローカル SSD を使用します。これらの GPU にこのノードセレクタを指定することはできません。

GPU の割り当てを確認する

デプロイされた GPU ワークロードにリクエストされた GPU があることを確認するには、次のコマンドを実行します。

kubectl describe node NODE_NAME

NODE_NAME は、Pod がスケジュールされたノードの名前に置き換えます。

出力は次のようになります。


apiVersion: v1
kind: Node
metadata:
...
  labels:
    ...
    cloud.google.com/gke-accelerator: nvidia-tesla-t4
    cloud.google.com/gke-accelerator-count: "1"
    cloud.google.com/machine-family: custom-48
    ...
...

GPU ドライバのバージョンを確認する

Autopilot クラスタでは、GKE がすべての GPU ノードに NVIDIA デバイス ドライバを自動的にインストールします。GKE がクラスタにインストールしたドライバのバージョンを確認するには、次のコマンドを実行します。

kubectl logs --label=k8s-app=nvidia-gpu-device-plugin \
    --container="nvidia-gpu-device-plugin" \
    --tail=-1 \
    --namespace=kube-system | grep Driver

出力は次のようになります。

I1206 18:37:08.251742    5851 metrics.go:144] nvml initialized successfully. Driver version: 535.104.12

Autopilot での GPU 割り当ての仕組み

Pod 内のコンテナの GPU タイプと数量をリクエストして Pod をデプロイすると、次のようになります。

  1. 割り当て可能な GPU ノードが存在しない場合、Autopilot は、新しい GPU ノードをプロビジョニングしてその Pod をスケジュールします。Autopilot は、ハードウェアを利用するために NVIDIA ドライバを自動的にインストールします。
  2. Autopilot は、GPU ノードに Node Taints を追加し、それに対応する toleration を Pod に追加します。このため、GKE は GPU ノードで他の Pod をスケジュールできなくなります。

Autopilot は、各 GPU ノードに 1 つの GPU Pod、すべてのノードで実行される GKE マネージド ワークロード、すべての Node Taints を許容するように構成された DaemonSet を配置します。

すべてのノードで DaemonSet を実行する

taint が適用されたノードでも、すべてのノードで DaemonSet の実行が必要になる場合があります。たとえば、一部のロギング エージェントとモニタリング エージェントはクラスタ内のすべてのノードで実行する必要があります。GKE がワークロードをすべてのノードに配置できるように、Node Taints を無視するように DaemonSet を構成することもできます。

クラスタ内のすべてのノード(GPU ノードを含む)で DaemonSet を実行するには、次の toleration を仕様に追加します。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: logging-agent
spec:
  tolerations:
  - key: ""
    operator: "Exists"
    effect: ""
  containers:
  - name: logging-agent-v1
    image: IMAGE_PATH

クラスタ内の特定の GPU ノードで DaemonSet を実行するには、次のものを仕様に追加します。

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: logging-agent
spec:
  nodeSelector:
    cloud.google.com/gke-accelerator: "GPU_TYPE"
  tolerations:
  - key: ""
    operator: "Exists"
    effect: ""
  containers:
  - name: logging-agent-v1
    image: IMAGE_PATH

GPU_TYPE は、ターゲット ノードの GPU のタイプに置き換えます。次のいずれか 1 つを指定できます。

  • nvidia-h100-80gb: NVIDIA H100(80 GB)(Accelerator コンピューティング クラスでのみ使用可能)
  • nvidia-a100-80gb: NVIDIA A100(80 GB)
  • nvidia-tesla-a100: NVIDIA A100(40 GB)
  • nvidia-l4: NVIDIA L4
  • nvidia-tesla-t4: NVIDIA T4

Autopilot での GPU のユースケース

Autopilot Pod のコンテナに GPU を割り当てることで、次のようなワークロードが利用できるようになります。

  • 機械学習(ML)推論
  • ML トレーニング
  • レンダリング

サポートされている GPU 数

Pod 仕様で GPU をリクエストする場合は、GPU のタイプに基づいて次の数量を使用する必要があります。

GPU の数
NVIDIA L4
nvidia-l4
1、2、4、8
NVIDIA T4
nvidia-tesla-t4
1、2、4
NVIDIA A100(40GB)
nvidia-tesla-a100
1、2、4、8、16
NVIDIA A100(80GB)
nvidia-a100-80gb
1、2、4、8
NVIDIA H100(80GB)
nvidia-h100-80gb
8

そのタイプでサポートされていない GPU 数をリクエストすると、Autopilot によって Pod が拒否されます。

GPU ノードをモニタリングする

GKE クラスタでシステム指標が有効になっている場合、Cloud Monitoring で次の指標を使用して GPU ワークロードのパフォーマンスをモニタリングできます。

  • デューティ サイクル(container/accelerator/duty_cycle): 過去のサンプル期間(10 秒)に対する、アクセラレータがアクティブに処理していた時間の割合。1~100 までの間。
  • メモリ使用量(container/accelerator/memory_used): 割り当てられたアクセラレータ メモリの量(バイト単位)。
  • メモリ容量(container/accelerator/memory_total): アクセラレータの総メモリ(バイト単位)。

事前定義されたダッシュボードを使用して、GPU ノードを使用するクラスタをモニタリングできます。詳細については、オブザーバビリティ指標を表示するをご覧ください。クラスタとそのリソースのモニタリングに関する一般的な情報については、GKE のオブザーバビリティをご覧ください。

ワークロードの使用状況の指標を表示する

ワークロードの GPU 使用状況の指標は、Google Cloud コンソールの [ワークロード] ダッシュボードで表示できます。

ワークロードの GPU 使用状況を表示するには、以下の手順に沿って操作します。

  1. Google Cloud コンソールの [ワークロード] ページに移動します。

    [ワークロード] に移動
  2. ワークロードを選択します。

[ワークロード] ダッシュボードに、GPU メモリの使用量と容量、GPU デューティ サイクルのチャートが表示されます。

NVIDIA Data Center GPU Manager(DCGM)の指標を表示する

Google Cloud Managed Service for Prometheus を使用すると、NVIDIA DCGM 指標を収集して可視化できます。Standard クラスタの場合は、NVIDIA ドライバをインストールする必要があります。Autopilot クラスタの場合、GKE によってドライバがインストールされます。

DCGM と Prometheus DCGM エクスポータをデプロイする方法については、Google Cloud Observability ドキュメントの NVIDIA Data Center GPU Manager(DCGM)をご覧ください。

次のステップ