TT Lab
블로그 시작하기
배우기 러닝패스 코스

쿠버네티스 GPU 스케줄링과 AI 배치

스케줄러를 바꾸면 무엇이 달라지나

TT Lab 에서 이어서 보기

한 줄 요약

Kueue 가 기본 스케줄러 「앞에」 입장 관문을 세운다면, KAI-Scheduler 는 스케줄러 「자체를」 바꿉니다. 파드에 schedulerName: kai-scheduler 를 적으면 그 파드는 KAI 가 배치하고, 그 순간 큐 계층·갱 스케줄링·우선순위 선점·GPU 쪼개기가 「노드를 고르는 단계」 안에서 함께 결정됩니다. NVIDIA Run:ai 의 스케줄러를 공개한 것이고, 지금은 CNCF 샌드박스 프로젝트입니다.

왜 이게 필요했나

앞 모듈들에서 두 가지 틈을 보았습니다. Kueue 는 쿼터로 입장시켰지만 노드에 자리가 없어 Pending 인 작업이 있었고, LWS 는 그룹을 함께 만들었지만 리더만 뜬 반쪽 그룹이 생겼습니다. 둘 다 「입장이나 생성」 과 「배치」 가 다른 층이라서 생기는 틈입니다.

배치 단계에서 직접 「이 파드 셋이 「모두」 들어갈 자리가 있을 때만 셋 다 놓는다」 를 결정하면 그 틈이 닫힙니다. 이것이 갱 스케줄링입니다. 같은 자리에서 「이 작업은 저 작업을 밀어낼 만큼 급한가」, 「이 카드는 반으로 나눠 줘도 되는가」 를 함께 따지는 것이 KAI 의 설계입니다. 대가도 있습니다. 클러스터에 스케줄러가 둘이 되고, KAI 가 맡은 파드는 기본 스케줄러의 플러그인 생태계를 그대로 쓰지 못합니다.

어떻게 동작하나

Queue(scheduling.run.ai/v2)  계층 큐. 자원마다 quota(보장)·limit(상한)·overQuotaWeight(남는 몫 나누기 비율), priority
PodGroup                     함께 배치할 파드 묶음. pod-grouper 가 Job·JobSet·LWS 등을 보고 알아서 만든다
minMember                    PodGroup 이 배치되려면 함께 놓여야 하는 최소 파드 수(Job 은 주석 batch-min-member)
PriorityClass               train 50 · build-preemptible 75 · build 100 · inference 125 를 깔아 준다
                             100 이상은 선점당하지 않는 대신 큐의 quota 안에서만 돈다
GPU 쪼개기                    주석 gpu-fraction: "0.5" 또는 gpu-memory. 예약 파드가 카드 한 장을 잡고 나눠 준다

실험 VM(KAI v0.18.6, 구성요소 7개, 요청 메모리 합 약 1.8GiB)에서 잰 장면들입니다.

현장에서 만나는 모습

이 모듈의 실험에서 문서와 다르거나 문서에 없는 것을 셋 찾았습니다. 셋 다 기여 후보로 정리해 두었습니다.

Kueue 와 KAI 중 무엇을 고를지는 「기본 스케줄러를 그대로 둘 것인가」 로 갈립니다. 기존 워크로드와 플러그인을 건드리고 싶지 않으면 Kueue 로 입장만 다스리고, 갱·쪼개기·위상 인식 배치가 핵심이면 KAI 로 배치를 맡깁니다. Dynamo 의 멀티 노드 배포는 Grove 와 KAI 를 기본 조합으로 씁니다. 그 이야기가 다음 모듈입니다.

English corner

Gang scheduling means all or nothing at placement time, not at admission time.

gang, min member, preemptible, fraction 은 KAI 문서와 이슈에서 매일 보는 단어입니다.

다음 실습에서 할 것

큐 계층을 세우고 KAI 로 파드를 띄워 PodGroup 이 저절로 생기는 것을 봅니다. limit 을 비운 큐의 함정을 직접 밟고 고친 뒤, 갱 스케줄링으로 반쪽 실행을 막고, build 우선순위로 train 을 밀어내고, GPU 한 장을 둘이 나눠 받습니다.