GPU の実行

このページでは、Google Kubernetes Engine(GKE)クラスタのノードで 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 Console で割り当てをご覧ください。

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

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

制限事項

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

  • 既存のノードプールに GPU を追加することはできません。
  • メンテナンス イベント中に GPU ノードをライブ移行することはできません。
  • GPU は、汎用 N1 マシンタイプでのみサポートされています。

対象

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

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

ゾーンで使用できる 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 割り当てのリクエスト

GPU 割り当てをリクエストするには、Cloud Console を使用します。割り当てのリクエストについて詳しくは、Compute Engine ドキュメントの追加の割り当てをリクエストするをご覧ください。

GPU 割り当てを検索するには、Cloud Console で次の手順を行います。

  1. Cloud Console の Identity and Access Management(IAM)の [割り当て] メニューに移動します。

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

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

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

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

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

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

割り当てリクエストを送信するには、Cloud Console で次の手順を行います。

  1. GPU 割り当ての一覧から、us-central1 など、必要とするリージョンの割り当てを選択します。
  2. [割り当てを編集] をクリックします。リクエスト フォームが Cloud 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 ノードを簡単に縮小できます。

Cloud 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: GPU タイプ(nvidia-tesla-k80nvidia-tesla-p100nvidia-tesla-p4nvidia-tesla-v100nvidia-tesla-t4)。
  • 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. Cloud Console で Google Kubernetes Engine のメニューに移動します。

    Google Kubernetes Engine のメニューに移動

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

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

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

  5. 必要に応じて、[自動スケーリングを有効にする] チェックボックスをオンにします。

  6. 必要に応じてノードプールを構成します。

  7. 左側のパネルで [ノード] を選択し、[CPU プラットフォームと GPU] を展開します。

  8. [GPU を追加] をクリックします。

  9. [GPU の数] プルダウン リストから、ノードごとに実行する GPU の数を選択します。

  10. [GPU のタイプ] プルダウン リストから、目的の GPU タイプを選択します。

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

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

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

Cloud Console または gcloud コマンドライン ツールを使用して 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-k80nvidia-tesla-p100nvidia-tesla-p4nvidia-tesla-v100nvidia-tesla-t4)。
  • 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. [GPU による高速コンピューティング] クラスタ テンプレートに移動します。

    [GPU による高速コンピューティング] テンプレートに移動

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

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

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

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

デフォルトでは、リージョン クラスタはリージョン内の 3 つのゾーンにノードを作成します。ただし、3 つのゾーンのすべてに GPU がある Google Cloud リージョンはありません。GPU を搭載したリージョン クラスタを作成するときは、--node-locations コマンドを使用してゾーンを指定する必要があります。このコマンドは、クラスタの作成後に使用することもできます。どのゾーンに GPU があるか調べるには、提供状況をご覧ください。

リージョン GPU クラスタを作成するには、gcloud コマンドライン ツールまたは Cloud Console を使用します。

gcloud

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

gcloud container clusters create cluster-name \
  --accelerator type=gpu-type,count=amount \
  --region compute-region \
  --node-locations compute-zone,compute-zone

次のように置き換えます。

  • cluster-name: クラスタに付ける名前。
  • gpu-type: GPU タイプ(nvidia-tesla-k80nvidia-tesla-p100nvidia-tesla-p4nvidia-tesla-v100nvidia-tesla-t4)。
  • amount: ノードごとに実行する GPU の数。
  • compute-region: クラスタのリージョン(us-central1 など)。
  • compute-zone: リージョン内のコンピューティング ゾーン(us-central1-c など)。ゾーンには、指定した 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

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

    [GPU による高速コンピューティング] テンプレートに移動

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

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

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

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

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

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

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

COS

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

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

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

次の表に、それぞれの GKE バージョンがサポートする Nvidia ドライバのバージョンを示します。

GKE バージョン NVIDIA ドライバ
1.14.2-gke.3 以上 418.67
1.14.2-gke.2 以下 418.67
1.13.6-gke.6 以上 418.67
1.13.6-gke.5 以下 410.79
1.12.x 410.79
1.11.5 以上 410.79
1.10.5-gke.4 以上 396.46
1.10.2-gke.3 以上 390.46

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.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
1.12.6-gke.6 以上 410.104
1.12.6-gke.5 以下 384.111
1.11.8-gke.4 以上 410.104
1.11.8-gke.3 以下 384.111

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

リソース上限を使用して、Pod が 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
    command: ["/bin/bash"]
    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-v100nvidia-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
    command: ["/bin/bash"]
    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 を含める必要があります。

GKE の CUDA アプリケーションには、Ubuntu ベースの CUDA Docker ベースイメージを使用する必要があります。ここでは、LD_LIBRARY_PATH がすでに適切に設定されています。サポートされている最新の CUDA バージョンは、COS(1.11.5+)と Ubuntu(1.11.8-gke.4+、1.12.6-gke.6+)の両方で 10.0 です。

GPU ノードのモニタリング

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

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

こうした指標は Stackdriver で利用可能です。

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

使用状況の指標の表示

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

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

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

    Google Kubernetes Engine のメニューに移動

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

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

次のステップ