Data Center / Cloud

NVIDIA CUDA 13.4로 Kubernetes에서 메모리를 제한하는 GPU 공유 구현

오픈소스 GPU Fractioning Operator와 KAI Scheduler로 워크로드별 메모리 제한을 대규모로 적용

Reading Time: 4 minutes

많은 AI 워크로드에는 GPU 용량의 일부만 필요합니다. 이런 워크로드에 장치 전체를 할당하면 남는 용량을 활용하지 못할 수 있습니다. GPU를 공유하면 플랫폼 팀은 기존 인프라로 더 많은 워크로드를 처리할 수 있습니다.

NVIDIA GPU는 이미 여러 공유 방식을 지원합니다. Multi-Instance GPU인 MIG는 GPU를 하드웨어 수준에서 격리된 인스턴스로 나눕니다. 애플리케이션은 이 분할을 별도로 처리할 필요가 없습니다. time-slicing은 여러 프로세스가 번갈아 GPU를 쓰는 방식으로, 메모리 사용량을 강제로 제한하지는 않습니다. Multi-Process Service인 MPS는 별도의 주소 공간에서 프로세스를 동시에 실행합니다(sm-sharing).

CUDA 13.4는 MPS에 이미 있던 연산 공유 모드(sm-sharing)에 더해, 새로운 time-sharing 모드에서는 애플리케이션이 별도로 처리하지 않아도 정해진 메모리 범위를 넘지 못하도록 제한합니다.

이번 CUDA 릴리스의 주요 기능은 다음과 같습니다.

  • 정확한 메모리 크기: CUDA는 워크로드가 요청한 메모리 크기에 맞춰 사용량을 제한합니다. 한도를 넘는 메모리 할당은 용량이 더 작은 GPU를 사용할 때와 마찬가지로 실패합니다.
  • 범위: 워크로드마다 보장되는 메모리 최소값과 여유 메모리가 있을 때 사용할 수 있는 최대값을 정합니다.
  • 연산 모드: 워크로드마다 기본 time-sharing 모드 대신 sm-sharing 모드를 선택할 수 있습니다.
  • 투명한 메모리 제한: 각 워크로드에서는 자신에게 할당된 GPU 메모리만 보입니다.

빠진 조각: Kubernetes에서 활용하기

CUDA가 메모리 제한을 강제하더라도 Kubernetes 클러스터에서 이 기능을 바로 사용할 수 있는 것은 아닙니다. 모든 GPU 노드에서 다음 작업을 담당할 구성 요소가 필요합니다.

  • 이 기능에 필요한 데몬을 실행하고 관리합니다.
  • 프로세스가 시작되기 전에 각 Pod 컨테이너의 메모리 제한과 연산 모드를 적용합니다.
  • GPU 전체의 사용량이 아니라 분할 단위별 실제 사용량을 보고합니다.

어떤 스케줄러가 워크로드를 배치하든 이 작업은 노드에서 수행해야 합니다.

GPU Fractioning: 오픈소스 Kubernetes 오퍼레이터

새로운 오픈소스 Kubernetes 오퍼레이터인 gpu-fractioning은 GitHub의 KAI Scheduler 조직에서 확인할 수 있습니다. 이 오퍼레이터는 드라이버와 컨테이너 런타임 설정을 제공하는 NVIDIA GPU Operator와 함께 실행됩니다.

GPU Fractioning Operator는 세 가지 일을 맡습니다.

  • 모든 GPU 노드에서 MPS를 설정하고 실행합니다.
  • 각 워크로드의 메모리 제한과 연산 모드를 적용합니다.
  • 분할 단위별로 메모리와 연산 사용량을 측정합니다.

스케줄러가 GPU 할당을 오퍼레이터에 전달하는 방식

개발자가 Pod YAML에 리소스와 모드 어노테이션을 작성하면 스케줄러가 워크로드에 사용할 GPU를 선택합니다. 이어 메모리 할당과 연산 공유 모드를 컨테이너별 Pod 어노테이션에 기록합니다. GPU Fractioning Operator는 이 어노테이션을 읽어 할당된 GPU를 구성하고 워크로드의 메모리 제한과 연산 모드를 적용합니다.

어노테이션의미
nvidia.com/container.<name>.gpu-memory.request보장되는 GPU 메모리
nvidia.com/container.<name>.gpu-memory.limit컨테이너가 늘어날 수 있는 최대값
nvidia.com/container.<name>.gpu-compute.modetime-slicing(기본값) 또는 sm-sharing
nvidia.com/container.<name>.gpus.devices컨테이너에 할당된 GPU
표 1. GPU Fractioning Operator가 GPU 분할 단위의 제한을 적용할 때 읽는 컨테이너별 Pod 어노테이션

이 어노테이션을 기록할 수 있는 Kubernetes 스케줄러라면 CUDA로 GPU 분할에 따른 제한을 적용할 수 있습니다. 여유 메모리가 충분한 GPU를 고르고 한 GPU에 서로 다른 연산 모드가 섞이지 않도록 배치하는 일은 여전히 스케줄러가 담당합니다.

KAI Scheduler와 GPU Fractioning 사용하기

KAI Scheduler는 gpu-fractioning과 통합된 첫 번째 스케줄러입니다. v0.18.0부터 KAI Scheduler에는 NvFractions라는 GPU 공유 모드가 있습니다. KAI Scheduler가 워크로드마다 어느 GPU의 얼마만큼을 할당할지 정해 어노테이션에 기록하면(위 표 1 참고), gpu-fractioning이 노드에서 해당 제한을 적용합니다.

KAI Scheduler의 다른 공유 모드도 계속 사용할 수 있습니다. 관리자는 클러스터마다 사용할 모드를 하나씩 선택합니다. KAI를 설치할 때 NvFractions를 활성화할 수 있습니다.

helm upgrade -i kai-scheduler oci://ghcr.io/kai-scheduler/kai-scheduler/kai-scheduler \
  -n kai-scheduler --create-namespace \
  --set global.nvFractions.set=true

이 명령은 gpu-fractioning도 의존성으로 함께 설치합니다. 설치 후에는 Pod 어노테이션으로 GPU를 분할해 사용할 워크로드를 설정합니다.

핵심 어노테이션 네 가지로 다음 항목을 지정합니다.

  1. 메모리가 얼마나 필요한가
  2. 워크로드의 메모리 사용량을 어디까지 늘릴 수 있는가
  3. 연산을 어떻게 공유하는가
  4. GPU를 몇 개 사용하는가

메모리가 얼마나 필요한가: 요청

메모리를 요청하는 방법은 두 가지입니다.

  1. 절대 크기로 요청: 컨테이너별 NVIDIA 어노테이션과 표준 Kubernetes 단위를 사용합니다. 키에 컨테이너 이름(app)이 들어가므로 설정할 컨테이너를 정확히 지정할 수 있습니다.
  2. GPU 용량의 비율로 요청: KAI Scheduler의 기존 어노테이션을 사용합니다.
 gpu-fraction: "0.5"

어디까지 늘어날 수 있는가: 제한

이 기능은 KAI Scheduler에 새로 추가되었습니다. 워크로드는 보장받을 메모리 최소값(요청)과 여유 메모리가 있을 때 사용량을 늘릴 수 있는 최대값을 선언할 수 있습니다. 메모리 요청 방식에 따라 사용할 제한 어노테이션도 달라집니다.

요청 유형어노테이션예시
절대 크기nvidia.com/container.<c>.gpu-memory.limit“80Gi”
일부 비율kai.scheduler/container.<c>.gpu-memory.portion.limit“0.8”
표 2. 메모리 요청 유형별로 사용할 제한 어노테이션

제한은 선택 사항입니다. 생략하면 요청한 크기가 곧 제한이 되므로 워크로드는 그 크기까지만 메모리를 쓸 수 있습니다. 비율 제한은 gpu-fraction보다 크고 1보다 작아야 합니다.

연산을 어떻게 공유하는가: time-sharing 또는 sm-sharing

이제 연산도 나눌 수 있습니다. GPU를 공유하는 워크로드 수가 n이면 어느 방식이든 각 워크로드에 대략 1/n의 연산 자원이 돌아갑니다. 차이는 번갈아 쓰느냐 동시에 쓰느냐입니다.

  • time-slicing은 직렬 방식입니다. 워크로드가 GPU 전체를 번갈아 사용합니다. 모든 워크로드가 할당된 시간을 꽉 채워 쓰면 각각 전체 시간의 약 1/n을 사용합니다. 한 워크로드가 쓰지 않은 시간은 나머지가 똑같이 나눠 씁니다. 이 방식이 기본값입니다. 워크로드마다 별도의 오류 도메인에서 실행되므로 오류가 완전히 격리됩니다.
  • sm-sharing은 병렬 방식입니다. GPU의 스트리밍 멀티프로세서(SM)를 워크로드끼리 나눠 쓰며 동시에 계속 실행됩니다. 워크로드마다 SM을 미리 배정해 두지는 않습니다. 워크로드가 필요로 할 때마다 GPU 하드웨어가 SM을 할당하고 해제합니다. 모든 워크로드가 연산 중이면 분배 비율은 대략 1/n으로 수렴합니다. 한 워크로드의 연산이 줄면 해당 SM을 다른 워크로드가 사용하고 활성 워크로드가 하나뿐이면 SM 전체를 쓸 수 있습니다. 이 모드에서는 워크로드가 하나의 오류 도메인을 공유합니다.

연산 모드는 컨테이너별로 명시할 수 있습니다.

nvidia.com/container.app.gpu-compute.mode: "sm-sharing"   # or "time-slicing"

공유 GPU는 한 번에 한 가지 연산 모드로만 실행되므로 KAI Scheduler는 time-slicing 워크로드와 sm-sharing 워크로드를 같은 GPU에 배치하지 않습니다. KAI Scheduler는 연산 모드를 GPU 단위로 추적합니다. 따라서 같은 노드에서도 GPU가 다르면 두 모드를 모두 사용할 수 있습니다.

몇 개의 GPU를 사용하는가

여러 장치에서 분할 용량을 확보하려면 다음을 추가합니다.

gpu-fraction-num-devices: "4"

요청은 각 장치에 적용됩니다. 장치 4개에 40Gi를 요청하면 GPU 4개에서 각각 40Gi를 받습니다.

종합: GPU 분할 예시

다음은 GPU 4개에서 sm-sharing을 사용하면서 메모리의 절대 크기와 추가로 사용할 수 있는 여유분을 요청하는 예시입니다.

apiVersion: v1
kind: Pod
metadata:
  name: inference
  labels:
    kai.scheduler/queue: default-queue
  annotations:
    nvidia.com/container.app.gpu-memory.request: "40Gi"
    nvidia.com/container.app.gpu-memory.limit: "60Gi"       # optional
    nvidia.com/container.app.gpu-compute.mode: "sm-sharing" # optional, default time-slicing
    gpu-fraction-num-devices: "4"                           # optional, default 1
spec:
  schedulerName: kai-scheduler
  containers:
    - name: app
      image: nvcr.io/nvidia/cuda:13.0.2-base-ubuntu24.04

이 추론 서버는 GPU 4개에서 실행되며 GPU마다 40Gi를 보장받아야 합니다. 함께 배치된 워크로드가 메모리를 사용하지 않을 때는 최대 60Gi까지 쓸 수 있고 다른 워크로드와 차례를 나누지 않고 동시에 실행됩니다. sm-sharing에서는 워크로드가 하나의 오류 도메인을 공유하므로 함께 실행해도 신뢰할 수 있는 워크로드에 사용하십시오.

다음은 GPU 2개에서 기본 모드인 time-slicing으로 각 GPU의 절반을 요청하고 메모리 사용량을 80%까지 늘릴 수 있도록 설정한 예시입니다.

metadata:
  annotations:
    gpu-fraction: "0.5"
    gpu-fraction.limit: "0.8"  # optional
    nvidia.com/container.app.gpu-compute.mode: "time-slicing"    # optional
    gpu-fraction-num-devices: "2"                                # optional
spec:
  schedulerName: kai-scheduler
  containers:
    - name: app

노트북이나 소규모 파인튜닝 같은 개발 또는 배치 작업에 사용할 수 있는 설정입니다. GPU 2개에서 각각 절반의 용량을 보장받아야 하며 메모리에 여유가 있을 때는 사용량을 80%까지 늘릴 수 있는 작업을 가정했습니다. time-slicing에서는 각 워크로드가 별도의 오류 도메인에서 실행되므로 한 작업이 충돌해도 함께 실행 중인 다른 작업에 영향을 주지 않습니다. 컨테이너에서 nvidia-smi를 실행하면 GPU 2개가 보이고 각 GPU에 이 워크로드가 할당받은 메모리 용량이 표시되어야 합니다.

시작하기

KAI Scheduler와 GPU Fractioning Operator는 모두 GitHub의 KAI Scheduler 조직에 있으며, 세 가지 공유 메커니즘의 설치 및 구성 방법을 모두 안내합니다(관리자 가이드와 사용자 가이드 참고). 질문이나 기여를 원한다면 Slack 채널이나 격주로 열리는 커뮤니티 미팅에 참여해 보십시오.

CUDA 13.4에 대한 자세한 내용은 발표 자료를 참고하십시오.

2026년 11월 9일부터 12일까지 미국 유타주 솔트레이크시티에서 열리는 KubeCon + CloudNativeCon NA 2026에서도 참여할 수 있습니다.

Discuss (0)

Tags