Skip to main content

GPU 자원 선점 사용

Kueue의 WorkloadPriorityClass를 사용하여 GPU 워크로드의 우선순위를 지정하고, 우선순위가 높은 워크로드가 낮은 워크로드의 자원을 선점하도록 설정할 수 있습니다.

선점 개요​

GPU 자원의 경합과 선점은 Kueue에서 관리합니다. 하나의 테넌트 네임스페이스는 하나의 ClusterQueue에 대응하며, 선점은 같은 ClusterQueue 안에서만 발생합니다. 다른 테넌트의 워크로드를 선점하거나 다른 테넌트의 워크로드에 의해 선점되지 않습니다.

항목설명
선점 범위같은 테넌트의 ClusterQueue
선점 대상새 워크로드보다 WorkloadPriorityClass 값이 낮은 실행 중 워크로드
테넌트 간 선점지원하지 않음
LocalQueue 간 입장 순서GPU 사용 이력 기반 Fair Sharing 및 LocalQueue weight에 따라 결정

테넌트의 ClusterQueue에는 할당된 자원에 맞는 quota와 다음 정책이 적용됩니다.

설정값설명
preemption.withinClusterQueueLowerPriority같은 ClusterQueue 안에서 우선순위가 낮은 워크로드만 선점
preemption.reclaimWithinCohortNever다른 테넌트의 워크로드를 선점하지 않음
admissionScope.admissionModeUsageBasedAdmissionFairSharingLocalQueue 간 GPU 사용 이력이 적은 Queue를 우선 입장
queueingStrategyBestEffortFIFO앞선 워크로드가 자원 부족으로 대기 중이어도 실행 가능한 후속 워크로드는 입장 가능

선점 조건​

다음 조건을 모두 충족하면 Kueue가 우선순위가 낮은 실행 중 워크로드를 내보내고 새 워크로드를 입장시킵니다.

  • 새 워크로드가 테넌트 ClusterQueue의 quota 안에 들어가지 못하는 경우
  • 같은 ClusterQueue 안에 새 워크로드보다 WorkloadPriorityClass 값이 낮은 실행 중 워크로드가 있는 경우
  • 우선순위가 낮은 워크로드를 내보내면 새 워크로드가 quota 안에 들어가는 경우

우선순위가 같거나 높은 워크로드는 선점되지 않습니다. 선점할 수 있는 워크로드가 없으면 새 워크로드는 자원을 사용할 수 있을 때까지 Queue에서 대기합니다.

우선순위 클래스​

다음 WorkloadPriorityClass를 사용할 수 있습니다.

이름값용도
low100선점되어도 되는 낮은 우선순위의 작업
normal500일반 작업에 사용하는 기본 우선순위
high1000높은 우선순위가 필요한 작업
critical1500즉시 실행해야 하는 긴급 작업
주의

high와 critical은 운영상 필요한 경우에만 사용하세요. 우선순위를 높여도 테넌트에 할당된 quota를 초과하여 사용할 수 없으며, 같은 테넌트에서 실행 중인 낮은 우선순위의 워크로드가 선점될 수 있습니다.

워크로드에 우선순위 지정​

워크로드의 kueue.x-k8s.io/priority-class 라벨에 사용할 우선순위 클래스 이름을 입력합니다.

TrainJob은 metadata.labels에 라벨을 추가합니다.

trainjob.yaml
apiVersion: trainer.kubeflow.org/v1alpha1
kind: TrainJob
metadata:
name: finetune-01
namespace: <사용자 namespace>
labels:
kueue.x-k8s.io/queue-name: training
kueue.x-k8s.io/priority-class: high
spec:
runtimeRef:
apiGroup: trainer.kubeflow.org
kind: ClusterTrainingRuntime
name: torch-distributed
trainer:
numNodes: 2
numProcPerNode: 8
resourcesPerNode:
requests:
nvidia.com/gpu: "8"
limits:
nvidia.com/gpu: "8"

Deployment, LeaderWorkerSet, DynamoGraphDeployment와 같이 Pod 단위로 Kueue가 관리하는 워크로드는 Pod 템플릿의 metadata.labels에 라벨을 추가합니다.

kueue.x-k8s.io/queue-name에는 사용자 네임스페이스에 생성한 LocalQueue 이름을 입력합니다. 워크로드를 생성할 때 Queue와 우선순위 라벨을 함께 지정하는 것을 권장합니다.

테넌트 전용 우선순위 클래스 생성​

기본 우선순위 사이에 별도의 등급이 필요하면 사용자 네임스페이스에 CustomWorkloadPriorityClass를 생성합니다. 플랫폼에서 같은 이름의 WorkloadPriorityClass를 생성합니다.

이름은 <사용자 namespace>-<우선순위 이름> 형식으로 입력합니다. 생성한 이름은 워크로드의 kueue.x-k8s.io/priority-class 라벨에 동일하게 입력합니다.

custom-priority-class.yaml
apiVersion: kakaocloud.io/v1alpha1
kind: CustomWorkloadPriorityClass
metadata:
name: <사용자 namespace>-urgent
namespace: <사용자 namespace>
spec:
value: 1200
description: 분기 마감 전 재학습

다음 명령어를 실행하여 생성 상태를 확인합니다.

kubectl get cwpc -n <사용자 namespace>

READY가 True이면 사용할 수 있습니다. 같은 이름의 WorkloadPriorityClass가 이미 있으면 READY가 False, reason이 NameConflict로 표시됩니다. 이 경우 다른 이름으로 다시 생성합니다.

metadata:
labels:
kueue.x-k8s.io/queue-name: training
kueue.x-k8s.io/priority-class: <사용자 namespace>-urgent
주의

CustomWorkloadPriorityClass를 삭제하면 연결된 WorkloadPriorityClass도 함께 삭제됩니다. 삭제된 클래스를 참조하는 새 워크로드는 WorkloadPriorityClassNotFound 경고와 함께 입장하지 못하므로, 삭제하기 전에 해당 클래스를 참조하는 워크로드가 없는지 확인하세요.

LocalQueue 간 입장 순서 조정​

같은 테넌트 안에서 팀별로 LocalQueue를 생성하여 워크로드의 입장 순서를 조정할 수 있습니다. 모든 LocalQueue는 테넌트의 ClusterQueue를 사용해야 하므로 spec.clusterQueue에는 사용자 네임스페이스와 같은 값을 입력합니다.

localqueue.yaml
apiVersion: kueue.x-k8s.io/v1beta2
kind: LocalQueue
metadata:
name: training
namespace: <사용자 namespace>
spec:
clusterQueue: <사용자 namespace>
fairSharing:
weight: "2"

fairSharing.weight 값이 클수록 GPU 사용 이력이 같은 조건에서 먼저 입장합니다. 이 값은 LocalQueue의 입장 순서에만 영향을 주며, 워크로드의 선점 여부는 WorkloadPriorityClass 값으로 결정됩니다.

LocalQueue를 생성하고 워크로드에 적용하는 방법은 Queue와 Scheduler 사용을 참고하세요.

선점된 워크로드 확인​

다음 명령어를 실행하여 Kueue Workload의 상태를 확인합니다.

kubectl get workloads -n <사용자 namespace>
kubectl describe workload -n <사용자 namespace> <Workload 이름>

선점된 Workload에는 다음 조건이 표시됩니다.

  • Evicted가 True, reason이 Preempted
  • Preempted 조건의 reason이 InClusterQueue
  • message에 선점한 워크로드의 UID와 JobUID 표시

message에 표시된 JobUID를 사용하여 선점한 워크로드를 확인할 수 있습니다.

kubectl get workloads -n <사용자 namespace> -l kueue.x-k8s.io/job-uid=<JobUID>

선점된 TrainJob은 Suspend 상태로 변경되며, Queue에서 다시 자원을 기다립니다.

주의 사항​

  • TrainJob에 scheduling.volcano.sh/queue-name annotation 또는 kai.scheduler/queue 라벨을 추가하지 마세요. TrainJob의 자원 통제와 선점은 Kueue가 담당하며, 해당 값을 추가하면 생성이 거부됩니다.
  • WorkloadPriorityClass는 Pod의 PriorityClass와 별개입니다. 워크로드의 선점 순서는 WorkloadPriorityClass 값으로 결정됩니다.
  • 우선순위를 높여도 테넌트에 할당된 quota를 초과하여 사용할 수 없습니다. 선점은 같은 테넌트의 quota 안에서 워크로드의 실행 순서를 조정합니다.