このページでは、Google Kubernetes Engine(GKE)クラスタのノードで NVIDIA® グラフィックス プロセシング ユニット(GPU)ハードウェア アクセラレータを使用する方法を説明します。
概要
GKE では、NVIDIA Tesla® GPU(K80、P100、P4、V100、T4、A100)を装備したノードプールを作成できます。GPU は、画像認識や自然言語処理のほか、動画のコード変換や画像処理などの多くのコンピューティング処理を必要とするタスクなど、ディープ ラーニング タスクを稼働させるための計算能力を提供します。
ワークロードが頻繁なノード中断を許容できるのであれば、GPU を Spot VM で使用することもできます。Spot VM を使用することで、GPU 実行時の料金を下げることができます。詳細については、GPU ノードプールで Spot VM を使用するをご覧ください。
要件
GKE 上の GPU には、以下の要件があります。
- Kubernetes バージョン: Container-Optimized OS ノードイメージを使用するノードプールの場合、GPU ノードは GKE バージョン 1.9 以降で使用できます。Ubuntu ノードイメージを使用するノードプールの場合、GPU ノードは GKE バージョン 1.11.3 以降で使用できます。
GPU の割り当て: GPU ノードを作成する前に、目的のゾーンに Compute Engine GPU の割り当てが必要です。プロジェクトに十分な GPU 割り当てがあるかどうか確認するには、Google Cloud コンソールで割り当てをご覧ください。
追加の GPU 割り当てが必要な場合は、Cloud コンソールで GPU 割り当てをリクエストする必要があります。請求先アカウントが設定されている場合は、割り当てリクエストを送信すると、プロジェクトに自動的に割り当てが設定されます。
NVIDIA GPU ドライバ: NVIDIA GPU ドライバをノードに手動でインストールする必要があります。このページの下部では、ドライバのインストール方法について説明します。
A100 GPU: A100 GPU は a2 マシンタイプでのみサポートされており、GKE バージョン 1.18.6-gke.3504 以降が必要です。
制限事項
GPU を GKE で使用する前に、以下の制限事項に留意してください。
- 既存のノードプールに GPU を追加することはできません。
- メンテナンス イベント中に GPU ノードをライブ移行することはできません。
- 使用可能な GPU タイプは、次のようにマシンシリーズによって異なります。
- A2 マシンシリーズ: A100 GPU。
- N1 マシンシリーズ: A100 を除くすべての GPU。
- GPU は Windows Server ノードプールでサポートされていません。
可用性
GPU は特定のリージョンとゾーンで利用できます。GPU 割り当てをリクエストするときは、クラスタを実行するリージョンについて考慮してください。
適用可能なリージョンとゾーンの完全なリストについては、Compute Engine の GPU をご覧ください。
Google Cloud CLI を使用して、ゾーンで使用できる GPU を確認することもできます。各ゾーンでサポートされているすべての GPU アクセラレータ タイプのリストを表示するには、次のコマンドを実行します。
gcloud compute accelerator-types list
料金
GPU の料金情報については、Google Cloud GPU ページの料金表をご覧ください。
GPU 割り当て
GPU 割り当てとは、Google Cloud プロジェクトで実行できる GPU の合計数です。GPU を搭載したクラスタを作成するには、プロジェクトに十分な GPU 割り当てが必要です。
GPU 割り当ては、クラスタで実行する GPU の総数以上である必要があります。クラスタの自動スケーリングを有効にする場合は、クラスタの最大ノード数にノードあたりの GPU 数を掛けた数以上の GPU 割り当てをリクエストする必要があります。
たとえば、3 つのノードを持つクラスタを作成してノードごとに 2 つの GPU を実行する場合、少なくとも 6 つの GPU 割り当てがプロジェクトに必要です。
GPU 割り当てのリクエスト
GPU 割り当てをリクエストするには、Cloud コンソールを使用します。割り当てのリクエストについて詳しくは、Compute Engine ドキュメントの追加の割り当てをリクエストするをご覧ください。
GPU 割り当ての検索
GPU 割り当てを検索するには、Cloud コンソールで次の手順を行います。
Cloud コンソールの [IAM と管理] の [割り当て] ページに移動します。
[指標] プルダウン メニューで [なし] をクリックし、検索フィールドに「gpus」と入力します。
検索結果から、目的の GPU を選択します。
[指標] プルダウン メニューを閉じます。
割り当てリクエストを送信する
割り当てリクエストを送信するには、Cloud コンソールで次の手順を行います。
- GPU 割り当ての一覧から、
us-central1
など、必要とするリージョンの割り当てを選択します。 - [割り当てを編集] をクリックします。リクエスト フォームが Cloud コンソールの右側に表示されます。
- 各割り当てリクエストの [新しい割り当て上限] フィールドを入力します。
- [リクエストの説明] フィールドに、リクエストの詳細を入力します。
- [完了] をクリックします。
- [リクエストを送信] をクリックします。
GPU の実行
次のセクションでは、GPU を GKE クラスタで実行する方法について説明します。
自動スケーリング GPU ノードプールの作成
GKE 上の GPU の最良で最もコスト効率の良いメリットを享受し、クラスタ自動スケーリングを活用するには、クラスタ内に別々の GPU ノードプールを作成することをおすすめします。
すでに非 GPU ノードプールを実行している既存のクラスタに GPU ノードプールを追加すると、GKE が自動的に次のノード taint を使用して GPU ノードを taint します。
- キー:
nvidia.com/gpu
- 効果:
NoSchedule
加えて、GKE は、ExtendedResourceToleration アドミッション コントローラを実行することにより、GPU をリクエストしている Pod に対応する容認できる範囲を自動的に適用します。
これにより、GPU を要求しているポッドのみが GPU ノードでスケジュールされ、より効率的な自動スケーリングが可能になります。GPU を要求しているポッドが不足している場合は、GPU ノードを簡単に縮小できます。
Cloud コンソールまたは Google Cloud CLI を使用して、既存のクラスタに GPU ノードプールを作成します。
gcloud
GPU を搭載したノードプールを作成するには、次のコマンドを実行します。
gcloud container node-pools create POOL_NAME \
--accelerator type=GPU_TYPE,count=AMOUNT \
--zone COMPUTE_ZONE --cluster CLUSTER_NAME \
[--num-nodes 3 --min-nodes 0 --max-nodes 5 --enable-autoscaling
--machine-type a2-highgpu-1g]
次のように置き換えます。
POOL_NAME
: ノードプールに付ける名前。GPU_TYPE
: GPU タイプ(nvidia-tesla-k80
、nvidia-tesla-p100
、nvidia-tesla-p4
、nvidia-tesla-v100
、nvidia-tesla-t4
、nvidia-tesla-a100
)。AMOUNT
: ノードプール内のノードに接続する GPU の数。COMPUTE_ZONE
: ノードグループを作成するコンピューティング ゾーン(us-central1-c
など)。クラスタは、指定されたゾーンですでに動作している必要があります。CLUSTER_NAME
: ノードプールを作成するクラスタの名前。
その他のオプションは次のとおりです。
--num-nodes
は、作成するノードの初期数を指定します。--min-nodes
は、任意の時点で実行されるノード数の下限を指定します。--max-nodes
は、実行できるノード数の上限を指定します。--enable-autoscaling
を使用すると、ワークロードの需要が変化したときにノードプールを自動スケーリングできるようになります。--machine-type
は、ノードのマシンタイプを指定します。nvidia-tesla-a100
GPU に必要です。GPU は a2 マシンタイプでのみ実行できます。
たとえば、次のコマンドは、クラスタ p100-cluster
内に 2 つの P100 GPU を使用する自動スケーリング ノードプール p100
を作成します。
gcloud container node-pools create p100 \
--accelerator type=nvidia-tesla-p100,count=2 \
--zone us-central1-c --cluster p100-cluster \
--num-nodes 3 --min-nodes 0 --max-nodes 5 --enable-autoscaling
Console
GPU を使用するノードプールを作成するには:
Cloud コンソールで Google Kubernetes Engine のページに移動します。
クラスタのリストで、変更するクラスタの名前をクリックします。
[add_box ノードプールを追加] をクリックします。
必要に応じて、[ノードプールの詳細] ページで [自動スケーリングを有効にする] チェックボックスをオンにします。
必要に応じてノードプールを構成します。
ナビゲーション パネルで [ノード] を選択します。
[マシン ファミリー] で [GPU] をクリックします。
各ノードで実行する [GPU のタイプ] と [GPU の数] を選択します。
警告を読み、[制限について理解しています] を選択します。
必要に応じてマシンを構成します。
[作成] をクリックします。
GPU を搭載した新しいゾーンクラスタを作成する
Cloud コンソールまたは Google Cloud CLI を使用して GPU を実行するゾーンクラスタを作成します。
gcloud
GPU をデフォルトのノードプールで実行するゾーンクラスタを作成するには、次のコマンドを実行します。
gcloud container clusters create CLUSTER_NAME \
--accelerator type=GPU_TYPE,count=AMOUNT \
--zone COMPUTE_ZONE
次のように置き換えます。
CLUSTER_NAME
: クラスタに付ける名前。GPU_TYPE
: GPU タイプ(nvidia-tesla-k80
、nvidia-tesla-p100
、nvidia-tesla-p4
、nvidia-tesla-v100
、nvidia-tesla-t4
、nvidia-tesla-a100
)。AMOUNT
: デフォルトのノードプールで実行する GPU の数。COMPUTE_ZONE
: クラスタのコンピューティング ゾーン(us-central1-c
など)。
たとえば、次のコマンドは、3 つのノード(--num-nodes
省略時のデフォルト)とノードごとに 2 つの P100 GPU を持つクラスタ p100
を作成します。
gcloud container clusters create p100 \
--accelerator type=nvidia-tesla-p100,count=2 \
--zone us-central1-c
Console
[GPU による高速コンピューティング] クラスタ テンプレートに移動します。
必要に応じてクラスタを構成します。次に、GPU ノードプールをカスタマイズするか、新たな GPU ノードプールを追加します。
警告を読み、[制限について理解しています] を選択します。
[作成] をクリックします。
GPU を使用した新しいリージョン クラスタを作成する
デフォルトでは、リージョン クラスタはリージョン内の 3 つのゾーンにノードを作成します。ただし、3 つのゾーンのすべてに GPU がある Google Cloud リージョンはありません。GPU を搭載したリージョン クラスタを作成するときは、--node-locations
コマンドを使用してゾーンを指定する必要があります。このコマンドは、クラスタの作成後に使用することもできます。どのゾーンに GPU があるか調べるには、提供状況をご覧ください。
リージョン GPU クラスタを作成するには、Google Cloud CLI または Cloud コンソールを使用します。
gcloud
GPU を搭載したリージョン クラスタを作成するには、次のコマンドを実行します。
gcloud container clusters create CLUSTER_NAME \
--accelerator type=GPU_TYPE,count=AMOUNT \
--region COMPUTE_REGION \
--node-locations COMPUTE_ZONE,COMPUTE_ZONE1
次のように置き換えます。
CLUSTER_NAME
: クラスタに付ける名前。GPU_TYPE
: GPU タイプ(nvidia-tesla-k80
、nvidia-tesla-p100
、nvidia-tesla-p4
、nvidia-tesla-v100
、nvidia-tesla-t4
、またはnvidia-tesla-a100
)。AMOUNT
: ノードごとに実行する GPU の数。COMPUTE_REGION
: クラスタのリージョン(us-central1
など)。COMPUTE_ZONE,COMPUTE_ZONE1,[...]
: ノードを作成するゾーン。ゾーンは、--region
フラグで指定された、クラスタのコントロール プレーンと同じCOMPUTE_REGION
に存在する必要があります。ゾーンには、指定した GPU タイプが存在する必要があります。
たとえば、次のコマンドは、us-central1
内の 2 つのゾーンに 3 つのノード(--num-nodes
省略時のデフォルト)とノードごとに 2 つの P100 GPU を持つクラスタ p100
を作成します。
gcloud container clusters create p100 \
--accelerator type=nvidia-tesla-p100,count=2 \
--region us-central1 \
--node-locations us-central1-a,us-central1-c
Console
[GPU による高速コンピューティング] クラスタ テンプレートに移動します。
[ロケーション タイプ] で [リージョン] を選択します。
[リージョン] プルダウン リストで、目的のリージョンを選択します。
必要に応じてクラスタを構成します。次に、GPU ノードプールをカスタマイズするか、新たな GPU ノードプールを追加します。
警告を読み、[制限について理解しています] を選択します。
[作成] をクリックします。
NVIDIA GPU デバイス ドライバのインストール
クラスタに GPU ノードを追加したら、NVIDIA のデバイス ドライバをノードにインストールする必要があります。Google は、ドライバのインストールに適用できる DaemonSet を提供しています。Container-Optimized OS イメージを使用する GPU ノードでは、デフォルトの GPU ドライバ バージョンと新しいバージョンのいずれかを選択することもできます。次の表に、特定の GKE バージョンで使用できる GPU ドライバのバージョンを示します。
Container-Optimized OS(COS)ノードおよび Ubuntu ノードのインストール手順については、下記のセクションをご覧ください。
COS
インストール用の DaemonSet をデプロイして、デフォルトの GPU ドライバのバージョンをインストールするには、次のコマンドを実行します。
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
代わりに、より新しい GPU ドライバのバージョン(下の表を参照)をインストールするには、次のコマンドを実行します。
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded-latest.yaml
インストールには数秒かかります。インストールが完了すると、NVIDIA GPU デバイス プラグインが Kubernetes API を介して NVIDIA GPU の容量を明らかにします。
次の表に、それぞれの GKE バージョンがサポートする Nvidia ドライバのバージョンを示します。
GKE バージョン | NVIDIA ドライバ |
---|---|
1.20 以上 | 450.119.04(デフォルト)、470.82.01 |
1.18 以上 | 450.119.04(デフォルト) |
1.14 以上 | 418.67(デフォルト) |
Ubuntu
GPU サポートには、Ubuntu ノードに v1.11.3 以上が必要です。
インストール用の DaemonSet をデプロイするには、次のコマンドを実行します。
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/ubuntu/daemonset-preloaded.yaml
インストールには数秒かかります。インストールが完了すると、NVIDIA GPU デバイス プラグインが Kubernetes API を介して NVIDIA GPU の容量を明らかにします。
次の表に、それぞれの GKE バージョンがサポートする Nvidia ドライバのバージョンを示します。
GKE バージョン | NVIDIA ドライバ |
---|---|
1.19.8-gke.1200 以上 | 450.102.04 |
1.14.6-gke.13 以上 | 418.74 |
1.14.6-gke.12 以下 | 410.104 |
1.13.9-gke.11 以上 | 418.74 |
1.13.9-gke.10 以下 | 410.104 |
ノードの自動プロビジョニングでの GPU の使用
ノード自動プロビジョニングで GPU を使用する場合、デフォルトでは、自動プロビジョニングされたノードプールに十分なスコープが割り当てられていないため、インストール用の DaemonSet を実行できません。これを有効にするには、デフォルトの自動プロビジョニングのスコープを手動で変更する必要があります。
gcloud container clusters update CLUSTER_NAME --enable-autoprovisioning \
--autoprovisioning-scopes=https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring,https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/compute
自動プロビジョニングの詳細については、自動プロビジョニングのページをご覧ください。
GPU を使用するように Pod を構成する
リソース制限を使用して、Pod が GPU を使用するように構成します。リソース制限を Pod 仕様で指定するには、次の Key-Value ペアを使用します。
- キー:
nvidia.com/gpu
- 値: 使用する GPU の数
GPU を使用する Pod 仕様の例を下記に示します。
apiVersion: v1
kind: Pod
metadata:
name: my-gpu-pod
spec:
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: 2
複数の GPU タイプを使用する
クラスタごとに複数の GPU アクセラレータ タイプを使用する場合は、それぞれが独自のアクセラレータ タイプを持つ複数のノードプールを作成する必要があります。GKE は、独自のノードセレクタを GPU ノードに接続することにより、特定の GPU タイプのノードに GPU ワークロードを配置できるようにします。
- キー:
cloud.google.com/gke-accelerator
- 値:
nvidia-tesla-k80
、nvidia-tesla-p100
、nvidia-tesla-p4
、nvidia-tesla-v100
、nvidia-tesla-t4
、nvidia-tesla-a100
のいずれか。
このノードセレクタをワークロードの Pod 仕様に追加することにより、特定の GPU タイプをターゲットにできます。例:
apiVersion: v1
kind: Pod
metadata:
name: my-gpu-pod
spec:
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: 2
nodeSelector:
cloud.google.com/gke-accelerator: nvidia-tesla-k80 # or nvidia-tesla-p100 or nvidia-tesla-p4 or nvidia-tesla-v100 or nvidia-tesla-t4 or nvidia-tesla-a100
CUDA ライブラリについて
CUDA® は、NVIDIA の GPU 用並列コンピューティング プラットフォームおよびプログラミング モデルです。クラスタにインストールする NVIDIA デバイス ドライバには、CUDA ライブラリが含まれています。
CUDA ライブラリとデバッグ ユーティリティは、それぞれ、/usr/local/nvidia/lib64
と /usr/local/nvidia/bin
のコンテナ内で利用できます。
NVIDIA GPU を使用する Pod で実行する CUDA アプリケーションは、CUDA ライブラリを動的に検出する必要があります。それには、LD_LIBRARY_PATH
環境変数に /usr/local/nvidia/lib64
を含める必要があります。
ご使用の CUDA に最低限必要な GPU ドライバのバージョンを確認するには、CUDA ツールキットと互換ドライバのバージョンをご覧ください。ノードで実行する GKE パッチ バージョンに、選択した CUDA バージョンと互換性のある GPU ドライバのバージョンが含まれていることを確認します。GKE のバージョンに関連付けられている GPU ドライバのバージョンのリストについては、GKE の現在のバージョンの表でリンクされた対応する Container-Optimized OS のページをご覧ください。
GPU ノードのモニタリング
GKE は、GPU を使用するコンテナを対象に、次の Cloud Monitoring 指標を公開します。これらの指標を使用して、GPU ワークロードのパフォーマンスをモニタリングできます。
- デューティ サイクル(
container/accelerator/duty_cycle
): 過去のサンプル期間(10 秒)に対し、アクセラレータがアクティブに処理していた時間の割合。1~100 までの間。 - メモリ使用量(
container/accelerator/memory_used
): 割り当てられたアクセラレータ メモリの量(バイト単位)。 - メモリ容量(
container/accelerator/memory_total
): アクセラレータの総メモリ(バイト単位)。
これらの指標は、Cloud Monitoring で使用可能です。
クラスタとそのリソースのモニタリングの詳細については、モニタリングをご覧ください。
使用状況の指標の表示
ワークロードの GPU 使用状況の指標を、Cloud コンソールの [ワークロード] ダッシュボードで表示できます。
ワークロードの GPU 使用状況を表示には、以下の手順を行います。
Cloud コンソールの [ワークロード] ページに移動します。
目的のワークロードを選択します。
[ワークロード] ダッシュボードに、GPU メモリの使用量と容量、GPU デューティ サイクルのグラフが表示されます。