NVIDIA GPU を設定して使用する

ベアメタル上の Google Distributed Cloud(ソフトウェアのみ)のBYO(Bring Your Own)ノード機能を使用すると、GPU を搭載したマシンなど、高度なハードウェアを活用して、クラスタのパフォーマンスと柔軟性を最大限に高めることができます。

このドキュメントでは、NVIDIA GPU Operator をインストールして使用し、Google Distributed Cloud で作成されたベアメタル クラスタを NVIDIA GPU で使用するように設定する方法について説明します。

NVIDIA GPU Operator は、Operator Framework を使用して、GPU デバイスのプロビジョニングと管理に必要な NVIDIA ソフトウェア コンポーネントを管理します。次の柔軟性と利点があるため、NVIDIA GPU Operator を使用することをおすすめします。

  • GPU タイプの選択: Google Distributed Cloud ソフトウェアのみは、最新の NVIDIA GPU Operator でサポートされている幅広い GPU タイプと互換性があります。

  • サポートされているオペレーティング システムの選択: クラスタ ワーカーノードでは、NVIDIA GPU でサポートされている任意のオペレーティング システム(OS)を使用できます。また、プリインストールされた GPU ドライバを使用するか、NVIDIA GPU Operator で動的ドライバ インストールを使用するかを選択できます。

  • デプロイモデルの選択: NVIDIA GPU は、ワーカーノードがあるクラスタタイプ(ユーザー クラスタ、スタンドアロン クラスタ、ハイブリッド クラスタ)で使用できます。

このページは、基盤となる技術インフラストラクチャのライフサイクルを管理する IT 管理者と運用担当者を対象としています。Google Cloud のコンテンツで参照する一般的なロールとタスク例の詳細については、一般的な GKE Enterprise ユーザーロールとタスクをご覧ください。

始める前に

次のセクションの手順を実行する前に、次の要件を満たしていることを確認してください。

  • 運用クラスタ: Google Distributed Cloud で作成された機能的な Bare Metal クラスタがあることを確認します。

  • NVIDIA GPU: NVIDIA GPU がクラスタ ワーカーノードにインストールされていることを確認します。NVIDIA GPU Operator のインストールに関する次のセクションでは、GPU が正しくインストールされ、オペレーティング システムによって認識されていることを確認する手順について説明します。

  • 互換性のある NVIDIA ドライバ バージョン: 使用する NVIDIA ドライバ バージョンは、GPU、オペレーティング システム、アプリケーションで使用する CUDA バージョンと互換性がある必要があります。NVIDIA ドライバのインストール オプションは次のとおりです。

    • 次のセクションで説明するように、NVIDIA GPU Operator を使用して、適切なバージョンの NVIDIA GPU ドライバをインストールします。

    • オペレーティング システム イメージにプリインストールされている NVIDIA ドライバを使用します。

    • NVIDIA ドライバ インストールのクイックスタート ガイドの手順に沿って、NVIDIA ドライバを手動でインストールします。

  • Helm バージョン 3.0.0 以降: 管理ワークステーションにパッケージ管理用の Helm コマンドライン インターフェースをインストールします。Helm を使用して NVIDIA GPU Operator をインストールします。次のコマンドを実行して、Helm コマンドライン ツールをダウンロードしてインストールできます。

    curl -fsSL -o get_helm.sh \
        https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
    chmod 700 get_helm.sh \
        ./get_helm.sh
    

NVIDIA GPU Operator をインストールして確認する

次の手順では、ベアメタル クラスタに NVIDIA GPU Operator をインストールし、GPU で動作していることを確認します。

  1. Peripheral Component Interconnect Express(PCIe)を介して接続されている GPU デバイスの場合は、次のコマンドを実行して、名前に「NVIDIA」を含むシステム PCI バスのリストを取得します。

    sudo lspci | grep NVIDIA
    

    出力は次のようになります。

    25:00.0 3D controller: NVIDIA Corporation Device 20b5 (rev a1)
    
  2. 特定のノードで NVIDIA System Management Interface(nvidia-smi)コマンドライン ツールを使用して、GPU デバイスの詳細情報を取得できます。

    nvidia-smi
    

    出力は次のようになります。

    +---------------------------------------------------------------------------------------+
    | NVIDIA-SMI 535.183.01             Driver Version: 535.183.1    CUDA Veersion 12.2     |
    |-----------------------------------------+----------------------+----------------------|
    | GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
    |                                         |                      |               MIG M. |
    |=========================================+======================+======================|
    |   0  NVIDIA A100 80GB PCIe          Off | 00000000:25:00.0 Off |                    0 |
    | N/A   30C    P0              44W / 300W |      0MiB / 81920MiB |      0%      Default |
    |                                         |                      |             Disabled |
    +-----------------------------------------+----------------------+----------------------+
    
    +---------------------------------------------------------------------------------------+
    | Processes:                                                                            |
    |  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
    |        ID   ID                                                             Usage      |
    |=======================================================================================|
    |  No running processes found                                                           |
    +---------------------------------------------------------------------------------------+
    
  3. 管理ワークステーションに NVIDIA Helm リポジトリを追加します。

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
        && helm repo update
    
  4. NVIDIA GPU Operator をインストールします。

    NVIDIA GPU Operator をインストールする際のコマンドには、次の 3 つの基本的なバリエーションがあります。

    • デフォルト構成で NVIDIA GPU Operator をインストールします。

      helm install --wait --generate-name \
          -n gpu-operator --create-namespace \
          nvidia/gpu-operator
      
    • --set フラグを使用して、カンマ区切りの Key-Value ペアのセットを渡し、構成オプションを指定します。

      helm install --wait --generate-name \
          -n gpu-operator --create-namespace \
          nvidia/gpu-operator \
          --set OPTION_1_NAME=OPTION_1_VALUE,OPTION_2_NAME=OPTION_2_VALUE
      

      構成オプションの詳細なリストについては、NVIDIA のドキュメントの一般的なチャートのカスタマイズ オプションをご覧ください。--set フラグの使用方法については、Helm ドキュメントの --set の形式と制限事項をご覧ください。

    • ノードに NVIDIA GPU ドライバがすでにインストールされている場合は、ドライバのインストールを無効にします。

      デフォルトでは、NVIDIA GPU Operator は、クラスタ内のすべての GPU ワーカーノードに最新の GPU ドライバまたは指定した GPU ドライバをデプロイします。これにより、NVIDIA GPU ドライバ コンテナを使用するには、GPU を搭載したすべてのワーカーノードで同じオペレーティング システム バージョンを実行する必要があります。この問題を回避するには、ノードに GPU ドライバを手動でインストールし、--set driver.enabled=falsehelm install コマンドを実行して、NVIDIA GPU Operator がドライバをデプロイしないようにします。

      helm install --wait --generate-name \
          -n gpu-operator --create-namespace \
          nvidia/gpu-operator \
          --set driver.enabled=false
      

    一般的なデプロイ シナリオとサンプル コマンドについては、NVIDIA のドキュメントの一般的なデプロイ シナリオをご覧ください。

  5. GPU リソースのエクスポートを確認します。

    NVIDIA GPU Operator がインストールされ、GPU ドライバとデバイス プラグインが正常に実行されている場合は、ノード リソースの Allocatable フィールドに GPU 数が正しく構成されていることがわかります。

    kubectl describe node GPU_NODE_NAME | grep Allocatable -A7
    

    GPU_NODE_NAME は、テスト対象の GPU を搭載したノードマシンの名前に置き換えます。

    出力は次のようになります。

    Allocatable:
      cpu:                127130m
      ephemeral-storage:  858356868519
      hugepages-1Gi:      0
      hugepages-2Mi:      0
      memory:             509648288Ki
      nvidia.com/gpu:     1
      pods:               250
    
  6. GPU が機能していることを確認するには、次のサンプル GPU ジョブを実行します。このジョブは nvidia-smi コマンドを実行します。

    export NODE_NAME=GPU_NODE_NAME
    
    cat <<EOF | kubectl create --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: test-job-gpu
    spec:
      template:
        spec:
          runtimeClassName: nvidia
          containers:
          - name: nvidia-test
            image: nvidia/cuda:12.0.0-base-ubuntu22.04
            command: ["nvidia-smi"]
            resources:
              limits:
                nvidia.com/gpu: 1
          nodeSelector:
            kubernetes.io/hostname: ${NODE_NAME}
          restartPolicy: Never
    EOF
    

    CLUSTER_KUBECONFIG は、クラスタの kubeconfig ファイルのパスに置き換えます。

  7. ログでサンプルジョブの出力を確認します。

    kubectl logs job/test-job-gpu –kubeconfig=CLUSTER_KUBECONFIG
    

    出力は次のようになります。

    +---------------------------------------------------------------------------------------+
    | NVIDIA-SMI 535.183.01             Driver Version: 535.183.1    CUDA Veersion 12.2     |
    |-----------------------------------------+----------------------+----------------------|
    | GPU  Name                 Persistence-M | Bus-Id        Disp.A | Volatile Uncorr. ECC |
    | Fan  Temp   Perf          Pwr:Usage/Cap |         Memory-Usage | GPU-Util  Compute M. |
    |                                         |                      |               MIG M. |
    |=========================================+======================+======================|
    |   0  NVIDIA A100 80GB PCIe          Off | 00000000:25:00.0 Off |                    0 |
    | N/A   30C    P0              44W / 300W |      0MiB / 81920MiB |      0%      Default |
    |                                         |                      |             Disabled |
    +-----------------------------------------+----------------------+----------------------+
    
    +---------------------------------------------------------------------------------------+
    | Processes:                                                                            |
    |  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
    |        ID   ID                                                             Usage      |
    |=======================================================================================|
    |  No running processes found                                                           |
    +---------------------------------------------------------------------------------------+
    

制限事項

Google Distributed Cloud で作成されたクラスタで NVIDIA GPU Operator を使用する場合、次の制限が適用されます。

  • 最新バージョンの NVIDIA GPU Operator をインストールすると、オペレーターによって適用された containerd 構成が、クラスタまたはノードプールの更新またはアップグレード中に上書きされる可能性があります。

  • サポートされているバージョンの Google Distributed Cloud には、containerd LTS リリース 1.6 がインストールされます。このリリースでは、Container Device Interface(CDI)は有効になりません。NVIDIA のドキュメントの コンテナ デバイス インターフェースのサポートの手順に沿って操作すると、nvidia-cdi ランタイムが機能しない場合があります。クラスタは引き続き想定どおりに動作しますが、一部の CDI 機能は使用できない場合があります。

  • ロードバランサ ノードプールは、7 日ごとに更新ジョブを自動的に実行します。このジョブは、NVIDIA GPU Operator によって追加されたものを含む containerd 構成を上書きします。

ベスト プラクティス

NVIDIA 構成の競合と問題を最小限に抑えるため、次の注意事項に従うことをおすすめします。

  • クラスタまたはノードプールをアップグレードまたは更新する前に、containerd 構成ファイル /etc/containerd/config.toml をバックアップします。このファイルには、nvidia ランタイム構成が含まれています。アップグレードまたは更新が正常に完了したら config.toml ファイルを復元し、containerd を再起動して構成変更を有効にします。

  • containerd 構成の競合や問題が発生しないように、GPU ノードをロードバランサ ノード(loadBalancer.nodePoolSpec)として使用しないでください。

サポートを利用する

Google Distributed Cloud での GPU の使用についてさらにサポートが必要な場合は、Cloud カスタマーケアにお問い合わせください。

オペレーティング システムでの GPU ハードウェアの設定や使用に関する問題については、ハードウェア ベンダーにお問い合わせいただくか、必要に応じて NVIDIA サポートに直接お問い合わせください。

ご意見をお寄せいただければ幸いです。