Amazon EKS에서 NVIDIA GPU로 시간 조각화 사용하기
Amazon EKS에서 NVIDIA GPU로 시간 조각화 사용하기
시간 조각화는 여러 Pod가 단일 물리 NVIDIA GPU를 공유할 수 있게 해 줍니다. Kubernetes 스케줄러는 여러 Pod를 같은 GPU에 배치하고, GPU의 CUDA 스케줄러는 작업을 시간 다중화합니다. 시간 조각화는 가장 간단한 GPU 공유 전략이에요. 소프트웨어만 사용하며 특별한 하드웨어가 필요 없고 AWS의 모든 NVIDIA GPU 인스턴스 유형에서 작동합니다. 시간 조각화는 GPU를 공유하는 Pod 간 메모리 또는 컴퓨팅 격리를 제공하지 않아요. 요청 사이에 유휴 상태인 추론 서비스나 여러 사용자가 GPU를 공유하는 개발 환경처럼 GPU 활용도가 낮은 워크로드에 가장 잘 맞습니다. 하드웨어 수준 메모리·컴퓨팅 격리가 필요한 워크로드에는 Multi-Instance GPU (MIG)를 대신 사용하세요.
Amazon EKS에서 NVIDIA DRA driver 또는 NVIDIA device plugin으로 시간 조각화를 관리할 수 있어요.
시간 조각화는 정적 용량 프로비저닝을 사용할 때만 Karpenter와 함께 쓸 수 있습니다. 시간 조각화는 현재 EKS Auto Mode에서 사용할 수 없어요.
시간 조각화는 다음 상황에 잘 맞아요.
- GPU 활용도가 지속적으로 낮은 경우. 예를 들어 요청 사이에 유휴 상태인 지연 시간에 민감한 추론 서비스.
- 여러 개발자가 노트북이나 개발 작업을 위해 단일 GPU 노드를 공유하는 경우.
- 노드가
g5,g6,g6e패밀리처럼 MIG를 지원하지 않는 GPU 인스턴스 유형을 사용하는 경우. - 같은 GPU의 다른 Pod가 바빠서 Pod가 가끔 느려지는 것을 받아들일 수 있는 경우.
다른 접근 방식을 고려해야 할 때는 다음과 같습니다.
- 메모리 격리가 필요한 경우. 시간 조각화된 GPU의 Pod는 같은 GPU 메모리를 공유하며, 한 Pod가 다른 Pod가 의존하는 메모리를 고갈시킬 수 있어요. 메모리 격리에는 MIG를 사용하세요.
- 예측 가능한 Pod별 지연 시간이나 서비스 품질이 필요한 경우. GPU 스케줄러는 보장 없이 최선 노력(best-effort) 방식으로 슬롯 간 컴퓨팅을 공유합니다.
- 학습 워크로드를 실행하는 경우. 시간 조각화는 학습 효율을 떨어뜨리는 컨텍스트 스위칭을 추가합니다. 다른 Pod가 느리게 만든 체크포인트된 작업은 마지막 체크포인트부터 재시도해야 해요.
고려 사항 (Considerations)
프로덕션에서 시간 조각화를 사용하기 전에 다음 고려 사항을 검토하세요.
일반 고려 사항
- 메모리 격리 없음: 시간 조각화된 GPU를 공유하는 Pod는 그 메모리를 공유합니다. 한 Pod가 다른 Pod가 필요한 메모리를 할당할 수 있으며, 이는 메모리 부족 오류를 일으킬 수 있어요. 각 GPU를 공유하는 Pod 수를 워크로드의 메모리 풋프린트에 맞추세요. Pod가 정기적으로 대형 모델을 로드한다면 GPU당 공유 Pod 수를 줄이거나 MIG를 사용하세요.
- 최선 노력 컴퓨팅 공유: GPU 스케줄러는 Pod 간에 최선 노력 방식으로 컴퓨팅을 공유하며 각 Pod에 비례적 컴퓨팅을 보장하지 않습니다.
- 시간 조각화와 MPS는 같은 GPU를 공유할 수 없음: 시간 조각화는 GPU 컴퓨트 모드를
DEFAULT로 설정하는 반면, NVIDIA Multi-Process Service (MPS)는EXCLUSIVE_PROCESS를 요구해요. 같은 클러스터에서 두 전략을 모두 사용할 수 있지만, 같은 물리 GPU에서 동시에 사용할 수는 없습니다. 시간 조각화는 또한 MIG 인스턴스에는 효과가 없어요. 단일 MIG 인스턴스를 컨테이너 간에 공유하려면 MPS를 대신 사용하세요. - 컨테이너별 메트릭: 시간 조각화가 활성화되면 NVIDIA Data Center GPU Manager (DCGM)는 메트릭을 개별 컨테이너에 귀속시킬 수 없습니다. GPU 수준 메트릭은 계속 사용 가능하지만, 특정 Pod가 얼마나 많은 GPU 리소스를 소비했는지는 식별할 수 없어요.
NVIDIA DRA driver 고려 사항
- 알파 기능: DRA driver를 통한 시간 조각화는 기본적으로 비활성화된 알파 기능인
TimeSlicingSettings기능 게이트가 필요해요. 자세한 내용은 Use GPU time-slicing with the NVIDIA DRA driver를 참고하세요. - 사용자 매개 공유만 가능: Pod는 네임스페이스 범위인 같은
ResourceClaim또는ResourceClaimTemplate을 참조해야만 GPU를 공유하며, 따라서 공유가 네임스페이스를 넘을 수 없습니다. 시스템 매개 공유(System-mediated sharing)는 제안된 미래 기능이에요. - Bottlerocket에서 내장 device plugin 비활성화: DRA driver는 같은 노드에서 NVIDIA device plugin과 함께 실행될 수 없습니다. Bottlerocket에서는 Bottlerocket 버전 1.63.0 이상이 필요한 내장 device plugin을 비활성화해야 해요. 자세한 내용은 Install the NVIDIA DRA driver를 참고하세요.
- 컴퓨팅 지원: NVIDIA DRA driver는 Karpenter의 정적 용량 프로비저닝, EKS 관리형 노드 그룹, 자체 관리 노드에서 지원되며 EKS Auto Mode에서는 지원되지 않습니다. 자세한 내용은 Karpenter 웹사이트의 Karpenter static NodePool 문서를 참고하세요.
NVIDIA device plugin 고려 사항
- 슬롯이 있는 최선 노력 컴퓨팅 공유: device plugin은 GPU당 고정된 수의 슬롯을 광고합니다. 단일 Pod가 둘 이상의 슬롯을 요청하면 추가 컴퓨팅을 받지 못해요. 둘 이상의 슬롯을 요청하는 Pod를 거부하려면
fail-requests-greater-than-one옵션을 활성화하세요. - Karpenter로 프로비저닝: Karpenter는 GPU에서 시간 조각화가 활성화되어 있어도 각
nvidia.com/gpu요청을 물리 GPU로 계산합니다. 자세한 내용은 GitHub의 Karpenter issue #2140을 참고하세요. - EKS Auto Mode에서 미지원: EKS Auto Mode는 NVIDIA device plugin을 관리하며 그 구성을 노출하지 않습니다. 시간 조각화는 device plugin 구성이 필요하므로 EKS Auto Mode 노드에는 시간 조각화 구성을 적용할 수 없어요.
- 시간 조각화 구성 변경: NVIDIA device plugin은 시간 조각화
ConfigMap의 변경을 모니터링하지 않습니다. 구성을 업데이트한 후 device plugin을 재시작하세요.
구성 옵션 (Configuration options)
EKS 최적화 AL2023 및 Bottlerocket NVIDIA AMI에서 NVIDIA GPU용 시간 조각화를 사용할 수 있어요. 시간 조각화 설정은 NVIDIA DRA driver를 사용하는지 NVIDIA device plugin을 사용하는지에 따라 달라집니다.
NVIDIA DRA driver로 GPU 시간 조각화 사용
NVIDIA DRA driver에서는 Pod가 시간 조각화 GpuConfig와 함께 gpu.nvidia.com DeviceClass를 요청하는 공통 ResourceClaim을 참조해서 GPU를 공유합니다.
NVIDIA DRA driver는 현재 사용자 매개 시간 조각화를 구현합니다. GPU는 명시적으로 같은 클레임을 가리키는 Pod와 컨테이너 사이에서만 공유됩니다. ResourceClaim과 ResourceClaimTemplate은 네임스페이스 범위이므로, 이렇게 GPU를 공유하는 Pod는 같은 네임스페이스에 있어야 해요. 단일 Pod의 컨테이너 간 GPU를 공유하려면 각 컨테이너가 클레임의 같은 요청 이름을 참조하게 하세요. 다른 요청 이름을 참조하는 컨테이너는 각각 별도의 GPU를 받습니다. 필요한 각 시간 조각화 간격에 대해 별도의 ResourceClaimTemplate을 만들고, GPU를 공유하려는 각 네임스페이스에 하나씩 만드세요.
시스템 매개 시간 조각화는 드라이버가 사용자가 구성한 클레임이 아니라 시스템이 정의한 기준에 따라 독립적인 클레임(네임스페이스 간 포함)을 가로질러 GPU를 공유하는 것입니다. 시스템 매개 시간 조각화에 대한 자세한 내용은 GitHub의 System-mediated time-slicing of GPUs (issue #659)와 pull request #1257을 참고하세요.
중요
DRA driver를 통한 시간 조각화는 기본적으로 비활성화된 알파 기능인
TimeSlicingSettings기능 게이트가 필요합니다. 이 기능 게이트를 활성화하지 않고TimeSlicing공유 전략을 요청하면 드라이버가 장치를 준비하지 못하고, Pod는FailedPrepareDynamicResources이벤트와 함께ContainerCreating상태로 남으며error validating GPU config: unknown GPU sharing strategy: TimeSlicing을 보고해요. 알파 기능 사용의 위험을 받아들일 때만 기능 게이트를 켜세요.
사전 조건
- Kubernetes 1.34 이상을 실행하는 Amazon EKS 클러스터. NVIDIA DRA driver는 Karpenter의 정적 용량 프로비저닝, EKS 관리형 노드 그룹, 자체 관리 노드에서 지원됩니다.
- EKS 최적화 AL2023 NVIDIA AMI를 사용하는 NVIDIA GPU 인스턴스 유형의 노드.
TimeSlicingSettings기능 게이트가 활성화된 상태로 Install the NVIDIA DRA driver에 설명된 대로 설치된 NVIDIA DRA driver.
절차
TimeSlicing 공유 전략으로 GPU를 요청하는 ResourceClaim을 만듭니다. 이 클레임을 참조하는 여러 Pod는 같은 물리 GPU를 공유합니다.
Bottlerocket 노드에서 NVIDIA device plugin으로 GPU 시간 조각화 사용
Bottlerocket에서 NVIDIA device plugin으로 GPU 시간 조각화를 사용하려면 노드의 사용자 데이터에서 시간 조각화 설정을 제공해야 해요.
사전 조건
- Amazon EKS 클러스터. 다음 절차는 EKS 최적화 Bottlerocket NVIDIA AMI로 NVIDIA GPU 노드를 프로비저닝합니다.
- 다음 절차가 Bottlerocket 노드 사용자 데이터에서 시간 조각화 설정을 제공하기 위해 Karpenter
EC2NodeClass를 사용하므로, 클러스터에 Karpenter가 설치·구성되어 있어야 합니다. 자세한 내용은 Karpenter 웹사이트의 Getting Started with Karpenter를 참고하세요. - 클러스터와 통신하도록 구성된
kubectl. 자세한 내용은 Install or update kubectl을 참고하세요.
절차
GPU 노드의 Bottlerocket 사용자 데이터에 시간 조각화 설정을 추가합니다. 다음 예제는 GPU당 네 개의 슬롯을 구성합니다. 사용자 데이터를 제공하는 방식은 노드 프로비저닝 방식에 따라 달라요. 다음 예제는 Karpenter EC2NodeClass를 보여줍니다.
...
subnetSelectorTerms:
- tags:
karpenter.sh/discovery:
securityGroupSelectorTerms:
- tags:
karpenter.sh/discovery:
userData: |
[settings.kubelet-device-plugins.nvidia]
device-sharing-strategy = "time-slicing"
[settings.kubelet-device-plugins.nvidia.time-slicing]
replicas = 4
rename-by-default = false
fail-requests-greater-than-one = true
EOF
이 설정으로 프로비저닝된 노드가 클러스터에 조인하면 device plugin은 각 물리 GPU에 대해 네 개의 nvidia.com/gpu 슬롯을 광고합니다. 워크로드 사양의 nvidia.com/gpu 확장 리소스에 대한 컨테이너 리소스 요청 또는 한도로 이를 요청해요.
AL2023 노드에서 NVIDIA device plugin으로 GPU 시간 조각화 사용
AL2023에서는 Install the NVIDIA Kubernetes device plugin에 설명된 대로 NVIDIA device plugin을 설치하고 ConfigMap에 시간 조각화 구성을 제공합니다.
사전 조건
- EKS 최적화 AL2023 NVIDIA AMI와 NVIDIA GPU 인스턴스 유형을 사용하는 노드가 있는 Amazon EKS 클러스터.
- 명령줄 환경에 Helm 설치. 자세한 내용은 Setup Helm 지침을 참고하세요.
- 클러스터와 통신하도록 구성된
kubectl. 자세한 내용은 Install or update kubectl을 참고하세요.
절차
Install the NVIDIA Kubernetes device plugin에서 device plugin을 설치한 nvidia 네임스페이스에 시간 조각화 ConfigMap을 만듭니다. 이 예제는 GPU당 네 개의 슬롯을 구성합니다.
nvidia-device-plugin-config라는 이름의 ConfigMap을 만들고 적용한 후 device plugin을 업그레이드합니다.
helm upgrade nvdp nvdp/nvidia-device-plugin \
--namespace nvidia \
--reuse-values \
--set config.name=nvidia-device-plugin-config
참고
device plugin은
ConfigMap을 변경해도 자동으로 다시 로드되지 않습니다. 시간 조각화 구성을 업데이트한 후 변경 사항을 적용하려면 device plugin Pod를 재시작하세요.
GPU 시간 조각화가 활성화되었는지 확인
시간 조각화 노드가 Ready가 되면 device plugin이 예상된 수의 슬롯을 광고하고 Pod가 물리 GPU를 공유하는지 확인하세요.
참고
이 절차의 공유 UUID 확인은 Pod가 같은 물리 GPU에 배치될 때 시간 조각화를 가장 분명하게 보여줍니다. 단일 GPU가 있는 노드에서는 device plugin이 네 개의 슬롯을 광고하고 네 개의 Pod 모두 그 GPU를 공유하므로 같은 UUID를 보고합니다. 여러 물리 GPU가 있는 노드에서는 스케줄러가 Pod를 다른 GPU에 배치할 수 있어요. 시간 조각화가 활성화되어 있어도 그 Pod들은 다른 UUID를 보고합니다. 한 GPU에서 공유를 보여주려면 단일 GPU 인스턴스 유형에 워크로드를 스케줄링하세요. 예를 들어 Pod 사양에
node.kubernetes.io/instance-type: g6.2xlarge같은 노드 선택기를 추가하세요.
노드가 구성된 수의 GPU 슬롯을 광고하는지 확인합니다. GPU당 슬롯이 네 개면 물리 GPU가 하나인 노드는 4를 보고합니다.
kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"
예제 출력은 다음과 같습니다.
NAME GPU
ip-192-168-11-225.us-west-2.compute.internal 4
각각 하나의 GPU 슬롯을 요청하는 네 개의 레플리카를 실행하는 배포를 만듭니다.
더 알아보기 (Learn more)
출처: 문서