GPU 스케줄링

클러스터의 노드별로 리소스로 사용할 GPU를 구성하고 스케줄링한다.
기능 상태: Kubernetes v1.26 [stable]

쿠버네티스는 디바이스 플러그인을 사용하여 AMD 및 NVIDIA GPU(그래픽 프로세싱 유닛)를 여러 노드들에 걸쳐 관리하기 위한 안정적인 지원을 포함한다.

이 페이지는 사용자가 GPU를 활용할 수 있는 방법과, 몇 가지 제한 사항에 대하여 설명한다.

디바이스 플러그인 사용하기

쿠버네티스는 디바이스 플러그인을 구현하여 파드가 GPU와 같이 특별한 하드웨어 기능에 접근할 수 있게 한다.

관리자는 해당하는 하드웨어 벤더의 GPU 드라이버를 노드에 설치해야 하며, GPU 벤더가 제공하는 디바이스 플러그인을 실행해야 한다. 다음은 몇몇 벤더의 지침에 대한 웹페이지이다.

플러그인을 한 번 설치하고 나면, 클러스터는 amd.com/gpu 또는 nvidia.com/gpu를 스케줄 가능한 리소스로써 노출시킨다.

사용자는 이 GPU들을 cpumemory를 요청하는 방식과 동일하게 GPU 자원을 요청함으로써 컨테이너에서 활용할 수 있다. 그러나 리소스의 요구 사항을 명시하는 방식에 약간의 제약이 있다.

GPU는 limits 섹션에서만 명시되는 것을 가정한다. 그 의미는 다음과 같다.

  • 쿠버네티스는 limits를 requests의 기본 값으로 사용하게 되므로 사용자는 GPU limits 를 명시할 때 requests 명시하지 않아도 된다.
  • 사용자는 limitsrequests 를 모두 명시할 수 있지만, 두 값은 동일해야 한다.
  • 사용자는 limits 명시 없이는 GPU requests 를 명시할 수 없다.

다음은 GPU를 요청하는 파드에 대한 예제 매니페스트를 보여준다.

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vector-add
spec:
  restartPolicy: OnFailure
  containers:
    - name: example-vector-add
      image: "registry.example/example-vector-add:v42"
      resources:
        limits:
          gpu-vendor.example/example-gpu: 1 # 1 GPU 요청

다른 타입의 GPU들을 포함하는 클러스터

만약 클러스터의 노드들이 서로 다른 타입의 GPU를 가지고 있다면, 사용자는 파드를 적합한 노드에 스케줄 하기 위해서 노드 레이블과 노드 셀렉터를 사용할 수 있다.

예를 들면,

# 노드가 가진 가속기 타입에 따라 레이블을 단다.
kubectl label nodes node1 accelerator=example-gpu-x100
kubectl label nodes node2 accelerator=other-gpu-k915

accelerator 레이블 키를 accelerator로 지정한 것은 그저 예시일 뿐이며, 선호하는 다른 레이블 키를 사용할 수 있다.

노드 레이블링 자동화

만약 AMD GPU 디바이스를 사용하고 있다면, 노드 레이블러를 배치할 수 있다. 노드 레이블러는 GPU 디바이스의 속성에 따라서 노드에 자동으로 레이블을 달아 주는 컨트롤러이다.

현재 이 컨트롤러는 다음의 속성에 대해 레이블을 추가할 수 있다.

  • 디바이스 ID (-device-id)
  • VRAM 크기 (-vram)
  • SIMD 개수 (-simd-count)
  • 계산 유닛 개수 (-cu-count)
  • 펌웨어 및 기능 버전 (-firmware)
  • GPU 계열, 두 개 문자 형태의 축약어 (-family)
    • SI - Southern Islands
    • CI - Sea Islands
    • KV - Kaveri
    • VI - Volcanic Islands
    • CZ - Carrizo
    • AI - Arctic Islands
    • RV - Raven
kubectl describe node cluster-node-23
Name:               cluster-node-23
Roles:              <none>
Labels:             beta.amd.com/gpu.cu-count.64=1
                    beta.amd.com/gpu.device-id.6860=1
                    beta.amd.com/gpu.family.AI=1
                    beta.amd.com/gpu.simd-count.256=1
                    beta.amd.com/gpu.vram.16G=1
                    kubernetes.io/arch=amd64
                    kubernetes.io/os=linux
                    kubernetes.io/hostname=cluster-node-23
Annotations:        node.alpha.kubernetes.io/ttl: 0
…

노드 레이블러가 사용된 경우, GPU 타입을 파드 스펙에 명시할 수 있다.

apiVersion: v1
kind: Pod
metadata:
  name: cuda-vector-add
spec:
  restartPolicy: OnFailure
  containers:
    - name: cuda-vector-add
      # https://github.com/kubernetes/kubernetes/blob/v1.7.11/test/images/nvidia-cuda/Dockerfile
      image: "registry.k8s.io/cuda-vector-add:v0.1"
      resources:
        limits:
          nvidia.com/gpu: 1
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        – matchExpressions:
          – key: beta.amd.com/gpu.family.AI # Arctic Islands GPU family
            operator: Exist

이것은 사용자가 지정한 GPU 타입을 가진 노드에 파드가 스케줄 되도록 만든다.

이 페이지는 쿠버네티스가 필요로 하는 기능을 제공하는 써드파티 프로젝트 또는 제품에 대해 언급하고 있습니다. 쿠버네티스 프로젝트 저자들은 이러한 써드파티 프로젝트 또는 제품에 대해 책임지지 않습니다. CNCF 웹사이트 가이드라인에서 더 자세한 내용을 확인합니다.

다른 써드파티 링크를 추가하는 변경을 제안하기 전에, 컨텐츠 가이드를 확인해야 합니다.