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

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

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

料金

Autopilot で利用可能な GPU ハードウェアの料金情報については、GKE の料金ページをご覧ください。GPU は、Spot Pod でリクエストできます。

通常の Autopilot Pod 内の GPU は、確約利用割引(CUD)の対象となります。

始める前に

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

  • Google Kubernetes Engine API を有効にします。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化します。

制限事項

  • タイムシェアリング GPUマルチインスタンス GPU は、Autopilot で使用できません。
  • 使用できる GPU は、Autopilot クラスタの Google Cloud リージョンと GPU 割り当てによって異なります。
  • Pod 用に特定の既存 GPU ノードを明示的にリクエストする場合、その Pod ではノード上のすべての GPU リソースを使用する必要があります。たとえば、既存のノードに 8 個の GPU があり、Pod のコンテナが合計 4 個の GPU をリクエストした場合、Autopilot はその Pod を拒否します。

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

コンテナの GPU リソースをリクエストするには、次のフィールドを Pod 仕様に追加します。

apiVersion: v1
kind: Pod
metadata:
  name: my-gpu-pod
spec:
  nodeSelector:
    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-tesla-t4
    • nvidia-tesla-a100
  • 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/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
      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
      requests:
        cpu: "18"
        memory: "18Gi"

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 ノードに ノード taint を追加し、対応する toleration を Pod に追加します。これにより、GKE は GPU ノードで他の Pod をスケジュールできなくなります。

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

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

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

クラスタ内のすべてのノード(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 のタイプに置き換えます。nvidia-tesla-t4 または nvidia-tesla-a100 のいずれかになります。

Autopilot での GPU ユースケース

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

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

サポートされている GPU 数

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

GPU の数
NVIDIA T4
nvidia-tesla-t4
1、2、4
NVIDIA A100
nvidia-tesla-a100
1、2、4、8、16

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

GPU ノードのモニタリング

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

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

クラスタとそのリソースのモニタリングの詳細については、モニタリングをご覧ください。

使用状況の指標の表示

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

ワークロードの GPU 使用状況を表示するには、以下の手順を行います。

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

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

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

次のステップ