본문 바로가기
카테고리 없음

Kubernetes 환경에서 GPU 자원 스케줄링 최적화 전략: Nvidia Device Plugin, MIG, 쿠버네티스 스케줄러 확장까지

by frontier12 2025. 5. 28.






🧭 왜 GPU 자원 스케줄링이 중요한가?

AI/ML 워크로드가 늘어나며 Kubernetes 위에서 GPU를 할당하고 관리하는 것이 일반화되었지만,
기본 스케줄링만으로는 “과도한 자원 고립”, “불균형 GPU 할당”, “미활용 자원” 문제가 빈번하게 발생합니다.

이 글에서는 다음과 같은 GPU 관련 실전 이슈를 커버합니다:
• GPU 단위가 아닌 Sub-GPU(MIG) 레벨의 분배
• GPU Job의 큐잉/자원 대기 시간 최소화
• 쿠버네티스 스케줄러 확장을 통한 fine-grained 자원 제어



🧱 구성 요소 요약

구성 요소 역할 설명
Nvidia Device Plugin GPU 디바이스를 K8s 노드에 등록, 사용 가능한 리소스로 인식
MIG (Multi-Instance GPU) A100 같은 고성능 GPU를 sub-partition 하여 병렬 사용 가능
Kueue (Job Queueing) 대규모 GPU Job의 자원 풀 기반 대기열 스케줄링
Scheduler Extender 커스텀 스케줄러로 GPU 점유 상태, Job 우선순위 반영 가능




1. 기본 Device Plugin 설치

kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.0/nvidia-device-plugin.yml

기본 설치 시 /dev/nvidia0 형태의 장치들이 K8s의 리소스로 등록됩니다.
Pod 스펙에서 nvidia.com/gpu: 1과 같이 명시하여 요청 가능.



2. MIG 활성화 및 할당 전략

Nvidia A100/V100과 같은 고성능 GPU는 MIG(Multi-Instance GPU) 기능을 지원하여
GPU 하나를 여러 워크로드에 분할 제공할 수 있습니다.

sudo nvidia-smi mig -cgi 0,1,2,3,4,5,6,7 -C

• -cgi: MIG 인스턴스 생성 방식 정의 (e.g. 1g.5gb, 2g.10gb 등)
• MIG 인스턴스마다 nvidia.com/mig-1g.5gb 등의 리소스로 인식

이제 Pod에서는 다음과 같이 선언 가능:

resources:
  limits:
    nvidia.com/mig-1g.5gb: 1




3. GPU Job 스케줄링 최적화 - kueue 도입

Kueue는 GPU 자원을 Job 단위로 관리하는 K8s 네이티브 큐잉 컨트롤러입니다.

주요 기능:
• Job을 자원 풀 기반으로 큐잉
• 우선순위 기반 처리 (Fair share, FIFO 등)
• 자원 할당 가능 시 자동 실행

구성 예시

apiVersion: kueue.x-k8s.io/v1beta1
kind: LocalQueue
metadata:
  name: gpu-jobs
spec:
  clusterQueue: gpu-cluster




4. 스케줄러 확장 (Scheduler Extender) 전략

기본 kube-scheduler는 GPU 점유율, 온도, 상태 등을 고려하지 않음 → Scheduler Extender 사용

Extender 구성 예시 (config.yaml)

extenders:
  - urlPrefix: "http://gpu-scheduler-extender.default.svc.cluster.local:9000"
    filterVerb: "filter"
    prioritizeVerb: "prioritize"
    weight: 5
    nodeCacheCapable: true

Extender는 노드 상태 기반으로 필터링과 우선순위 점수를 부여합니다.

예: 남은 GPU memory > 16GB, MIG conflict 없음 등



5. 커스텀 스케줄러 우선순위 로직 예시 (Python Flask)

@app.route("/prioritize", methods=["POST"])
def prioritize():
    args = request.get_json()
    scores = []
    for node in args["nodes"]:
        gpu_free = check_gpu_status(node["name"])
        scores.append({"name": node["name"], "score": gpu_free})
    return jsonify({"nodeScores": scores})




6. 실전 운영 팁

상황 대응 전략
GPU 자원이 남지만 Job 대기 MIG + Queue 기반 자동 scaling 구성
노드 하나에만 Job 몰림 Topology Aware Scheduling 활성화
자원 충돌로 Pod 실패 Taint/Toleration 기반 격리 및 affinity 구성
GPU 사용률 낮음 Prometheus + DCGM Exporter로 실시간 모니터링




7. 결론

Kubernetes 환경에서도 GPU 자원을 정교하게 제어하는 것은
단순한 nvidia.com/gpu: 1 선언만으로는 부족합니다.

MIG, 스케줄러 확장, 큐잉 기반 Job 대기열, 실시간 자원 가시화까지 포함한
전체 GPU 관리 파이프라인을 구성해야 진짜 의미 있는 효율화를 이룰 수 있습니다.