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

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

ゾーンで使用できる GPU を確認するには、gcloud コマンドライン ツールを使用します。

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 ドキュメントの追加の割り当てをリクエストするをご覧ください。

Console

次の手順を行います。

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

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

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

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

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

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

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

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 をリクエストしている Pod に対応する許容範囲を自動的に適用します。

これにより、GPU を要求している Pod のみが GPU ノードでスケジュールされ、より効率的な自動スケーリングが可能になります。GPU を要求している Pod が不足している場合は、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. [GPU の数] プルダウン リストから、ノードごとに実行する GPU の数を選択します。

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

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

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

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 [REGION] --node-locations [ZONE],[ZONE]
    

ここで

  • [CLUSTER_NAME] はクラスタに付ける名前です。
  • [GPU_TYPE] は GPU タイプです(nvidia-tesla-k80nvidia-tesla-p100nvidia-tesla-p4nvidia-tesla-v100nvidia-tesla-t4 のいずれか)。
  • [AMOUNT] は、ノードごとに動作する GPU の数です。
  • [REGION] は、クラスタのリージョンです(us-central1 など)。
  • [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 を使用するように構成します。リソース制限を Pod 仕様で指定するには、次の Key-Value ペアを使用します。

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

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

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 のいずれか。

このノードセレクタをワークロードの Pod 仕様に追加することにより、特定の 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 を使用する Pod 内で実行する 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 の [ワークロード] ダッシュボードで表示できます。

Console

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

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

    Google Kubernetes Engine のメニューに移動

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

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

次のステップ