このページでは、Google Kubernetes Engine(GKE)Autopilot ワークロードにさまざまな種類と数のハードウェア アクセラレータ(GPU)をリクエストし、パフォーマンスをモニタリングする方法について説明します。
Pod でのアクセラレータの選択について
Autopilot は、GPU Pod を実行するために専用の Accelerator コンピューティング クラスを使用します。このコンピューティング クラスを使用すると、GKE は GPU ノードに Pod を配置し、仮想マシン(VM)の高度な機能に Pod からアクセスできるようにします。このクラスを GPU ワークロードで使用するには、GKE バージョンに応じて次のいずれかの操作を行います。
- バージョン 1.29.4-gke.1427000 以降: ワークロード マニフェストで GPU をリクエストします。タイムシェアリングなどの GPU 共有機能も使用できます。GKE がワークロード マニフェストを変更して Accelerator クラスのノードセレクタまたはアノテーションを追加することはありません。
- バージョン 1.29 から 1.29.4-gke.142700 まで: Pod マニフェストで
cloud.google.com/compute-class: Accelerator
ノードセレクタを指定し、GPU をリクエストします。このノードセレクタを指定すると、タイムシェアリングなどの GPU 共有機能も使用できます。 - バージョン 1.28.9-gke.1069000 からバージョン 1.29 まで: Pod マニフェストで、GPU セレクタとともに
cloud.google.com/compute-class: Accelerator
ノードセレクタを指定します。このノードセレクタを指定すると、タイムシェアリングなどの GPU 共有機能も使用できます。
Accelerator コンピューティング クラスは、1.28.9-gke.1069000 より前のバージョンではサポートされていません。代わりに、これらのバージョンの GPU Pod は他の Autopilot Pod と同様に扱われ、リソース リクエストに対して料金が請求されます。詳細については、料金をご覧ください。
GKE 機能との互換性
次の表に、GKE Autopilot でアクセラレータを選択する各メソッドで使用できる GKE 機能を示します。
Accelerator コンピューティング クラスを選択済み |
GKE 機能との互換性 |
---|---|
|
|
|
料金
次の表に、GKE で使用される課金モデルがクラスタの GKE バージョンに依存する仕組みを示します。GKE Autopilot の課金モデルの詳細については、Autopilot の料金をご覧ください。
GKE バージョン | 料金 |
---|---|
1.29.4-gke.1427000 以降 | ノードベースの課金モデル。すべての GPU Pod は Accelerator コンピューティング クラスを使用します。GPU ワークロードを実行する Compute Engine ハードウェアに加え、ノード管理とスケーラビリティに対して Autopilot プレミアムの料金が発生します。詳細については、Autopilot モードの料金をご覧ください。 |
バージョン 1.29 から 1.29.4-gke.1427000 より前までのバージョン | 課金モデルは、次のように指定したノードセレクタによって異なります。
マルチインスタンス GPU やタイムシェアリングなどの機能は、 詳細については、Kubernetes Engine の料金の「特定のハードウェア要件がある Pod」をご覧ください。 |
バージョン 1.28.6-gke.1095000 から 1.29 より前までのバージョン | Pod のマニフェストで Accelerator コンピューティング クラスを指定しているかどうかにかかわらず、ノードベースの課金モデルを使用します。 マルチインスタンス GPU やタイムシェアリングなどの機能は、 詳細については、Kubernetes Engine の料金の「特定のハードウェア要件がある Pod」をご覧ください。 |
1.28.6-gke.1095000 より前のバージョン | Pod ベースの課金モデル。GPU Pod のリソース リクエストに基づいて課金されます。詳細については、Kubernetes Engine の料金の「特定のハードウェア要件がある Pod」をご覧ください。 |
準備
作業を始める前に、次のことを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components update
を実行して最新のバージョンを取得する。
次のいずれかのバージョンを実行している GKE Autopilot クラスタがあることを確認します。
- Accelerator コンピューティング クラス: 1.28.6-gke.1095000 以降の 1.28 の任意のパッチ バージョン
- NVIDIA H100 Mega(80 GB)GPU: 1.28.9-gke.1250000 以降、1.29.4-gke.1542000 以降
- NVIDIA H100(80 GB)GPU: 1.28.6-gke.1369000 以降、1.29.1-gke.1575000 以降
- VM あたり複数の GPU Pod: 1.29.2-gke.1355000 以降
コンピューティング クラスの選択なし:
- NVIDIA L4 GPU: 1.28.3-gke.1203000 以降
- NVIDIA A100(80 GB)GPU: 1.27 以降
- Accelerator コンピューティング クラス: 1.28.6-gke.1095000 以降の 1.28 の任意のパッチ バージョン
プロジェクトで使用できる GPU 割り当てが十分にあることを確認します。各リージョンに作成する GPU モデルに十分な Compute Engine GPU 割り当てが必要です。追加の GPU 割り当てが必要な場合は、GPU 割り当てをリクエストします。
制限事項
- タイム シェアリング 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/gke-accelerator-count
セレクタを省略できます。
apiVersion: v1
kind: Pod
metadata:
name: my-gpu-pod
spec:
nodeSelector:
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-mega-80gb
: NVIDIA H100 Mega(80 GB)nvidia-h100-80gb
: NVIDIA H100(80 GB)nvidia-a100-80gb
: NVIDIA A100(80 GB)nvidia-tesla-a100
: NVIDIA A100(40 GB)nvidia-l4
: NVIDIA L4nvidia-tesla-t4
: NVIDIA T4
GPU_COUNT
: ノードに接続できる GPU の合計数。GPU_QUANTITY
および選択した GPU タイプでサポートされている GPU 数以上にする必要があります。この nodeSelector を省略すると、Autopilot によって各 GPU ノードに 1 つの Pod が配置されます。GPU_QUANTITY
: コンテナに割り当てる GPU の数。GPU_COUNT
および選択した GPU タイプのサポートされている GPU 数以下にする必要があります。
Autopilot モードでのアクセラレータの使用料金の詳細については、料金セクションをご覧ください。
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/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、Accelerato コンピューティング クラスを使用し、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 --selector=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 をデプロイすると、次のようになります。
- 割り当て可能な GPU ノードが存在しない場合、Autopilot は、新しい GPU ノードをプロビジョニングしてその Pod をスケジュールします。Autopilot は、ハードウェアを利用するために NVIDIA ドライバを自動的にインストールします。
- Autopilot は、GPU ノードに Node Taints を追加し、それに対応する toleration を Pod に追加します。このため、GKE は GPU ノードで他の Pod をスケジュールできなくなります。
Autopilot は、各 GPU ノードに 1 つの GPU Pod、すべてのノードで実行される GKE マネージド ワークロード、すべての Node Taints を許容するように構成された 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-h100-mega-80gb
: NVIDIA H100 Mega(80 GB)nvidia-h100-80gb
: NVIDIA H100(80 GB)nvidia-a100-80gb
: NVIDIA A100(80 GB)nvidia-tesla-a100
: NVIDIA A100(40 GB)nvidia-l4
: NVIDIA L4nvidia-tesla-t4
: NVIDIA T4
Autopilot での GPU のユースケース
Autopilot Pod のコンテナに GPU を割り当てることで、次のようなワークロードが容易になります。
- 機械学習(ML)推論
- ML トレーニング
- レンダリング
サポートされている GPU 数
Pod 仕様で GPU をリクエストする場合は、GPU のタイプに基づいて次の数量を使用する必要があります。
GPU の数 | |
---|---|
NVIDIA L4nvidia-l4 |
1、2、4、8 |
NVIDIA T4nvidia-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 |
NVIDIA H100 Mega(80 GB)nvidia-h100-mega-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 使用状況を表示するには、以下の手順に沿って操作します。
Google Cloud コンソールの [ワークロード] ページに移動します。
[ワークロード] に移動- ワークロードを選択します。
[ワークロード] ダッシュボードに、GPU メモリの使用量と容量、GPU デューティ サイクルのチャートが表示されます。
NVIDIA Data Center GPU Manager(DCGM)の指標を表示する
Google Cloud Managed Service for Prometheus を使用すると、NVIDIA DCGM 指標を収集して可視化できます。Autopilot クラスタの場合、GKE によってドライバがインストールされます。Standard クラスタの場合は、NVIDIA ドライバをインストールする必要があります。
GKE で管理されている DCGM パッケージをデプロイする方法については、NVIDIA Data Center GPU Manager(DCGM)の指標の収集と表示をご覧ください。
次のステップ
- GKE での GPU サポートの詳細を確認する。
- 特殊なユースケースに合わせて Autopilot のコンピューティング クラスを最適化する方法を確認する。
- Dynamic Workload Scheduler を使用してバッチ ワークロード用の GPU をデプロイする方法を確認する。