KAI-Scheduler를 통한 쿠버네티스 GPU 공유의 혁신
쿠버네티스에서 GPU를 나눠쓰기가 어려운 이유
기본적으로 쿠버네티스(Kubernetes)는 GPU를 "1개"나 "2개"처럼 정수 단위로만 할당할 수 있어, 작업이 GPU의 일부만 필요해도 전체 자원을 차지합니다. 표준 스케줄러는 GPU를 부분적으로 사용하는 상황을 인식하지 못하며, 현재 GPU가 어느 정도 점유 중인지 파악하는 기능도 없습니다. 이런 한계 때문에 여러 작업이 GPU를 효율적으로 공유하기 어렵습니다.
KAI-Scheduler의 예약 파드(Reservation Pod) 방식
KAI-Scheduler는 이 문제를 스마트하게 해결합니다. 사용자가 "0.5개의 GPU"처럼 일부만 요청하면, KAI-Scheduler는 전체 GPU를 잠시 '예약'하는 작은 파드를 만듭니다. 이 파드가 GPU 전체를 차지하는 것처럼 보이게 해 기본 스케줄러의 추가 할당을 막고, 실제 사용은 내부적으로 GPU의 일부만 나눠주는 구조입니다.
실제 Reservation Pod 정의 예시
apiVersion: v1
kind: Pod
metadata:
name: runai-reservation-gpu-node-1-abc45
namespace: runai-reservation
labels:
app: runai-reservation
runai-gpu-group: gpu-group-xyz
app.runai.resource.reservation: runai-reservation-gpu
spec:
nodeName: node-1
serviceAccountName: runai-reservation
containers:
- name: runai-reservation
image: <resource-reservation-image>
resources:
limits:
nvidia.com/gpu: "1"
이 파드는 실제로 GPU 전체를 요청해 예약 표시를 남기는 역할을 합니다.
GPU 공유 요청 방법
서로 다른 작업이 하나의 GPU를 나누어 쓰도록 요청하려면, 파드에 특별한 주석(annotation)을 달아주면 됩니다.
전체 GPU의 일부(fraction) 사용:
apiVersion: v1 kind: Pod metadata: annotations: gpu-fraction: "0.5" spec: schedulerName: kai-scheduler containers: - name: ubuntu image: ubuntu args: ["sleep", "infinity"]
특정 GPU 메모리량(MiB) 요청:
apiVersion: v1 kind: Pod metadata: annotations: gpu-memory: "2000" spec: schedulerName: kai-scheduler containers: - name: ubuntu image: ubuntu args: ["sleep", "infinity"]
여러 GPU 장치를 일부씩 요청:
gpu-fraction: "0.5" gpu-fraction-num-devices: "2"
내부 동작 원리
KAI-Scheduler는 파드의 gpu-fraction/gpu-memory 요청을 해석해 필요한 GPU 자원량을 계산합니다. 각 노드의 실제 GPU 메모리와 비교하여 할당 가능한 자원을 찾고, 이미 공유 중인 GPU 그룹이 있으면 재사용하거나, 필요하면 새로운 Reservation Pod을 띄워 GPU를 예약합니다.
지정 GPU 식별 및 연결 방식
Reservation Pod가 실제 어느 물리 GPU에 할당되었는지 확인하는 절차도 중요합니다. 파드 내부에서 시스템 정보를 확인해 GPU의 UUID를 얻고, 이를 스스로의 파드에 annotation으로 기록합니다. KAI-Scheduler는 이 정보를 실시간으로 감지해서, 사용자 파드가 올바른 GPU에 접근할 수 있도록 환경변수(NVIDIA_VISIBLE_DEVICES)로 지정합니다.
전체 작동 흐름 요약
사용자가 gpu-fraction 또는 gpu-memory를 annotation으로 제출
KAI-Scheduler가 적합한 노드와 GPU를 결정
새로운 GPU가 필요하면 Reservation Pod 생성 및 예약
Reservation Pod가 실제 할당된 GPU UUID 정보를 스스로 annotation에 저장
KAI-Scheduler가 UUID를 확인하고, 사용자 파드에 적합한 환경 변수 세팅
사용자 파드가 예약된 GPU로 실행
마지막 사용자가 파드 실행을 종료하면 Reservation Pod 정리, GPU가 해제됨
장점과 한계
KAI-Scheduler 방식은 쿠버네티스 본래 기능을 건드리지 않고서도 유연하게 GPU 자원을 나눠쓸 수 있습니다. 전체 GPU 활용률이 크게 오르고, 여러 작업이 GPU를 동시에 사용할 수 있어 비용도 절감됩니다. 다만 하드웨어 수준의 강제 제한(하드 아이솔레이션)이 없어 해당 파드가 실제로 자신에게 할당된 이상으로 자원을 써버릴 수도 있으니, 애플리케이션에서 메모리 제한 설정을 병행하는 것이 바람직합니다.
하드 아이솔레이션(HAMi)과의 비교
KAI-Scheduler는 논리적 분리(soft isolation)를 제공해 신뢰할 수 있는 환경에 적합합니다. 반면 HAMi 같은 솔루션은 GPU 자원을 실제로 막아서(커널 수준에서 감시하거나 CUDA 콜 후킹 등) 여러 사용자 간의 완전한 분리를 보장합니다. 환경에 따라 둘 중 어떤 방식을 선택할지 고민해볼 수 있습니다.
요약 및 활용 제안
쿠버네티스에서 GPU가 자주 놀고 있는 상황이라면, KAI-Scheduler 도입으로 실제 필요한 만큼만 GPU를 나눠쓰는 구조를 쉽게 구축할 수 있습니다. 특히 AI/ML 인퍼런스 서버, 개발/테스트 환경, 사내 플랫폼에 매우 효과적인 방법이니, GPU 자원 효율이 고민된다면 적극 도입을 검토해볼 만합니다.