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

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

始める前に

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

サポート対象の NVIDIA GPU カード

Google Distributed Cloud バージョン 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 デバイスをサポートするように Google Distributed Cloud ノードを構成する必要があります。ノードに NVIDIA ドライバをインストールするには、クラスタ内の各ノード(NVIDIA GPU を含む)で次の手順を行います。このドキュメントでは、サポートされている Ubuntu バージョンをノードに使用します。

  1. GPU をサポートするために構成する Google Distributed Cloud ノードに接続します。
  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 があるクラスタの各ノードで、このセクションの手順を繰り返します。

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

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

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

GDC の 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 を割り当てる

ベアメタル クラスタノードと GDC 上の 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 ハードウェアが使用可能であることを確認します。

次のステップ