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 のリージョンとゾーンをご覧ください。
  • Pod 用に既存の特定の GPU ノードを明示的にリクエストする場合、その Pod ではノード上のすべての GPU リソースを使用する必要があります。たとえば、既存のノードに 8 個の GPU があり、Pod のコンテナが合計 4 個の GPU をリクエストした場合、Autopilot はその Pod を拒否します。
  • NVIDIA A100(80 GB)GPU の場合、ノードにアタッチされたローカル SSD に対して、Pod がその容量を使用するかどうかにかかわらず、固定料金が発生します。

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

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

apiVersion: v1
kind: Pod
metadata:
  name: my-gpu-pod
spec:
  nodeSelector:
    cloud.google.com/compute-class: "Accelerator"
    cloud.google.com/gke-accelerator: GPU_TYPE
  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_QUANTITY: コンテナに割り当てる GPU の数。選択した GPU タイプに応じて、サポートされている GPU 数を指定する必要があります。

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

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

GPU Pod を定義するときは、コンテナが想定どおりに機能するように、CPU リソースとメモリリソースもリクエストする必要があります。Autopilot は、GPU のタイプと数量に基づいて特定の 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"

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
    ...
...

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 デューティ サイクルのチャートが表示されます。

次のステップ