Kubernetes Engine 上の GPU

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

概要

ノードに NVIDIA Tesla® P100 GPU と K80 GPU が搭載されたノードプールを作成することができます。GPU は、機械学習や画像処理など、クラスタ内の特定のワークロードを高速化するのに役立ちます。GPU のユースケースの詳細については、Google Cloud Platform の GPUS ページをご覧ください。

GPU 対応ノードは、Kubernetes バージョン 1.9.0 以降を実行している Kubernetes Engine クラスタで使用できます。

要件

GPU を使用してノードプールを作成するには、GPU 割り当てを設定しておく必要があります。プロジェクトで十分な GPU を使用できるようにするには、Google Cloud Platform Console で [割り当て] をご覧ください。

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

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

制限事項

Kubernetes Engine 上の NVIDIA GPU のサポートには次の制限があります。

  • GPU は、コンテナ最適化 OS ノードイメージに対してのみサポートされます。
  • 既存のノードプールに GPU を追加することはできません。
  • メンテナンス イベント中に GPU ノードをライブ移行することはできません。
  • GPU ノードは、NVIDIA GPU デバイス プラグイン システム アドオンを実行し、DevicePlugins Kubernetes アルファ機能を有効にします。Kubernetes Engine はこのデバイス プラグインを自動的に管理しますが、Google ではサードパーティのデバイス プラグインのサポートを提供していません。

対象

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

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

gcloud beta compute accelerator-types list

料金

GPU の価格情報については、Google Cloud Platform GPU ページの価格表をご覧ください。

GPU を使用したクラスタの作成

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

Console

  1. GCP Console で [Kubernetes Engine] メニューにアクセスします。

    [Kubernetes Engine] メニューにアクセス

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

  3. 必要に応じてクラスタを設定します。その後で、[マシンタイプ] で、[カスタマイズ] をクリックします。
  4. [GPU] をクリックします。
  5. [GPU の数] プルダウン メニューで、デフォルトのノードプールで実行するために必要な GPU の数を選択します。
  6. [GPU タイプ] プルダウン メニューで、必要な GPU タイプを選択します。
  7. [制限について理解しています] を選択して、警告を受け入れます。
  8. [作成] をクリックします。

gcloud

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

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

ここで

  • [CLUSTER_NAME] はクラスタに付ける名前です。
  • [GPU_TYPE] は、nvidia-tesla-p100nvidia-tesla-k80 のどちらかの GPU タイプです。
  • [AMOUNT] は、デフォルト ノードプール内のすべてのノードに接続する GPU の数です。
  • [COMPUTE_ZONE] は、us-central1-a などのクラスタのコンピューティング ゾーンです。
  • [CLUSTER_VERSION] は、Kubernetes Engine バージョン 1.9.0 以降です。

たとえば、次のコマンドは、各ノードで 2 つの P100 GPU が搭載された 1 つのクラスタ p100 を作成します。

gcloud beta container clusters create p100 \
--accelerator type=nvidia-tesla-p100,count=2 \
--zone us-central1-a --cluster-version 1.9

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

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

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

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

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

GPU を使用するようにポッドを設定する

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

apiVersion: v1
kind: Pod
spec:
  containers:
  - name: my-gpu-container
    resources:
      limits:
       nvidia.com/gpu: 2

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

  • キー: cloud.google.com/gke-accelerator
  • 値: nvidia-tesla-k80 または nvidia-tesla-p100

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

apiVersion: v1
kind: Pod
spec:
  containers:
  - name: my-gpu-container
    resources:
      limits:
       nvidia.com/gpu: 2
  nodeSelector:
    cloud.google.com/gke-accelerator: nvidia-tesla-p100 # or nvidia-tesla-k80

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

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

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

オートスケーリング GPU ノードプールの作成

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

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

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

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

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

GCP Console または gcloud コマンドライン ツールを使用して、既存のクラスタで GPU ノードプールを作成します。

Console

  1. GCP Console で [Kubernetes Engine] メニューにアクセスします。

    [Kubernetes Engine] メニューにアクセス

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

  3. [編集] をクリックします。
  4. [ノードプール] で、[ノードプールを追加] をクリックします。
  5. 必要に応じて、[自動スケーリング] プルダウン メニューで [オン] を選択します。
  6. 必要に応じてノードプールを設定します。その後で、[マシンタイプ] で、[カスタマイズ] をクリックします。
  7. [GPU の数] プルダウン メニューで、デフォルトのノードプールで実行するために必要な GPU の数を選択します。
  8. [GPU タイプ] プルダウン メニューで、必要な GPU タイプを選択します。
  9. [制限について理解しています] を選択して、警告を受け入れます。
  10. [保存] をクリックします。

gcloud

デフォルトのノードプールに GPU が接続されたノードプールを作成するには、次のコマンドを実行します。

gcloud beta container node-pools create [POOL_NAME] \
--accelerator type=[GPU_TYPE],count=[AMOUNT] --zone [COMPUTE-ZONE] \
--cluster [CLUSTER-NAME] [--num-nodes 3 --min-nodes 2 --max-nodes 5 \
--enable-autoscaling]

ここで

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

たとえば、次のコマンドは、クラスタ p100-cluster で 2 つの P100 GPU が搭載された自動スケーリング ノードプール p100 を作成します。

gcloud beta container node-pools create p100 \
--accelerator type=nvidia-tesla-p100,count=2 \
--zone us-central1-a --cluster p100-cluster \
--num-nodes 3 --min-nodes 0 --max-nodes 5 --enable-autoscaling

GPU ノードのモニタリング

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

  • container/accelerator/duty_cycle
  • container/accelerator/memory_total
  • container/accelerator/memory_used

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

次のステップ

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

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