GKE Standard ノードプールで GPU を実行する


このページでは、Google Kubernetes Engine(GKE)Standard クラスタのノードに NVIDIA® 画像処理装置(GPU)ハードウェア アクセラレータを接続して使用することで、人工知能(AI)や画像処理などのコンピューティング負荷の高いワークロードを実行し、最適化する方法について説明します。

Autopilot Pod を使用している場合は、Autopilot に GPU ワークロードをデプロイするをご覧ください。

概要

GKE では、GPU を搭載したノードプールを作成できます。GPU は、画像認識や自然言語処理のほか、動画のコード変換や画像処理などの多くのコンピューティング処理を必要とするタスクなど、ディープ ラーニング タスクを稼働させるための計算能力を提供します。GKE Standard モードでは、GPU ハードウェアをクラスタ内のノードに接続し、それらのノード上で実行されているコンテナ化されたワークロードに GPU リソースを割り当てることができます。

GPU のユースケースについて詳しくは、Google Cloud の GPU に関するページをご覧ください。GKE での GPU の詳細とモードの違い(Standard と Autopilot)については、GKE での GPU についてをご覧ください。

ワークロードが頻繁なノード中断を許容できるのであれば、GPU を Spot VMで使用することもできます。Spot VM を使用することで、GPU 実行時の料金を下げることができます。詳細については、GPU ノードプールで Spot VM を使用するをご覧ください。

バージョン 1.29.2-gke.1108000 以降では、GKE Sandbox に GPU ノードプールを作成できるようになりました。詳細については、GKE Sandbox および GKE Sandbox の構成をご覧ください。

始める前に

始める前に、次の作業が完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API の有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、gcloud components update を実行して最新のバージョンを取得する。

GKE での GPU の要件

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

  • Kubernetes バージョン: 使用可能なバージョンは、GPU が使用するノードイメージによって異なります。

  • GPU の割り当て: GPU ノードを作成する前に、選択したゾーンに Compute Engine GPU の割り当てが必要です。プロジェクトに十分な GPU 割り当てがあるか確認するには、Google Cloud コンソールで割り当てをご覧ください。

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

  • NVIDIA GPU ドライバ: クラスタまたはノードプールの作成時に、GKE のバージョンに基づいたバージョンのドライバを自動的にインストールするよう GKE に指示できます。GPU ドライバを自動的にインストールするよう GKE に指示しない場合は、ドライバを手動でインストールする必要があります。

  • A100 GPU: A100 GPU は a2 マシンタイプでのみサポートされます。基盤となる A2 マシンタイプに A100 GPU を使用するための十分な割り当てがあることを確認する必要があります。

  • Ubuntu ノード上の GPU: Ubuntu ノードで GPU を使用する場合は、次のドライバ要件が適用されます。特定の GPU に必要な最小限の GKE バージョンには、その GPU に必要なドライバが含まれているため、GPU ノードには Container-Optimized OS を使用することをおすすめします。

    • L4 GPUH100 GPU: NVIDIA ドライバ バージョン 535 以降。

    必要なバージョン以降のドライバ バージョンが GKE バージョンのデフォルト バージョンでない場合は、サポートされているドライバをノードに手動でインストールする必要があります。

GKE での GPU の使用の制限事項

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

  • 既存のノードプールに GPU を追加することはできません。
  • メンテナンス イベント中に GPU ノードをライブ マイグレーションすることはできません。
  • 使用可能な GPU タイプは、次のようにマシンシリーズによって異なります。

    選択した GPU タイプと数量に対応するマシンシリーズのプロジェクトに十分な割り当てがあることを確認する必要があります。

  • GPU は Windows Server ノードプールではサポートされていません。

  • バージョン 1.28.2-gke.1098000 以前を実行している GKE Standard クラスタでは、L4 GPU を使用したノードプールの作成でノード自動プロビジョニングがサポートされていません。ただし、以前のバージョンを実行しているクラスタでは、既存のノードプールのクラスタ オートスケーラー スケーリングがサポートされています。

  • H100 GPU を使用していて、Pod でローカル SSD を使用する場合は、基盤となる A3 VM にアタッチするローカル SSD の正確な数を明示的に指定する必要があります。エフェメラル ストレージの場合は --ephemeral-storage-local-ssd=count=SSD_COUNT フラグ、ブロック アクセスの場合は --local-nvme-ssd-block=count=SSD_COUNT フラグを使用して、この数を指定します。これらのフラグのいずれかを追加しないと、Pod でローカル SSD を使用できなくなります。

    GKE でサポートされているマシンサイズは a3-highgpu-8g で、対応するローカル SSD の数は 16 です。

リージョンごととゾーンごとの GPU の可用性

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 割り当てをリクエストするには、Google Cloud コンソールを使用します。割り当てのリクエストの詳細については、Compute Engine ドキュメントの GPU 割り当てをご覧ください。

GPU 割り当てを検索して割り当てリクエストを送信するには、Google Cloud コンソールを使用します。

  1. Google Cloud コンソールの [IAM と管理] ページに移動します。

    [割り当て] に移動

  2. [フィルタ] ボックスで次の操作を行います。

    1. [割り当て] プロパティを選択し、GPU モデルの名前を入力して、Enter を押します。
    2. (省略可)高度なフィルタを適用して結果を絞り込むには、[ディメンション] プロパティを選択し(例: ロケーション)、使用しているリージョンまたはゾーンの名前を追加して、Enter を押します。
  3. GPU 割り当てのリストから、変更する割り当てを選択します。

  4. [割り当てを編集] をクリックします。リクエスト フォームが開きます。

  5. 各割り当てリクエストの [新しい割り当て上限] フィールドを入力します。

  6. [リクエストの説明] フィールドに、リクエストの詳細を入力します。

  7. [次へ] をクリックします。

  8. [オーバーライドの確認] ダイアログで [確認] をクリックします。

  9. [連絡先の詳細] 画面で、承認者が割り当て変更リクエストを完了するために使用できる名前と電話番号を入力します。

  10. [リクエストを送信] をクリックします。

  11. 割り当ての変更を追跡するための確認メールが届きます。

GKE Standard クラスタでの GPU の実行

GKE Standard クラスタで GPU を実行するには、GPU がアタッチされたノードプールを作成します。

GKE で GPU の費用対効果、信頼性、可用性を高めるために、次のことをおすすめします。

  • 個別の GPU ノードプールを作成します。ノードプールごとに、ノードのロケーションを必要な GPU を使用できるゾーンに制限します。
  • 各ノードプールで自動スケーリングを有効にします。
  • リージョン クラスタを使用して、リージョン内のゾーン間で Kubernetes コントロール プレーンをレプリケーションすることで可用性を向上させます。
  • ドライバのバージョンを手動でインストールして管理しなくても済むように、ノードプールにデフォルトまたは最新の GPU ドライバを自動的にインストールするよう GKE に指示します。

以降のセクションで説明するように、GKE はノード taint と許容を使用して、Pod が不適切なノードにスケジュールされないようにします。

GPU ノードプールを自動的に taint して、不適切なスケジューリングを回避する

ノード taint を使用してノードをマークすると、スケジューラは特定の Pod でそのノードの使用を回避または禁止します。すでに非 GPU ノードプールを実行している既存のクラスタに GPU ノードプールを追加すると、GKE が自動的に次のノード taint を使用して GPU ノードを taint します。

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

toleration によるスケジュール設定の自動制限

tolerations を使用すると、「taint」としてマークされたノードで使用できる Pod を指定できます。GKE は自動的に toleration を適用するため、GPU をリクエストする Pod のみが GPU ノードでスケジュールされます。これにより、GPU をリクエストしている Pod が不足している場合に GPU ノードを簡単にスケールダウンできるため、より効率的な自動スケーリングが可能になります。そのために、GKE は ExtendedResourceToleration アドミッション コントローラを実行します。

GPU ノードプールを作成する

既存のクラスタに個別の GPU ノードプールを作成するには、Google Cloud コンソールまたは Google Cloud CLI を使用します。Terraform を使用して GKE クラスタと GPU ノードプールをプロビジョニングすることもできます。

各ノードに GKE バージョンに対応するデフォルトまたは最新の NVIDIA ドライバのバージョンを自動的にインストールするよう GKE に指示できます。

gcloud

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

gcloud container node-pools create POOL_NAME \
  --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=DRIVER_VERSION \
  [--machine-type MACHINE_TYPE] \
  --region COMPUTE_REGION --cluster CLUSTER_NAME \
  --node-locations COMPUTE_ZONE1[,COMPUTE_ZONE2] \
  [--enable-autoscaling \
   --min-nodes MIN_NODES \
   --max-nodes MAX_NODES] \
  [--ephemeral-storage-local-ssd=count=SSD_COUNT]

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

  • POOL_NAME: ノードプールに付ける名前。
  • GPU_TYPE: 使用する GPU アクセラレータのタイプ。例: nvidia-tesla-t4
  • DRIVER_VERSION: インストールする NVIDIA ドライバのバージョン。次のいずれか 1 つを指定できます。

    • default: ノードの GKE バージョンのデフォルト ドライバ バージョンをインストールします。
    • latest: GKE バージョンに対応する最新のドライバ バージョンをインストールします。Container-Optimized OS を使用するノードでのみ使用できます。
    • disabled: ドライバの自動インストールをスキップします。ノードプールを作成した後に、手動でドライバをインストールする必要がありますgpu-driver-version を省略すると、GKE によるドライバの自動インストールが行われません。
  • AMOUNT: ノードプール内のノードにアタッチする GPU の数。

  • MACHINE_TYPE: ノードの Compute Engine マシンタイプ。次の GPU タイプの場合は必須です。

    その他の GPU の場合、このフラグは省略可能です。

  • COMPUTE_REGION: クラスタの Compute Engine リージョン(us-central1 など)。リクエストされた GPU を使用できるゾーンが 1 つ以上あるリージョンを選択します。

  • CLUSTER_NAME: ノードプールを作成するクラスタの名前。

  • COMPUTE_ZONE1,COMPUTE_ZONE2,[...]: GKE が GPU ノードを作成する特定のゾーン。ゾーンは、--region フラグで指定したクラスタと同じリージョンに存在する必要があります。定義する GPU タイプは、選択した各ゾーンで使用可能である必要があります。ノードプールを作成するときに、常に --node-locations フラグを使用して、リクエストされた GPU を含むゾーンを指定することをおすすめします。

  • MIN_NODES: 任意の時点でのノードプール内の各ゾーンの最小ノード数。この値は、--enable-autoscaling フラグが使用されている場合にのみ関連します。

  • MAX_NODES: 任意の時点でのノードプール内の各ゾーンの最大ノード数。この値は、--enable-autoscaling フラグが使用されている場合にのみ関連します。

  • SSD_COUNT: エフェメラル ストレージに接続するローカル SSD の数。このフラグは、H100 GPU を搭載した A3 マシンタイプでローカル SSD を使用する場合に必要です。

たとえば、次のコマンドを実行すると、リージョン クラスタ p100-cluster 内に、ノードごとに 2 つの P100 GPU を持つ高可用性自動スケーリング ノードプール p100 が作成されます。GKE は、これらのノードにデフォルトのドライバを自動的にインストールします。

gcloud container node-pools create p100 \
  --accelerator type=nvidia-tesla-p100,count=2,gpu-driver-version=default \
  --region us-central1 --cluster p100-cluster \
  --node-locations us-central1-c \
  --min-nodes 0 --max-nodes 5 --enable-autoscaling

コンソール

GPU を使用するノードプールを作成するには、以下の手順に沿って操作します。

  1. Google Cloud コンソールで Google Kubernetes Engine のページに移動します。

    Google Kubernetes Engine に移動

  2. クラスタのリストで、変更するクラスタの名前をクリックします。

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

  4. 必要に応じて、[ノードプールの詳細] ページで [自動スケーリングを有効にする] チェックボックスをオンにします。

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

  6. ナビゲーション パネルで [ノード] を選択します。

  7. [マシンの構成] で [GPU] をクリックします。

  8. 各ノードで実行する [GPU のタイプ] と [GPU の数] を選択します。

  9. 警告を読み、[制限について理解しています] をオンにします。

  10. [GPU Driver installation] セクションで、次のいずれかの方法を選択します。

    • Google が管理: GKE はドライバを自動的にインストールします。このオプションを選択した場合は、[バージョン] プルダウンから次のいずれかを選択します。
      • デフォルト: デフォルトのドライバ バージョンをインストールします。
      • 最新: 使用可能な最新のドライバ バージョンをインストールします。
    • お客様が管理: GKE はドライバをインストールしません。NVIDIA GPU デバイス ドライバのインストールの手順に沿って、互換性のあるドライバを手動でインストールする必要があります
  11. [作成] をクリックします。

Terraform

GPU を搭載した Terraform でリージョン クラスタを作成するには、Terraform モジュールを使用します。

  1. variables.tf ファイルに次のブロックを追加して、Terraform 変数を設定します。

    variable "project_id" {
      default     = PROJECT_ID
      description = "the gcp_name_short project where GKE creates the cluster"
    }
    
    variable "region" {
      default     = CLUSTER_REGION
      description = "the gcp_name_short region where GKE creates the cluster"
    }
    
    variable "zone" {
      default     = "COMPUTE_ZONE1,COMPUTE_ZONE2"
      description = "the GPU nodes zone"
    }
    
    variable "cluster_name" {
      default     = "CLUSTER_NAME"
      description = "the name of the cluster"
    }
    
    variable "gpu_type" {
      default     = "GPU_TYPE"
      description = "the GPU accelerator type"
    }
    
    variable "gpu_driver_version" {
      default = "DRIVER_VERSION"
      description = "the NVIDIA driver version to install"
    }
    
    variable "machine_type" {
      default = "MACHINE_TYPE"
      description = "The Compute Engine machine type for the VM"
    }
    

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

    • PROJECT_ID: プロジェクト ID。
    • CLUSTER_NAME: GKE クラスタの名前。
    • CLUSTER_REGION: クラスタの Compute Engine のリージョン
    • COMPUTE_ZONE1,COMPUTE_ZONE2,[...]: GKE が GPU ノードを作成する特定のゾーン。これらのゾーンは、region 変数で指定したのと同じリージョンに存在する必要があります。これらのゾーンには、利用可能な GPU タイプが定義されている必要があります。どのゾーンに GPU があるか調べるには、対象をご覧ください。GPU ノードプールを作成するときに、node_locations 変数を使用して、リクエストされた GPU を含むゾーン(1 つまたは複数)を指定する必要があります。
    • GPU_TYPE: 使用する GPU アクセラレータのタイプ。例: nvidia-tesla-t4
    • DRIVER_VERSION: GKE が自動的にインストールする GPU ドライバのバージョン。このフィールドは省略可能です。次の値を使用できます。

      • INSTALLATION_DISABLED: GPU ドライバの自動インストールを無効にします。GPU を実行するには、ドライバを手動でインストールする必要があります。
      • DEFAULT: ノードのオペレーティング システムのバージョンに対応するデフォルトのドライバ バージョンを自動的にインストールします。
      • LATEST: ノードの OS バージョンで利用可能な最新のドライバ バージョンを自動的にインストールします。

    このフィールドを省略すると、GKE によるドライバの自動インストールが行われません。このフィールドは、ノードの自動プロビジョニングを使用するノードプールではサポートされていません。ドライバを手動でインストールするには、このドキュメントの NVIDIA GPU ドライバを手動でインストールするをご覧ください。* MACHINE_TYPE: ノード用の Compute Engine マシンタイプ。次の GPU タイプの場合は必須です。

    その他の GPU の場合、このフラグは省略可能です。

  2. Terraform 構成に次のブロックを追加します。

    provider "google" {
      project = var.project_id
      region  = var.region
    }
    
    resource "google_container_cluster" "ml_cluster" {
      name     = var.cluster_name
      location = var.region
      node_locations = [var.zone]
    }
    
    resource "google_container_node_pool" "gpu_pool" {
      name       = google_container_cluster.ml_cluster.name
      location   = var.region
      cluster    = google_container_cluster.ml_cluster.name
      node_count = 3
    
      autoscaling {
        total_min_node_count = "1"
        total_max_node_count = "5"
      }
    
      management {
        auto_repair  = "true"
        auto_upgrade = "true"
      }
    
      node_config {
        oauth_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/trace.append",
          "https://www.googleapis.com/auth/service.management.readonly",
          "https://www.googleapis.com/auth/servicecontrol",
        ]
    
        labels = {
          env = var.project_id
        }
    
        guest_accelerator {
          type  = var.gpu_type
          count = 1
          gpu_driver_installation_config {
            gpu_driver_version = var.gpu_driver_version
          }
        }
    
        image_type   = "cos_containerd"
        machine_type = var.machine_type
        tags         = ["gke-node", "${var.project_id}-gke"]
    
        disk_size_gb = "30"
        disk_type    = "pd-standard"
    
        metadata = {
          disable-legacy-endpoints = "true"
        }
      }
    }
    

Terraform が Google Cloud APIs を呼び出して、GPU を使用するノードプールで新しいクラスタを作成します。ノードプールには最初に 3 つのノードがあり、自動スケーリングが有効になっています。Terraform の詳細については、terraform.io の google_container_node_pool リソースの仕様をご覧ください。

GPU を搭載した新しいクラスタを作成し、--node-locations フラグを使用してゾーンを指定することもできます。ただし、このセクションに示すように、既存のクラスタに別の GPU ノードプールを作成することをおすすめします。

NVIDIA GPU ドライバを手動でインストールする

インストール DaemonSet をノードにデプロイすることで、ノードに NVIDIA GPU ドライバを手動でインストールできます。次の状況では、手動インストールを使用します。

  • GPU ノードプールの作成時にデバイス ドライバの自動インストールを無効にした場合。
  • 自動インストールがサポートされている最小バージョンよりも前の GKE バージョンを使用している場合。
  • ワークロードに、自動インストールでデフォルトまたは最新のドライバとして使用できない特定の NVIDIA ドライバ バージョンが必要な場合。

可能であれば、Standard クラスタの作成時に --accelerator フラグで gpu-driver-version オプションを指定して、ドライバの自動インストールを使用することをおすすめします。2023 年 1 月 25 日以前にインストール用の DaemonSet を使用して GPU ドライバを手動でインストールした場合は、DaemonSet を再適用して、ドライバの自動インストールを使用するノードを無視するバージョンを取得する必要があります。

インストール用の DaemonSet を実行するには、GPU ノードプールが Cloud Storage と通信するための https://www.googleapis.com/auth/devstorage.read_only スコープを必要とします。このスコープがないと、インストール用の DaemonSet マニフェストのダウンロードは失敗します。このスコープはデフォルトのスコープの一つであり、通常はクラスタの作成時に追加されます。

次の手順では、Container-Optimized OS(COS)ノードと Ubuntu ノードにドライバをインストールし、Terraform を使用する方法について説明します。

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 の容量を利用可能にします。

Container-Optimized OS イメージの各バージョンには、サポートされている NVIDIA GPU ドライバのバージョンが少なくとも 1 つあります。デフォルトでサポートされているバージョンについては、主要な Container-Optimized OS LTS マイルストーンのリリースノートをご覧ください。

次の表に、各 GKE バージョンで利用可能なドライバ バージョンを示します。

GKE NVIDIA ドライバのバージョン
1.30 R535(デフォルト)または R550
1.29 R535(デフォルト)または R550
1.28 R535(デフォルト)または R550
1.27 R470(デフォルト)、R525、R535、または R550
1.26 R470(デフォルト)、R525、R535、または R550

Ubuntu

デプロイするインストール DaemonSet は、次のように GPU タイプと GKE ノード バージョンによって異なります。

  • NVIDIA L4 GPU と NVIDIA H100 GPU を除くすべての GPU で、次のコマンドを実行します。

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/ubuntu/daemonset-preloaded.yaml
    
  • 2024-R05 リリース以降のノード バージョンを実行している NVIDIA L4 GPU または H100 GPU の場合は、R535 ドライバをインストールします。

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/ubuntu/daemonset-preloaded-R535.yaml
    
  • 2024-R05 リリースよりのリリース、またはこのリリースよりも後のリリースのノード バージョンを実行している NVIDIA L4 GPU または H100 GPU の場合は、R525 ドライバをインストールします。

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

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

次の表に、各 GKE バージョンで利用可能なドライバ バージョンを示します。

Ubuntu GPU ドライバと GKE のバージョン
1.30 R470 または R535
1.29 R470 または R535
1.28 R470 または R535
1.27 R470 または R535
1.26 R470 または R535

Terraform

Terraform を使用すると、ノードのタイプに応じてデフォルトの GPU ドライバのバージョンをインストールできます。どちらの場合も、kubectl_manifest Terraform リソースタイプを構成する必要があります。

  • COS に DaemonSet をインストールするには、Terraform 構成に次のブロックを追加します。

      data "http" "nvidia_driver_installer_manifest" {
        url = "https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml"
      }
    
      resource "kubectl_manifest" "nvidia_driver_installer" {
        yaml_body = data.http.nvidia_driver_installer_manifest.body
      }
    
  • Ubuntu に DaemonSet をインストールするには、Terraform 構成に次のブロックを追加します。

      data "http" "nvidia_driver_installer_manifest" {
        url = "https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/ubuntu/daemonset-preloaded.yaml"
      }
    
      resource "kubectl_manifest" "nvidia_driver_installer" {
        yaml_body = data.http.nvidia_driver_installer_manifest.body
      }
    

GPU でのノードの自動プロビジョニングを使用したドライバのインストール

ノードの自動プロビジョニングで GPU を使用する場合、デフォルトでは、自動プロビジョニングされたノードプールに十分なスコープが割り当てられていないため、ドライバをインストールできません。必要なスコープを付与するには、ノードの自動プロビジョニングのデフォルト スコープを変更して logging.writemonitoringdevstorage.read_onlycompute を追加します。次に例を示します。

gcloud container clusters update CLUSTER_NAME --enable-autoprovisioning \
    --min-cpu=1 --max-cpu=10 --min-memory=1 --max-memory=32 \
    --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

GKE バージョン 1.29.2-gke.1108000 以降では、自動プロビジョニングされた GPU ノードに自動的にインストールする、GKE の GPU ドライバ バージョンを選択できます。マニフェストに次のフィールドを追加します。

spec:
  nodeSelector:
    cloud.google.com/gke-gpu-driver-version: "DRIVER_VERSION"

DRIVER_VERSION は次のいずれかの値に置き換えます。

  • default - ノードの GKE バージョンに対応するデフォルトの安定版ドライバ。マニフェストで nodeSelector を省略した場合、これがデフォルトのオプションになります。
  • latest - ノードの GKE バージョンに対応する最新のドライバ バージョン。

自動プロビジョニングの詳細については、ノードの自動プロビジョニングを使用するをご覧ください。

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
  • 値: 使用する GPU アクセラレータのタイプ。 例: nvidia-tesla-t4

このノードセレクタをワークロードの 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-t4

アクセラレータ(GPU と TPU)を使用してノードプールをアップグレードする

GKE は、ノードプールを含む Standard クラスタを自動的にアップグレードします。ノードを新しいバージョンに早急に移行する必要がある場合は、ノードプールを手動でアップグレードすることもできます。クラスタのアップグレードの動作を制御するには、リリース チャンネルメンテナンスの時間枠と除外ロールアウトのシーケンスを使用します。

サージ アップグレードBlue/Green アップグレードなど、ノードプールにノード アップグレード戦略を構成することもできます。これらの戦略を構成することで、環境の速度と中断の最適なバランスが実現されるようにノードプールをアップグレードできます。マルチホスト TPU スライス ノードプールの場合、GKE は、構成済みのノード アップグレード戦略を使用せずに、1 つのステップでノードプール全体をアトミックに再作成します。詳細については、GKE の TPU に関連する用語の「アトミック性」の定義をご覧ください。

ノードのアップグレード戦略を使用する場合は、構成に応じて、GKE が一時的に追加のリソースをプロビジョニングする必要があります。Google Cloud でノードプールのリソースの容量が限られている場合(たとえば、GPU または TPU を使用してノードを追加しようとするとリソースの可用性エラーが表示される場合)は、リソースが制限された環境でのアップグレードをご覧ください。

NVIDIA CUDA-X ライブラリについて

CUDA は、NVIDIA の GPU 用並列コンピューティング プラットフォームおよびプログラミング モデルです。CUDA アプリケーションを使用するには、使用するイメージにライブラリが必要となります。NVIDIA CUDA-X ライブラリを追加するには、コンテナ仕様の LD_LIBRARY_PATH 環境変数に次の値を追加し、独自のイメージをビルドして使用します。

ノードで実行されている GKE パッチ バージョンに、選択した CUDA バージョンと互換性のある GPU ドライバのバージョンが含まれていることを確認します。GKE のバージョンに関連付けられている GPU ドライバのバージョンのリストについては、現在の GKE バージョン表にリンクされた、対応する Container-Optimized OS のページをご覧ください。

GPU ノード ワークロードのパフォーマンスをモニタリングする

GKE クラスタでシステム指標が有効になっている場合、Cloud Monitoring で次の指標を使用して GPU ワークロードのパフォーマンスをモニタリングできます。

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

事前定義されたダッシュボードを使用して、GPU ノードを使用するクラスタをモニタリングできます。詳細については、オブザーバビリティ指標を表示するをご覧ください。クラスタとそのリソースのモニタリングに関する一般的な情報については、GKE のオブザーバビリティをご覧ください。

ワークロードの使用状況の指標を表示する

ワークロードの GPU 使用状況の指標は、Google Cloud コンソールの [ワークロード] ダッシュボードで表示できます。

ワークロードの GPU 使用状況を表示するには、以下の手順に沿って操作します。

  1. Google Cloud コンソールの [ワークロード] ページに移動します。

    [ワークロード] に移動
  2. ワークロードを選択します。

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

NVIDIA Data Center GPU Manager(DCGM)の指標を表示する

Google Cloud Managed Service for Prometheus を使用すると、NVIDIA DCGM 指標を収集して可視化できます。Autopilot クラスタの場合、GKE によってドライバがインストールされます。Standard クラスタの場合は、NVIDIA ドライバをインストールする必要があります。

GKE で管理されている DCGM パッケージをデプロイする方法については、NVIDIA Data Center GPU Manager(DCGM)の指標の収集と表示をご覧ください。

GPU ノードの正常終了を構成する

コントロール プレーンで 1.29.1-gke.1425000 以降が実行されている GKE クラスタでは、GPU ノードはシャットダウンの差し迫ったノードに警告する SIGTERM シグナルをサポートしています。GPU ノードでは、最大 60 分前のシャットダウン通知を構成できます。

この通知期間内にワークロードを正常に終了するように GKE を構成できます。Pod のマニフェストで、spec.terminationGracePeriodSeconds フィールドに最大 60 分(3600 秒)までの値を設定します。たとえば、通知時間を 10 分にするには、次のように Pod マニフェストの spec.terminationGracePeriodSeconds フィールドに 600 秒を設定します。

  spec:
    terminationGracePeriodSeconds: 600

GKE はベスト エフォートとしてこれらの Pod を正常に停止するよう最善を尽くし、トレーニング状態の保存など、定義された終了アクションを実行するよう試みます。

次のステップ