このドキュメントでは、Google Distributed Cloud 上の VM ランタイムを使用して動作する仮想マシン(VM)で NVIDIA® GPU のサポートを有効にする方法について説明します。GKE on Bare Metal のノードに NVIDIA ドライバをインストールし、GPU が使用可能であることを確認して、GPU を VM に割り当てる方法について学習します。
準備
このドキュメントの内容を実施するには、次のリソースへのアクセス権が必要です。
- GKE on Bare Metal バージョン 1.12.0(
anthosBareMetalVersion: 1.12.0
)以降のクラスタへのアクセス権。ワークロードを実行可能な、どのクラスタタイプでも使用できます。必要に応じて、Compute Engine の GKE on Bare Metal を試すか、クラスタ作成の概要をご覧ください。 kubectl
のプラグインとしてインストールされたvirtctl
クライアント ツール。必要に応じて、virtctl クライアント ツールをインストールします。
サポートされている 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 バージョンをノードに使用します。
- GPU をサポートするために構成する GKE on Bare Metal ノードに接続します。
ノードのカーネル バージョンを取得します。
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 があるクラスタの各ノードで、このセクションの手順を繰り返します。
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 サポートを有効にするには、次の手順を行います。
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 を割り当てる
Anthos clusters on bare metal ノードと Google Distributed Cloud 上の 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 ハードウェアが使用可能であることを確認します。