GPU

このページでは、Google Kubernetes Engine クラスタノードで NVIDIA® グラフィックス プロセシング ユニット(GPU)ハードウェア アクセラレータを使用する方法について説明します。

概要

GKE を使用すると、NVIDIA Tesla® K80P100P4V100、および T4 の GPU を搭載したノードプールを作成できます。GPU は、画像認識や自然言語処理のほか、動画のコード変換や画像処理などの多くのコンピューティング処理を必要とするタスクなど、ディープ ラーニング タスクを稼働させるための計算能力を提供します。

ワークロードが頻繁なノード中断を許容できるのであれば、GPU をプリエンプティブ VM で使用することもできます。プリエンプティブ VM を使用することで、GPU 実行時の料金を下げることができます。詳しくは、プリエンプティブ インスタンスの GPU をご覧ください。

要件

GKE 上の GPU には、以下の要件があります。

Kubernetes のバージョン
Container-Optimized OS ノードイメージを使用するノードプールの場合、GPU ノードは GKE バージョン 1.9 以降で使用できます。Ubuntu ノードイメージを使用するノードプールの場合、GPU ノードは GKE バージョン 1.11.3 以降で使用できます。
GPU 割り当て

GPU ノードを作成する前に、希望するゾーンに Compute Engine GPU の割り当てがなければなりません。プロジェクトに十分な GPU 割り当てがあることを確認するには、Google Cloud Platform Console の割り当てをご覧ください。

追加の GPU 割り当てが必要な場合は、GCP Console で GPU 割り当てをリクエストする必要があります。請求先アカウントが設定されている場合は、割り当てリクエストを送信すると、プロジェクトに自動的に割り当てが設定されます。

NVIDIA GPU ドライバ

NVIDIA GPU ドライバをノードに手動でインストールする必要があります。このページでは、ドライバをインストールする方法について説明します。

制限事項

GPU を GKE で使用する前に、以下の制限事項に留意してください。

  • 既存のノードプールに GPU を追加することはできません。
  • メンテナンス イベント中に GPU ノードをライブ移行することはできません。

対象

GPU は特定のリージョンとゾーンで利用できます。GPU 割り当てをリクエストするときは、クラスタを実行するリージョンについて考慮してください。

適用可能なリージョンとゾーンの完全なリストについては、Compute Engine の GPU をご覧ください。

gcloud コマンドライン ツールを使用して、ゾーンで使用可能な GPU を確認することもできます。

gcloud

各ゾーンでサポートされているすべての GPU アクセラレータ タイプのリストを表示するには、次のコマンドを実行します。

gcloud compute accelerator-types list

料金

GPU の料金情報については、GCP GPU ページの料金表をご覧ください。

GPU 割り当て

GPU 割り当てとは、GCP プロジェクトで実行できる GPU の総数です。GPU を搭載したクラスタを作成するには、プロジェクトに十分な GPU 割り当てが必要です。

GPU 割り当ては、クラスタで実行する GPU の総数と少なくとも同じである必要があります。クラスタの自動スケーリングを有効にする場合は、クラスタの最大ノード数にノードあたりの GPU 数を掛けた数以上の GPU 割り当てをリクエストする必要があります。

たとえば、3 つのノードを持つクラスタを作成してノードごとに 2 つの GPU を実行する場合、少なくとも 6 つの GPU 割り当てがプロジェクトに必要です。

GPU 割り当てのリクエスト

GCP Console を使用して GPU 割り当てをリクエストします。

Console

次の手順を行います。

  1. GCP Console で Cloud IAM の [割り当て] メニューに移動します。

    [割り当て] メニューに移動

  2. [指標] プルダウン メニューで、[なし] をクリックして、検索フィールドに「gpus」と入力します。

  3. 検索結果から、目的の GPU を選択します。

    [指標] プルダウン メニューのスクリーンショット。選択した GPU 指標を表示しています。

  4. [指標] プルダウン メニューを閉じます。

割り当てリクエストを送信する

Console

次の手順を行います。

  1. GPU 割り当てのリストから、目的のリージョン(us-central1 など)の割り当てを選択します。
  2. [割り当てを編集] をクリックします。リクエスト フォームが GCP Console の右側に開きます。
  3. 各割り当てリクエストの [新しい割り当て上限] フィールドを入力します。
  4. [リクエストの説明] フィールドに、リクエストの詳細を入力します。
  5. [完了] をクリックします。
  6. [リクエストを送信] をクリックします。

GPU の実行

次のセクションでは、GPU を GKE クラスタで実行する方法について説明します。

自動スケーリング GPU ノードプールの作成

GKE 上の GPU の最良で最もコスト効率の良いメリットを享受し、クラスタ自動スケーリングを活用するには、クラスタ内に別々の GPU ノードプールを作成することをおすすめします。

すでに非 GPU ノードプールを実行している既存のクラスタに GPU ノードプールを追加すると、GKE が自動的に次のノード taint を使用して GPU ノードを taint します。

  • キー: nvidia.com/gpu
  • 効果: NoSchedule

加えて、GKE は、ExtendedResourceToleration アドミッション コントローラを実行することにより、GPU をリクエストしているポッドに対応する許容範囲を自動的に適用します。

これにより、GPU をリクエストしているポッドのみが GPU ノードでスケジュールされ、より効率的な自動スケーリングが可能になります。GPU をリクエストしているポッドが不足している場合は、GPU ノードを簡単に縮小できます。

GCP Console または gcloud コマンドライン ツールを使用して、既存のクラスタで 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]

ここで

  • [POOL_NAME] はノードプールに付ける名前です。
  • [GPU_TYPE] は、nvidia-tesla-k80nvidia-tesla-p100nvidia-tesla-p4nvidia-tesla-v100nvidia-tesla-t4 のいずれかの GPU タイプです。
  • [AMOUNT] は、ノードプール内のノードに接続する GPU の数です。
  • [COMPUTE_ZONE] は、ノードプールを作成するコンピューティング ゾーンus-central1-c など)です。クラスタは、指定されたゾーンですでに動作している必要があります。
  • [CLUSTER_NAME] は、ノードプールを作成するクラスタの名前です。
  • --num-nodes は、作成するノードの初期数を指定します。
  • --min-nodes は、指定された時刻に実行するノードの最小数を指定します。
  • --max-nodes は、動作可能なノードの最大数を指定します。
  • --enable-autoscaling を使用すると、ワークロードの需要が変化したときにノードプールを自動スケーリングできるようになります。

たとえば、次のコマンドは、クラスタ 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

  1. GCP Console で Google Kubernetes Engine のメニューに移動します。

    Google Kubernetes Engine のメニューに移動

  2. 目的のクラスタを選択します。

  3. [編集] をクリックします。

  4. [ノードプール] で、[ノードプールを追加] をクリックします。

  5. 必要に応じて、[自動スケーリング] プルダウン メニューで [オン] を選択します。

  6. 必要に応じてノードプールを構成します。その後、[マシンタイプ] で、[カスタマイズ] をクリックします。

  7. [GPU の数] プルダウン メニューで、ノードごとに動作する GPU の必要数を選択します。

  8. [GPU のタイプ] プルダウン メニューで、必要な GPU タイプを選択します。

  9. [制限について理解しています] チェックボックスをオンにして、警告を受け入れます。

  10. [保存] をクリックします。

GPU を使用した新しいゾーンクラスタを作成する

GPU を実行するゾーンクラスタを、GCP Console または gcloud コマンドライン ツールを使用して作成します。

gcloud

GPU をデフォルトのノードプールで実行するゾーンクラスタを作成するには、次のコマンドを実行します。

gcloud container clusters create [CLUSTER_NAME] \
--accelerator type=[GPU_TYPE],count=[AMOUNT] \
--zone [COMPUTE_ZONE]

ここで

  • [CLUSTER_NAME] はクラスタに付ける名前です。
  • [GPU_TYPE] は、nvidia-tesla-k80nvidia-tesla-p100nvidia-tesla-p4nvidia-tesla-v100nvidia-tesla-t4 のいずれかの GPU タイプです。
  • [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

  1. GCP Console で Google Kubernetes Engine のメニューに移動します。

    Google Kubernetes Engine のメニューに移動

  2. [クラスタを作成] をクリックします。

  3. [GPU による高速コンピューティング] クラスタ テンプレートを選択します。

  4. 必要に応じてクラスタを構成します。次に、GPU ノードプールをカスタマイズするか、新たな GPU ノードプールを追加します。

  5. [制限について理解しています] チェックボックスをオンにして、警告を受け入れます。

  6. [作成] をクリックします。

GPU を使用した新しいリージョン クラスタを作成する

デフォルトでは、リージョン クラスタはリージョン内の 3 つのゾーンにノードを作成します。ただし、GCP リージョンには、3 つのゾーンすべてに GPU がありません。GPU を使用したリージョン クラスタを作成するときは、GPU を使用可能なゾーンを手動で指定する必要があります。どのゾーンに GPU があるか調べるには、可用性をご覧ください。

リージョン GPU クラスタを、gcloud コマンドライン ツールを使用して作成します。

gcloud

GPU を使用したリージョン クラスタを作成するには、次のコマンドを実行します。

gcloud container clusters create [CLUSTER_NAME] \
--accelerator type=[GPU_TYPE],count=[AMOUNT] \
--region [REGION] --node-locations [ZONE],[ZONE]

ここで

  • [CLUSTER_NAME] はクラスタに付ける名前です。
  • [GPU_TYPE] は、nvidia-tesla-k80nvidia-tesla-p100nvidia-tesla-p4nvidia-tesla-v100nvidia-tesla-t4 のいずれかの GPU タイプです。
  • [AMOUNT] は、ノードごとに動作する GPU の数です。
  • [REGION] はクラスタのリージョン(us-central1 など)です。
  • [ZONE] はリージョン内のコンピューティング ゾーン(us-central1-c など)です。ゾーンには、指定した GPU タイプが存在する必要があります。

たとえば、次のコマンドは、3 つのノード(--num-nodes が省略された場合のデフォルト)とノードあたり 2 つの P100 GPU を持つクラスタ p100 を、us-central1 内の 2 つのゾーンに作成します。

gcloud container clusters create p100 \
--accelerator type=nvidia-tesla-p100,count=2 \
--region us-central1 \ --node-locations us-central1-a,us-central1-c

Console

  1. GCP Console で Google Kubernetes Engine のメニューに移動します。

    Google Kubernetes Engine のメニューに移動

  2. [クラスタを作成] をクリックします。

  3. [GPU による高速コンピューティング] クラスタ テンプレートを選択します。

  4. [ロケーション タイプ] で、[リージョン] を選択します。[リージョン] で、目的のリージョンを選択します。

  5. 必要に応じてクラスタを構成します。次に、GPU ノードプールをカスタマイズするか、新たな GPU ノードプールを追加します。

  6. [制限について理解しています] チェックボックスをオンにして、警告を受け入れます。

  7. [作成] をクリックします。

NVIDIA GPU デバイス ドライバのインストール

クラスタに GPU ノードを追加したら、NVIDIA のデバイス ドライバをノードにインストールする必要があります。Google は、自動的にドライバをインストールする DaemonSet を提供しています。

Container-Optimized OS(COS)ノードおよび Ubuntu ノードのインストール手順については、下記のセクションをご覧ください。

COS

インストール用の DaemonSet をデプロイするには、次のコマンドを実行します。

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/stable/nvidia-driver-installer/cos/daemonset-preloaded.yaml

インストールには数分かかります。インストールが完了すると、NVIDIA GPU デバイス プラグインが Kubernetes API を介して NVIDIA GPU の容量を明らかにします。

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 の容量を明らかにします。

GPU を使用するようにポッドを構成する

リソース制限を使用して、ポッドが GPU を使用するように構成します。リソース制限をポッド仕様で指定するには、次の Key-Value ペアを使用します。

  • キー: nvidia/gpu
  • 値: 使用する GPU の数

GPU を使用するポッド仕様の例を下記に示します。

apiVersion: v1
kind: Pod
metadata:
  name: my-gpu-pod
spec:
  containers:
  - name: my-gpu-container
    image: nvidia/cuda:10.0-runtime-ubuntu18.04
    resources:
      limits:
       nvidia.com/gpu: 2

複数の GPU タイプを使用する

クラスタごとに複数の GPU アクセラレータ タイプを使用する場合は、それぞれが独自のアクセラレータ タイプを持つ複数のノードプールを作成する必要があります。GKE は、独自のノードセレクタを GPU ノードに接続することにより、特定の GPU タイプのノードに GPU ワークロードを配置するのに役立ちます。

  • キー: cloud.google.com/gke-accelerator
  • 値: nvidia-tesla-k80nvidia-tesla-p100nvidia-tesla-p4nvidia-tesla-v100、または nvidia-tesla-t4

このノードセレクタをワークロードのポッド仕様に追加することにより、特定の GPU タイプをターゲットにできます。例:

apiVersion: v1
kind: Pod
metadata:
  name: my-gpu-pod
spec:
  containers:
  - name: my-gpu-container
    image: nvidia/cuda:10.0-runtime-ubuntu18.04
    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

CUDA ライブラリについて

CUDA® は、NVIDIA の GPU 用並列コンピューティング プラットフォームおよびプログラミング モデルです。クラスタにインストールする NVIDIA デバイス ドライバには、CUDA ライブラリが含まれています。

CUDA ライブラリとデバッグ ユーティリティは、それぞれ、/usr/local/nvidia/lib64/usr/local/nvidia/bin のコンテナ内で利用できます。

NVIDIA GPU を使用するポッドで動作する CUDA アプリケーションは、CUDA ライブラリを動的に検出する必要があります。そのためには、LD_LIBRARY_PATH 環境変数に /usr/local/nvidia/lib64 を含める必要があります。

Ubuntu ベースの CUDA Docker ベースイメージを GKE の CUDA アプリケーションに使用する必要があります。ここで、LD_LIBRARY_PATH はすでに適切に設定されています。サポートされている最新の CUDA バージョンは 9.0 です。

GPU ノードのモニタリング

GKE は、GPU を使用して次の Stackdriver Monitoring 指標をコンテナに公開します。これらの指標を使用して、GPU ワークロードのパフォーマンスをモニタリングできます。

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

これらの指標は Stackdriver で利用可能です。

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

使用状況の指標の表示

ワークロードの GPU 使用状況の指標を、GCP Console の [ワークロード] ダッシュボードで表示できます。

Console

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

  1. GCP Console の [ワークロード] メニューに移動します。

    Google Kubernetes Engine のメニューに移動

  2. 目的のワークロードを選択します。

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

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のドキュメント