GDC용 VM 런타임을 사용하여 VM에 NVIDIA GPU 사용 설정 및 사용

이 문서에서는 GDC용 VM 런타임을 사용하여 실행되는 가상 머신(VM)에 NVIDIA® GPU 지원을 사용 설정하는 방법을 보여줍니다. 베어메탈용 GKE 노드에 NVIDIA 드라이버를 설치하고 GPU를 사용할 수 있는지 확인하며 GPU를 VM에 할당하는 방법을 알아봅니다.

시작하기 전에

이 문서를 완료하려면 다음 리소스에 대해 액세스 권한이 필요합니다.

지원되는 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 버전을 사용합니다.

  1. GPU 지원을 구성하려는 베어메탈용 GKE 노드에 연결합니다.
  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 지원 사용 설정

베어메탈용 GKE 노드에 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 네임스페이스에서 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 할당

베어메탈용 Anthos 클러스터 노드 및 GDC용 VM 런타임에 GPU 지원이 구성되었으면 VM에 사용할 GPU를 할당합니다. 기본적으로 GPU는 포드(컨테이너)에 사용하도록 할당됩니다.

  1. VM에 사용하도록 GPUAllocation 커스텀 리소스를 수정합니다. 이 단계에서는 VM에 사용하도록 노드에 GPU를 할당합니다.

    kubectl edit gpuallocation NODE_NAME --namespace vm-system
    

    NODE_NAME을 GPU를 할당하려는 노드 이름으로 바꿉니다.

  2. 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가 할당되지 않습니다.

  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. 원하는 편집기에서 my-gpu-vm.yaml과 같은 VirtualMachine 매니페스트를 만듭니다.

    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 이름은 NVIDIA_A100_SXM4_40GB와 같이 이전 단계에서 kubectl describe node 명령어의 출력에 표시됩니다.

    VM이 eth0을 기본 pod-network 네트워크에 연결합니다.

    이름이 VM_NAME-boot-dv인 부팅 디스크가 이미 있어야 합니다. 자세한 내용은 가상 디스크 만들기 및 관리를 참조하세요.

  4. 편집기에서 VM 매니페스트를 저장하고 닫습니다.

  5. kubectl을 사용하여 VM을 만듭니다.

    kubectl apply -f my-gpu-vm.yaml
    
  6. VM이 실행 중이면 VM에 연결하고 GPU 하드웨어가 사용 가능한지 확인합니다.

다음 단계