GPU 스케줄링하기

GPU 스케줄링하기 (Schedule GPUs)

클러스터의 노드에서 리소스로 사용할 GPU를 구성하고 스케줄링해요. 기능 상태: Kubernetes v1.26부터 Stable.

쿠버네티스는 디바이스 플러그인을 사용해 클러스터의 서로 다른 노드에서 AMD와 NVIDIA GPU(그래픽 처리 장치)를 관리하기 위한 안정적인 지원을 포함해요. 이 페이지는 사용자가 GPU를 어떻게 소비하는지 설명하고 구현의 일부 제한 사항을 설명해요.

출처: 문서

본문

디바이스 플러그인 사용하기 (Using device plugins)

쿠버네티스는 Pod가 GPU 같은 특수 하드웨어 기능에 접근할 수 있도록 디바이스 플러그인을 구현해요.

참고: 이 섹션은 쿠버네티스가 요구하는 기능을 제공하는 타사 프로젝트에 연결해요. 쿠버네티스 프로젝트 저자는 알파벳순으로 나열된 이 프로젝트들에 대해 책임이 없어요.

관리자로서 노드에 해당 하드웨어 공급업체의 GPU 드라이버를 설치하고 GPU 공급업체의 해당 디바이스 플러그인을 실행해야 해요. 공급업체의 안내 링크는 다음과 같아요.

  • AMD
  • Intel
  • NVIDIA

플러그인을 설치하면 클러스터는 amd.com/gpu 또는 nvidia.com/gpu 같은 커스텀 스케줄링 가능 리소스를 노출해요.

cpumemory를 요청하는 것과 같은 방식으로 커스텀 GPU 리소스를 요청해 컨테이너에서 GPU를 소비할 수 있어요. 다만 커스텀 디바이스의 리소스 요구 사항을 지정하는 방법에는 몇 가지 제한이 있어요.

GPU는 limits 섹션에서만 지정해야 해요. 즉:

  • requests를 지정하지 않고 GPU limits를 지정할 수 있어요. 쿠버네티스가 기본적으로 limit을 request 값으로 사용하기 때문이에요.
  • limitsrequests 모두에 GPU를 지정할 수 있지만 이 두 값은 같아야 해요.
  • limits를 지정하지 않고 GPU requests를 지정할 수 없어요.

다음은 GPU를 요청하는 Pod용 매니페스트의 예시예요.

apiVersion: v1
kind: Pod
metadata:
  name: example-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 # requesting 1 GPU

다양한 유형의 GPU가 있는 클러스터 관리하기 (Manage clusters with different types of GPUs)

클러스터의 서로 다른 노드에 서로 다른 유형의 GPU가 있다면, Node Labels와 Node Selectors를 사용해 파드를 적절한 노드에 스케줄링할 수 있어요.

예를 들어:

# Label your nodes with the accelerator type they have.
kubectl label nodes node1 accelerator=example-gpu-x100
kubectl label nodes node2 accelerator=other-gpu-k915

그 라벨 키 accelerator는 예시일 뿐이에요. 원한다면 다른 라벨 키를 사용할 수 있어요.

자동 노드 라벨링 (Automatic node labelling)

관리자로서 쿠버네티스 Node Feature Discovery(NFD)를 배포해 모든 GPU 활성 노드를 자동으로 발견하고 라벨링할 수 있어요. NFD는 쿠버네티스 클러스터의 각 노드에서 사용할 수 있는 하드웨어 기능을 감지해요. 일반적으로 NFD는 그 기능을 노드 라벨로 광고하도록 구성되지만, NFD는 확장 리소스, 어노테이션, 노드 taints를 추가할 수도 있어요. NFD는 지원되는 모든 쿠버네티스 버전과 호환돼요. 기본적으로 NFD는 감지된 기능에 대한 기능 라벨을 만들어요. 관리자는 NFD를 활용해 특정 기능으로 노드를 taint해서 해당 기능을 요청하는 파드만 그 노드에 스케줄링될 수 있게 할 수도 있어요.

또한 노드에 적절한 라벨을 추가하는 NFD용 플러그인이 필요해요. 이는 일반 라벨이거나 공급업체 특정 라벨일 수 있어요. GPU 공급업체가 NFD용 타사 플러그인을 제공할 수 있어요. 자세한 내용은 그 문서를 확인하세요.

apiVersion: v1
kind: Pod
metadata:
  name: example-vector-add
spec:
  restartPolicy: OnFailure
  # You can use Kubernetes node affinity to schedule this Pod onto a node
  # that provides the kind of GPU that its container needs in order to work
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: "gpu.gpu-vendor.example/installed-memory"
            operator: Gt # (greater than)
            values: ["40535"]
          - key: "feature.node.kubernetes.io/pci-10.present" # NFD Feature label
            values: ["true"] # (optional) only schedule on nodes with PCI device 10
  containers:
    - name: example-vector-add

(계속) 위 예시는 노드 어피니티를 사용해 컨테이너가 필요한 GPU 종류를 제공하는 노드에 Pod를 스케줄링하는 방법을 보여줘요. 나머지 세부 사항은 원문을 참고하세요.

더 알아보기 (Learn more)