このドキュメントでは、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-essential
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
NVIDIA ドライバ パッケージをインストールします。前のステップでダウンロードした NVIDIA ドライバ パッケージの名前を使用します。
sudo sh NVIDIA-Linux-x86_64-470.82.01.run \ --accept-license \ --silent \ --no-nouveau-check
NVIDIA カーネル モジュールを読み込みます。
sudo modprobe nvidia
NVIDIA GPU があるクラスタの各ノードで、このセクションの手順を繰り返します。
GDC 上の VM ランタイムで GPU のサポートを有効にする
Google Distributed Cloud ノードに NVIDIA ドライバをインストールしたら、GDC の VM ランタイムで GPU サポートを有効にします。そうすると、VM がノード上の GPU にアクセスできます。
各ノードは次のプロセスの一環として再起動されます。VM がこの再起動プロセスの影響を受ける可能性があります。可能であれば、移行するように構成されている移行可能な VM は、他のノードに移行してください。詳細については、メンテナンス イベント中の VM のエビクション ポリシーを構成する方法についてのページをご覧ください。
GDC の VM ランタイムで GPU サポートを有効にするには、次の操作を行います。
VMRuntime
カスタム リソースを編集します。kubectl edit vmruntime vmruntime
enableGPU: true
プロパティをVMRuntime
マニフェストに追加します。apiVersion: vm.cluster.gke.io/v1 kind: VMRuntime metadata: name: vmruntime spec: enabled: true enableGPU: true ...
エディタで、
VMRuntime
カスタム リソースを保存して閉じます。vm-system
Namespace の 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) 14m
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(コンテナ)で使用するために割り当てられます。
VM での使用のために
GPUAllocation
カスタム リソースを編集します。このステップでは、VM での使用にノードの GPU を割り当てます。kubectl edit gpuallocation NODE_NAME --namespace vm-system
NODE_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_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 [...]
任意のエディタで、
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.yaml
VM が動作している場合は、VM に接続し、GPU ハードウェアが使用可能であることを確認します。