이 문서에서는 GDC용 VM 런타임을 사용하여 실행되는 가상 머신(VM)에 NVIDIA® GPU 지원을 사용 설정하는 방법을 보여줍니다. 베어메탈용 GKE 노드에 NVIDIA 드라이버를 설치하고 GPU를 사용할 수 있는지 확인하며 GPU를 VM에 할당하는 방법을 알아봅니다.
시작하기 전에
이 문서를 완료하려면 다음 리소스에 대해 액세스 권한이 필요합니다.
- 베어메탈용 GKE 버전 1.12.0(
anthosBareMetalVersion: 1.12.0
) 이상 클러스터에 대한 액세스 권한. 워크로드 실행이 가능한 모든 클러스터 유형을 사용할 수 있습니다. 필요한 경우 Compute Engine에서 베어메탈용 GDCV를 사용해 보거나 클러스터 만들기 개요를 참조하세요. kubectl
의 플러그인으로 설치되는virtctl
클라이언트 도구. 필요한 경우 virtctl 클라이언트 도구를 설치합니다.
지원되는 Nvidia GPU 카드
베어메탈용 GKE 버전 1.13 이상은 다음 NVIDIA GPU를 지원합니다.
- Tesla T4
- Tesla P4
- Tesla V100 SXM2 32GB
- A100 SXM4 40GB
- A100 PCIe 40GB
- A100 SXM4 80GB
- A100 PCIe 80GB
노드에 NVIDIA 드라이버 설치
VM에 NVIDIA GPU를 사용할 수 있으려면 먼저 GPU 기기를 지원하도록 베어메탈용 GKE 노드를 구성해야 합니다. 노드에 NVIDIA 드라이버를 설치하려면 NVIDIA GPU가 포함된 클러스터의 각 노드에서 다음 단계를 완료합니다. 이 문서에서는 노드에 지원되는 Ubuntu 버전을 사용합니다.
- GPU 지원을 구성하려는 베어메탈용 GKE 노드에 연결합니다.
노드의 커널 버전을 가져옵니다.
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 지원 사용 설정
베어메탈용 GKE 노드에 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
네임스페이스에서 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 클러스터 노드 및 GDC용 VM 런타임에 GPU 지원이 구성되었으면 VM에 사용할 GPU를 할당합니다. 기본적으로 GPU는 포드(컨테이너)에 사용하도록 할당됩니다.
VM에 사용하도록
GPUAllocation
커스텀 리소스를 수정합니다. 이 단계에서는 VM에 사용하도록 노드에 GPU를 할당합니다.kubectl edit gpuallocation NODE_NAME --namespace vm-system
NODE_NAME
을 GPU를 할당하려는 노드 이름으로 바꿉니다.VM에 할당할 GPU 수를 구성합니다. 처음에는 모든 GPU가 포드에 할당됩니다.
VM 및 포드에 할당된 총 GPU 수가 노드에 있는 GPU 수와 동일해야 합니다. 예를 들어 노드에 GPU가 4개 있다고 가정해보세요. VM에 2개의 GPU를 할당하면 남은 2개의 GPU가 포드에 할당된 상태로 유지됩니다. VM에 2개의 GPU를 할당하고 포드에 1개의 GPU를 할당하려고 시도하면 하나의 GPU가 할당되지 않은 상태로 남기 때문에
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에 할당됩니다. 포드에는 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 [...]
원하는 편집기에서
my-gpu-vm.yaml
과 같은VirtualMachine
매니페스트를 만듭니다.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 이름은
NVIDIA_A100_SXM4_40GB
와 같이 이전 단계에서kubectl describe node
명령어의 출력에 표시됩니다.
- 이 GPU 이름은
VM이
eth0
을 기본pod-network
네트워크에 연결합니다.이름이
VM_NAME-boot-dv
인 부팅 디스크가 이미 있어야 합니다. 자세한 내용은 가상 디스크 만들기 및 관리를 참조하세요.편집기에서 VM 매니페스트를 저장하고 닫습니다.
kubectl
을 사용하여 VM을 만듭니다.kubectl apply -f my-gpu-vm.yaml
VM이 실행 중이면 VM에 연결하고 GPU 하드웨어가 사용 가능한지 확인합니다.