Google Distributed Cloud 上の VM ランタイムを使用する VM で NVIDIA GPU を有効にして使用する

このドキュメントでは、Google Distributed Cloud 上の VM ランタイムを使用して動作する仮想マシン(VM)で NVIDIA® GPU のサポートを有効にする方法について説明します。GKE on Bare Metal のノードに NVIDIA ドライバをインストールし、GPU が使用可能であることを確認して、GPU を VM に割り当てる方法について学習します。

準備

このドキュメントの内容を実施するには、次のリソースへのアクセス権が必要です。

サポートされている Nvidia GPU カード

GKE on Bare Metal バージョン 1.13 以降では、次の NVIDIA GPU がサポートされています。

  • Tesla T4
  • Tesla P4
  • Tesla V100 SXM2 32 GB
  • A100 SXM4 40 GB
  • A100 PCIe 40 GB
  • A100 SXM4 80 GB
  • A100 PCIe 80 GB

ノードに NVIDIA ドライバをインストールする

VM で NVIDIA GPU を使用するには、GPU デバイスをサポートするように GKE on Bare Metal ノードを構成する必要があります。ノードに NVIDIA ドライバをインストールするには、クラスタ内の各ノード(NVIDIA GPU を含む)で次の手順を行います。このドキュメントでは、サポートされている Ubuntu バージョンをノードに使用します。

  1. GPU をサポートするために構成する GKE on Bare Metal ノードに接続します。
  2. ノードのカーネル バージョンを取得します。

    KERNEL_VERSION="$(uname -r)"
    
  3. Ubuntu ノードを更新し、適切なカーネル ヘッダーをインストールします。

    sudo apt update && \
    apt install -y linux-headers-${KERNEL_VERSION}
    
  4. 次のステップで NVIDIA ドライバをコンパイルできるように、build-essential パッケージをインストールします。

    sudo apt install -y build-essential
    
  5. GPU に適した NVIDIA ドライバ パッケージをダウンロードします。ドライバの全一覧については、NVIDIA ドライバのダウンロードをご覧ください。

    次の例では、Linux x86_64 バージョン 470.82.01 のドライバをダウンロードします。

    wget https://us.download.nvidia.com/tesla/470.82.01/NVIDIA-Linux-x86_64-470.82.01.run
    
  6. NVIDIA ドライバ パッケージをインストールします。前のステップでダウンロードした NVIDIA ドライバ パッケージの名前を使用します。

    sudo sh NVIDIA-Linux-x86_64-470.82.01.run \
      --accept-license \
      --silent \
      --no-nouveau-check
    
  7. NVIDIA カーネル モジュールを読み込みます。

    sudo modprobe nvidia
    
  8. NVIDIA GPU があるクラスタの各ノードで、このセクションの手順を繰り返します。

Google Distributed Cloud 上の VM ランタイムで GPU サポートを有効にする

GKE on Bare Metal ノードに NVIDIA ドライバをインストールしたら、Google Distributed Cloud 上の VM ランタイムで GPU サポートを有効にします。そうすると、VM がノード上の GPU にアクセスできます。

各ノードは次のプロセスの一環として再起動されます。VM がこの再起動プロセスの影響を受ける可能性があります。可能であれば、移行するように構成されている移行可能な VM は、他のノードに移行してください。詳細については、メンテナンス イベント中の VM のエビクション ポリシーを構成する方法についてのページをご覧ください。

Google Distributed Cloud 上の VM ランタイムで GPU サポートを有効にするには、次の手順を行います。

  1. VMRuntime カスタム リソースを編集します。

    kubectl edit vmruntime vmruntime
    
  2. enableGPU: true プロパティを VMRuntime マニフェストに追加します。

    apiVersion: vm.cluster.gke.io/v1
    kind: VMRuntime
    metadata:
      name: vmruntime
    spec:
      enabled: true
      enableGPU: true
    ...
    
  3. エディタで、VMRuntime カスタム リソースを保存して閉じます。

  4. vm-system Namespace の GPU コントローラのステータスを確認します。

    kubectl get pods --namespace vm-system  -w
    

    コントローラが有効になるまでに約 5 分を要します。すべての GPU コントローラの STATUSRunning が表示されるまで待ちます。次の出力例は、望ましい状態を示しています。

    NAME                                          READY  STATUS    RESTARTS     AGE
    gpu-controller-controller-manager-gwvcb       2/2    Running   0            10m
    kubevirt-gpu-dp-daemonset-2lfkl               1/1    Running   0            10m
    kubevm-gpu-driver-daemonset-5fwh6             1/1    Running   0            10m
    nvidia-gpu-dp-daemonset-9zq2w                 1/1    Running   0            10m
    nvidia-mig-manager-5g7pz                      1/1    Running   0            10m
    vm-controller-controller-manager-7b6df6979b   2/2    Running   2 (13m ago)  14m
    
  5. GPU コントローラによってすべてステータスが Running と報告されたときに、GPU が使用可能であることを確認します。

    kubectl get gpuallocations --namespace vm-system
    

    次の出力例は、ノード上の GPU が使用可能であることを示しています。GPU をサポートするクラスタ内の各ノードが表示されます。これらは次のセクションで VM に割り当てます。

    NAME       ALLOCATED   DEVICEMODEL
    bm-node1   true        Tesla A100 SXM4 40GB
    bm-node2   true        Tesla A100 SXM4 40GB
    

VM で使用する GPU を割り当てる

Anthos clusters on bare metal ノードと Google Distributed Cloud 上の VM ランタイムの GPU サポートを構成し、VM で使用する GPU を割り当てます。デフォルトの場合、GPU は Pod(コンテナ)で使用するために割り当てられます。

  1. VM で使用する GPUAllocation カスタム リソースを編集します。このステップでは、VM で使用するノードに GPU を割り当てます。

    kubectl edit gpuallocation NODE_NAME --namespace vm-system
    

    NODE_NAME は、GPU の割り当て元ノードの名前に置き換えます。

  2. VM に割り当てる GPU の数を構成します。初期状態では、すべての GPU が Pod に割り当てられます。

    VM と Pod に割り当てられる GPU の総数は、ノード内の GPU の数と同じであることが必要です。たとえば、ノードに 4 つの GPU があるとします。VM に 2 つの GPU を割り当てた場合は、2 つの GPU が Pod に割り当てられたままになります。1 つの GPU が未割り当てのままになるため、2 つの GPU を VM に、1 つの GPU を Pod に割り当てようとすると、GPUAllocation マニフェストは拒否されます。

    次の例に示すように、VM で使用するために割り当てるノード上の GPU の数を更新します。

    apiVersion: gpu.cluster.gke.io/v1
    kind: GPUAllocation
    metadata:
      name: gpu-w2
      namespace: vm-system
    spec:
      node: gpu-w2
      pod: 0
      vm: 4
    

    この例では、ノードにインストールされている 4 つの GPU がすべて VM に割り当てられます。Pod に割り当てられる GPU はありません。

  3. エディタで、GPUAllocation カスタム リソースを保存して閉じます。

  4. GPU が ALLOCATED ステータスを true として報告していることを確認します。

    kubectl get gpuallocations --namespace vm-system
    

    次の出力例は、ノード上の GPU が使用可能であることを示しています。

    NAME     ALLOCATED   DEVICEMODEL
    gpu-w1   true        Tesla A100 SXM4 40GB
    gpu-w2   true        Tesla A100 SXM4 40GB
    

GPU をサポートする VM の作成

これで、ノードで GPU を使用する VM を作成できます。VM カスタム リソースでは、ノードから割り当てる GPU の名前と数量を指定します。

  1. ホストから GPU カードの名前を取得します。

    kubectl describe node NODE_NAME
    

    NODE_NAME は、GPU 名の取得元となるホストの名前に置き換えます。

    次の出力例は、このノードに割り当て可能な GPU 名が NVIDIA_A100_SXM4_40GB であることを示しています。

    Name:               bm-node1
    Roles:              worker
    [...]
    Allocatable:
      cpu:                                         47810m
      [...]
      memory:                                      336929400Ki
      nvidia.com/gpu-vm-NVIDIA_A100_SXM4_40GB:     1
    [...]
    
  2. 任意のエディタで、VirtualMachine マニフェスト(my-gpu-vm.yaml など)を作成します。

    nano my-gpu-vm.yaml
    
  3. 次の YAML マニフェストをコピーして貼り付けます。

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - virtualMachineDiskName: VM_NAME-boot-dv
          boot: true
          gpu:
            model: nvidia.com/gpu-vm-GPU_NAME
            quantity: 1
    

    この YAML ファイルで、次の設定を定義します。

    • VM_NAME: VM の名前
    • GPU_NAME: VM に割り当てるノードの GPU 名。
      • この GPU 名は、前のステップの kubectl describe node コマンドの出力に表示されています(例: NVIDIA_A100_SXM4_40GB)。

    VM が eth0 をデフォルトの pod-network ネットワークに接続します。

    VM_NAME-boot-dv という名前のブートディスクがすでに存在している必要があります。詳細については、仮想ディスクを作成して管理するをご覧ください。

  4. エディタで、VM マニフェストを保存して閉じます。

  5. kubectl を使用して VM を作成します。

    kubectl apply -f my-gpu-vm.yaml
    
  6. VM が動作している場合は、VM に接続し、GPU ハードウェアが使用可能であることを確認します。

次のステップ