このドキュメントでは、GDC 上の VM ランタイムを使用して動作する仮想マシン(VM)で NVIDIA® GPU のサポートを有効にする方法について説明します。Google Distributed Cloud ノードに NVIDIA ドライバをインストールして、GPU が使用可能であることを確認し、GPU を VM に割り当てる方法を学習します。
始める前に
このドキュメントの内容を実施するには、次のリソースへのアクセス権が必要です。
- Google Distributed Cloud バージョン 1.12.0(
anthosBareMetalVersion: 1.12.0)以降のクラスタへのアクセス権。ワークロードを実行可能な、どのクラスタタイプでも使用できます。必要に応じて、Compute Engine 上の Google Distributed Cloud を試すか、クラスタ作成の概要をご覧ください。 kubectlのプラグインとしてインストールされたvirtctlクライアント ツール。必要に応じて、virtctl クライアント ツールをインストールします。
サポート対象の 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 バージョンをノードに使用します。
- GPU をサポートするために構成する Google Distributed Cloud ノードに接続します。
ノードのカーネル バージョンを取得します。
KERNEL_VERSION="$(uname -r)"Ubuntu ノードを更新し、適切なカーネル ヘッダーをインストールします。
sudo apt update && \ apt install -y linux-headers-${KERNEL_VERSION}次のステップで NVIDIA ドライバをコンパイルできるように、
build-essentialパッケージをインストールします。sudo apt install -y build-essentialGPU に適した 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.runNVIDIA ドライバ パッケージをインストールします。前のステップでダウンロードした NVIDIA ドライバ パッケージの名前を使用します。
sudo sh NVIDIA-Linux-x86_64-470.82.01.run \ --accept-license \ --silent \ --no-nouveau-checkNVIDIA カーネル モジュールを読み込みます。
sudo modprobe nvidiaNVIDIA GPU があるクラスタの各ノードで、このセクションの手順を繰り返します。
GDC 上の VM ランタイムで GPU のサポートを有効にする
Google Distributed Cloud ノードに NVIDIA ドライバをインストールしたら、GDC の VM ランタイムで GPU サポートを有効にします。これにより、VM がノード上の GPU にアクセスできるようになります。
各ノードは次のプロセスの一環として再起動されます。VM がこの再起動プロセスの影響を受ける可能性があります。可能であれば、移行するように構成されている移行可能な VM は、他のノードに移行してください。詳細については、メンテナンス イベント中の VM のエビクション ポリシーを構成する方法についてのページをご覧ください。
GDC の VM ランタイムで GPU サポートを有効にするには、次の操作を行います。
VMRuntimeカスタム リソースを編集します。kubectl edit vmruntime vmruntimeenableGPU: trueプロパティをVMRuntimeマニフェストに追加します。apiVersion: vm.cluster.gke.io/v1 kind: VMRuntime metadata: name: vmruntime spec: enabled: true enableGPU: true ...エディタで、
VMRuntimeカスタム リソースを保存して閉じます。vm-systemNamespace の GPU コントローラのステータスを確認します。kubectl get pods --namespace vm-system -wコントローラが有効になるまでに 5 分ほどかかります。すべての GPU コントローラの
STATUSがRunningになるまで待ちます。次の出力例は、望ましい状態を示しています。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) 14mGPU コントローラによってすべてステータスが
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(コンテナ)で使用するために割り当てられます。
VM での使用のために
GPUAllocationカスタム リソースを編集します。このステップでは、VM での使用にノードの GPU を割り当てます。kubectl edit gpuallocation NODE_NAME --namespace vm-systemNODE_NAMEは、GPU の割り当て元ノードの名前に置き換えます。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 はありません。
エディタで、
GPUAllocationカスタム リソースを保存して閉じます。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 の名前と数を指定します。
ホストから GPU カードの名前を取得します。
kubectl describe node NODE_NAMENODE_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 [...]任意のエディタで、
VirtualMachineマニフェスト(my-gpu-vm.yamlなど)を作成します。nano my-gpu-vm.yaml次の 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)。
- この GPU 名は、前のステップの
VM が
eth0をデフォルトのpod-networkネットワークに接続します。VM_NAME-boot-dvという名前のブートディスクがすでに存在している必要があります。詳細については、仮想ディスクを作成して管理するをご覧ください。エディタで、VM マニフェストを保存して閉じます。
kubectlを使用して VM を作成します。kubectl apply -f my-gpu-vm.yamlVM が動作している場合は、VM に接続し、GPU ハードウェアが使用可能であることを確認します。