Queue와 Scheduler 사용
Kueue로 GPU 자원 요청의 대기와 우선순위를 관리하고, KAI Scheduler 또는 Volcano로 GPU 워크로드를 배치합니다.
지원 구성 요소
| 구성 요소 | 역할 |
|---|---|
| Kueue | 자원 대기열, 할당, 선점 관리 |
| KAI Scheduler | Gang Scheduling과 Network Topology 기반 배치 |
| Volcano | Gang Scheduling과 Network Topology 기반 배치 |
Queue를 사용하려면 담당 CS 채널을 통해 사전 접수해야 합니다. Queue 사용이 설정되면 Queue를 통해 모든 자원 생성과 삭제가 제어됩니다.
LocalQueue 생성
사용자 네임스페이스에 목적별 LocalQueue를 생성합니다. spec.clusterQueue에는 할당받은 네임스페이스와 같은 이름의 ClusterQueue를 지정합니다.
apiVersion: kueue.x-k8s.io/v1beta2
kind: LocalQueue
metadata:
name: <Queue 이름>
namespace: <사용자 namespace>
spec:
clusterQueue: <사용자 namespace>
fairSharing:
weight: "2"
kubectl apply -f localqueue.yaml
kubectl get localqueue -n <사용자 namespace>
fairSharing.weight는 Queue 간에 자원이 경쟁할 때 적용되는 상대적인 가중치입니다. 값이 클수록 동일한 조건에서 더 많은 자원을 할당받을 수 있습니다.
이름이 default인 LocalQueue를 생성하면 Queue 이름을 별도로 지정하지 않은 지원 워크로드에 default Queue가 적용됩니다. 워크로드의 용도를 명확히 구분해야 한다면 Queue 이름을 직접 지정하세요.
워크로드에 Queue 지정
워크로드의 metadata.labels에 kueue.x-k8s.io/queue-name을 추가합니다.
metadata:
labels:
kueue.x-k8s.io/queue-name: serving
Queue 이름은 annotation이 아니라 metadata.labels에 지정합니다. 존재하지 않는 LocalQueue를 지정하면 Workload가 자원을 할당받지 못합니다.
우선순위 지정
워크로드의 목적에 맞는 WorkloadPriorityClass를 지정합니다.
| 우선순위 이름 | 가중치 |
|---|---|
low | 100 |
normal | 500 |
high | 1000 |
critical | 1500 |
metadata:
labels:
kueue.x-k8s.io/priority-class: normal
높은 우선순위의 워크로드가 입장하면 낮은 우선순위의 기존 워크로드가 선점될 수 있습니다. high와 critical은 운영상 필요한 경우에만 사용하세요.
KAI Scheduler 사용
NVIDIA Dynamo와 같이 KAI Scheduler 연동이 필요한 워크로드에는 활성화 라벨과 schedulerName을 함께 지정합니다.
metadata:
labels:
kai.scheduler/enabled: "true"
spec:
schedulerName: kai-scheduler
Network Topology 배치는 같은 Spine Switch에 연결된 GPU 노드를 우선하도록 기본 설정되어 있습니다.
Volcano 사용
Gang Scheduling이 필요한 워크로드의 schedulerName에 volcano-scheduler를 지정합니다.
spec:
schedulerName: volcano-scheduler
Network Topology 제약은 soft 또는 hard 모드로 설정할 수 있습니다.
spec:
podGroupPolicy:
volcano:
networkTopology:
mode: hard
highestTierAllowed: 1
| 모드 | 동작 |
|---|---|
soft | 가능한 범위에서 가까운 네트워크 토폴로지에 Pod를 배치하되, 조건을 충족하지 못해도 다른 노드에 배치 가능 |
hard | 지정한 토폴로지 조건을 충족할 때만 Pod 배치 |
highestTierAllowed: 1은 현재 Spine 구조에서 같은 Spine에 배치할 수 없으면 스케줄링하지 않도록 제한합니다. highestTierAllowed는 hard 모드에서만 지정합니다.
상태 확인
LocalQueue와 Kueue Workload 상태를 확인합니다.
kubectl get localqueue -n <사용자 namespace>
kubectl get workload -n <사용자 namespace>
kubectl describe workload <Workload 이름> -n <사용자 namespace>
Volcano로 생성된 PodGroup과 Pod 이벤트를 확인합니다.
kubectl get podgroup -n <사용자 namespace>
kubectl get pod -n <사용자 namespace> -o wide
kubectl describe pod <Pod 이름> -n <사용자 namespace>
Workload가 SchedulingGated 상태에 머물면 Queue 이름, 우선순위, 요청 자원과 Queue의 가용 자원을 확인합니다. Kueue가 Workload를 승인했지만 Pod가 Pending이면 Scheduler 이벤트와 Gang을 구성하는 전체 노드의 가용 여부를 확인합니다.