이 페이지 개선에 도움 주기
이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 GitHub에서 이 페이지 편집 링크를 선택합니다.
Amazon EKS에서 NVIDIA DRA 드라이버 또는 디바이스 플러그인 사용
Amazon EKS는 EKS 클러스터에서 NVIDIA GPU 디바이스를 관리하기 위한 두 가지 메커니즘(GPU용 NVIDIA DRA 드라이버 및 NVIDIA Kubernetes 디바이스 플러그인)을 지원합니다.
Karpenter, EKS 관리형 노드 그룹 또는 자체 관리형 노드에서 정적 용량 프로비저닝
다중 인스턴스 GPU(MIG) 또는 시간 분할과 같은 GPU 공유 기능을 사용하는 경우 DRA 드라이버와 함께 정적 구성을 사용하거나 NVIDIA 디바이스 플러그인을 사용하는 것이 좋습니다. 동적 MIG 및 시간 분할은 NVIDIA DRA 드라이버에서 알파 상태입니다. 최신 업데이트는 GitHub의 NVIDIA DRA driver releases
NVIDIA DRA 드라이버 및 NVIDIA 디바이스 플러그인 비교
| 기능 | NVIDIA DRA 드라이버 | NVIDIA 디바이스 플러그인 |
|---|---|---|
|
최소 Kubernetes 버전 |
1.34 |
모든 EKS 지원 Kubernetes 버전 |
|
EKS 컴퓨팅 |
Karpenter(정적 용량만 해당), 관리형 노드 그룹, 자체 관리형 노드 |
EKS 자율 모드, Karpenter, 관리형 노드 그룹, 자체 관리형 노드 |
|
EKS 최적화 AMI |
AL2023(NVIDIA), Bottlerocket |
AL2023(NVIDIA), Bottlerocket |
|
디바이스 알림 |
GPU 모델, 메모리, 드라이버 버전 및 토폴로지를 포함한 |
|
|
GPU 공유 |
(알파) 동적 MIG, MPS, 시간 분할 |
(GA) 정적 MIG, MPS, 시간 분할 |
|
ComputeDomains |
다중 노드 보안 GPU 통신에서 |
지원되지 않음 |
|
속성 기반 선택 |
CEL 표현식을 사용하여 모델, 메모리 또는 기타 속성을 기준으로 GPU 필터링 |
지원되지 않음 |
|
토폴로지 인식 EFA 할당 |
DRA 네이티브 토폴로지 인식 |
자동 토폴로지 인식(EKS 최적화 AL2023 AMI만 해당) |
NVIDIA DRA 드라이버 설치
GPU용 NVIDIA DRA 드라이버는 GPU 및 ComputeDomains와 같은 두 가지 유형의 리소스를 관리합니다. 두 개의 DRA kubelet 플러그인(gpu-kubelet-plugin 및 compute-domain-kubelet-plugin)을 실행합니다. 각각 설치 중에 개별적으로 활성화하거나 비활성화할 수 있습니다. 이 가이드는 GPU 할당에 초점을 맞춥니다. ComputeDomains 사용에 대해서는 Amazon EKS에서 P6e-GB200 UltraServers 사용 섹션을 참조하세요.
사전 조건
-
Karpenter, EKS 관리형 노드 그룹 또는 자체 관리형 노드 그룹을 통해 정적 용량이 프로비저닝된 Kubernetes 버전 1.34 이상을 실행하는 Amazon EKS 클러스터
-
NVIDIA GPU 인스턴스 유형이 있는 노드(예:
P또는G인스턴스). -
NVIDIA GPU에 대해 호스트 수준 구성 요소가 설치된 노드. EKS 최적화 AL2023 또는 Bottlerocket NVIDIA AMI를 사용하는 경우 호스트 수준 NVIDIA 드라이버, CUDA 사용자 모드 드라이버 및 컨테이너 툴킷이 사전 설치됩니다.
-
명령줄 환경에 설치된 Helm에 대한 자세한 내용은 Helm 설정 지침을 참조하세요.
-
클러스터와 통신하도록 구성된
kubectl. 자세한 내용은 kubectl 설치 또는 업데이트 섹션을 참조하세요.
절차
중요
GPU 디바이스 관리에 NVIDIA DRA 드라이버를 사용하는 경우 동일한 노드에 NVIDIA 디바이스 플러그인과 함께 배포하지 마세요. 이렇게 하면 기본 디바이스가 동일한 노드의 여러 포드에 자동으로 과다 구독될 수 있습니다.
Bottlerocket에서 내장 NVIDIA 디바이스 플러그인 비활성화
EKS 최적화 Bottlerocket NVIDIA 변형에는 NVIDIA 디바이스 플러그인이 포함되어 있으며 기본적으로 활성화되어 있습니다. DRA 드라이버는 동일한 노드에서 디바이스 플러그인과 함께 실행할 수 없습니다. DRA 드라이버를 사용하기 전에 Bottlerocket GPU 노드에서 내장 디바이스 플러그인을 비활성화합니다. Bottlerocket 노드 사용자 데이터에서 settings.kubelet-device-plugins.nvidia.enabled를 false로 설정합니다.
[settings.kubelet-device-plugins.nvidia] enabled = false
settings.kubelet-device-plugins.nvidia.enabled 설정은 Bottlerocket 버전 1.63.0 이상에서 사용할 수 있습니다. 이전 버전에서는 내장 NVIDIA 디바이스 플러그인을 비활성화할 수 없습니다. 자세한 내용은 GitHub의 bottlerocket-os/bottlerocket pull request #4856
-
Kubernetes SIG OCI 레지스트리에서 직접 NVIDIA DRA 드라이버를 설치합니다. 사용 가능한 버전을 찾으려면 GitHub의 NVIDIA DRA driver releases
를 참조하세요. helm install dra-driver-nvidia-gpu \ oci://registry.k8s.io/dra-driver-nvidia/charts/dra-driver-nvidia-gpu \ --version0.4.1\ --create-namespace \ --namespace nvidia \ --set resources.computeDomains.enabled=false \ --set gpuResourcesEnabledOverride=true고급 구성 옵션은 Kubernetes SIG 웹사이트의 NVIDIA DRA 드라이버 헬름 차트 값
을 참조하세요. 특정 차트 버전에 사용할 수 있는 값을 보려면 helm show values oci://registry.k8s.io/dra-driver-nvidia/charts/dra-driver-nvidia-gpu --version 0.4.1을 실행합니다. -
(선택 사항) DRA 드라이버를 통해 시간 분할을 사용하려면 이전 단계의
helm install명령에TimeSlicingSettings기능 게이트를 추가합니다. 이는 기본적으로 비활성화된 알파 기능입니다. 자세한 내용은 NVIDIA DRA 드라이버를 통해 GPU 시간 분할 사용 섹션을 참조하세요.--set featureGates.TimeSlicingSettings=true -
(선택 사항) DRA 드라이버를 통해 동적 MIG를 사용하려면 이전 단계의
helm install명령에DynamicMIG기능 게이트를 추가합니다. 이는 기본적으로 비활성화된 알파 기능입니다.DynamicMIG기능 게이트를PassthroughSupport,NVMLDeviceHealthCheck또는MPSSupport기능 게이트와 결합할 수 없습니다. 자세한 내용은 NVIDIA DRA 드라이버를 통해 MIG 사용 섹션을 참조하세요.--set featureGates.DynamicMIG=true -
DRA 드라이버 포드가 실행 중인지 확인하세요.
kubectl get pods -n nvidia -
DeviceClass객체가 생성되었는지 확인하세요.kubectl get deviceclassNAME AGE gpu.nvidia.com 60s -
ResourceSliceGPU 노드에 대해 객체가 게시되었는지 확인하세요.kubectl get resourcesliceDRA 드라이버를 사용하여 NVIDIA GPU를 요청하려면
gpu.nvidia.comDeviceClass를 참조하는ResourceClaimTemplate를 생성하고 포드 사양에서 이를 참조합니다. 다음 예제에서는 단일 GPU를 요청합니다. 토폴로지에 맞게 정렬된 EFA 인터페이스를 사용하여 NVIDIA GPU를 할당하는 단계는 토폴로지 인식 EFA 및 GPU/Neuron 디바이스 할당 섹션을 참조하세요.apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: single-gpu spec: spec: devices: requests: - name: gpu exactly: deviceClassName: gpu.nvidia.com count: 1 --- apiVersion: v1 kind: Pod metadata: name: gpu-workload spec: containers: - name: gpu-demo image: public.ecr.aws/amazonlinux/amazonlinux:2023-minimal command: ["/bin/sh", "-c"] args: ["nvidia-smi && tail -f /dev/null"] resources: claims: - name: gpu resourceClaims: - name: gpu resourceClaimTemplateName: single-gpu tolerations: - key: "nvidia.com/gpu" operator: "Exists" effect: "NoSchedule"
NVIDIA Kubernetes 디바이스 플러그인 설치
NVIDIA Kubernetes 디바이스 플러그인은 NVIDIA GPU를 nvidia.com/gpu 확장 리소스로 알립니다. 컨테이너 리소스 요청 및 제한에서 GPU를 요청합니다.
사전 조건
-
Amazon EKS 클러스터.
-
NVIDIA GPU 인스턴스 유형이 있는 노드(예:
P또는G인스턴스). -
EKS 최적화 AL2023 NVIDIA AMI를 사용하는 NVIDIA GPU 인스턴스 유형이 있는 노드. EKS 최적화 Bottlerocket AMI에는 NVIDIA 디바이스 플러그인이 포함되어 있습니다. 따라서 별도로 설치할 필요가 없습니다.
-
NVIDIA GPU에 대해 호스트 수준 구성 요소가 설치된 노드. EKS 최적화 AL2023 또는 Bottlerocket NVIDIA AMI를 사용하는 경우 호스트 수준 NVIDIA 드라이버, CUDA 사용자 모드 드라이버 및 컨테이너 툴킷이 사전 설치됩니다.
-
명령줄 환경에 설치된 Helm에 대한 자세한 내용은 Helm 설정 지침을 참조하세요.
-
클러스터와 통신하도록 구성된
kubectl. 자세한 내용은 kubectl 설치 또는 업데이트 섹션을 참조하세요.
절차
-
NVIDIA 디바이스 플러그인 헬름 차트 리포지토리를 추가하세요.
helm repo add nvdp https://nvidia.github.io/k8s-device-plugin -
로컬 헬름 리포지토리를 업데이트하세요.
helm repo update -
NVIDIA Kubernetes 디바이스 플러그인을 설치하세요.
helm install nvdp nvdp/nvidia-device-plugin \ --create-namespace \ --namespace nvidia선택 사항: GPU 특성 검색(GFD) 활성화
디바이스 플러그인은
nvidia.com/gpu확장 리소스를 광고하고 자체적으로 GPU 포드를 예약합니다. EKS 최적화 AL2023 NVIDIA AMI에서nvidia.com/gpu.present=true노드 레이블은nodeadm에 의해 부팅 시 이미 적용되므로 기본 GPU 예약에는 GPU 특성 검색(GFD)이 필요하지 않습니다.노드에
nvidia.com/gpu.product,nvidia.com/gpu.memory,nvidia.com/gpu.count, MIG 프로필 레이블, 드라이버/CUDA 버전과 같은 세부 GPU 속성으로 레이블을 지정하려면--set gfd.enabled=true를 사용하여 GFD를 활성화합니다. 이러한 레이블을 사용하면nodeSelector또는 노드 선호도를 사용하여 특정 GPU 유형을 대상으로 지정할 수 있습니다(예: A10G GPU 또는 특정 MIG 프로필에만 워크로드 예약). 시간 분할 및 MIG와 같은 GPU 공유 구성도 이러한 레이블을 사용합니다. 속성 기반 노드 선택 또는 GPU 공유가 필요하지 않은 경우 플래그를 생략할 수 있습니다.helm install nvdp nvdp/nvidia-device-plugin \ --create-namespace \ --namespace nvidia \ --set gfd.enabled=true워크로드가 GDRCopy를 사용하는 경우 활성화
k8s-device-pluginv0.19.0~v0.19.2에서는 GDRCopy 및 MOFED 기능이 기본적으로 활성화되었습니다. 이 기본 활성화는k8s-device-pluginv0.19.3에서 되돌려졌습니다. 이 되돌리기의 결과로 GDRCopy(gdrdrv)는 더 이상 포드 사양의NVIDIA_GDRCOPY=enabled환경 변수를 사용하여 컨테이너별로 활성화할 수 없으며, 이제 해당 변수는 무시됩니다.워크로드가 GDRCopy(GPUDirect RDMA 복사)를 사용하는 경우 설치 시
gdrcopyEnabled=true을 설정하여 디바이스 플러그인에서 이를 활성화해야 합니다.helm upgrade --install nvdp nvdp/nvidia-device-plugin \ --namespace nvidia \ --create-namespace \ --set gdrcopyEnabled=true(앞서 설명한 대로 GPU 특성 검색 레이블도 원하는 경우
--set gfd.enabled=true도 추가합니다.)GitHub의 NVIDIA GPU Operator
를 통해 NVIDIA 디바이스 플러그인을 관리하는 경우 운영자는 노드에 gdrdrv커널 모듈이 로드될 때GDRCOPY_ENABLED=true를 동적으로 설정합니다.자세한 내용은 GitHub의 NVIDIA k8s-device-plugin issue #1692
를 참조하세요. 참고
또한 GPU를 프로비저닝하는 데 필요한 모든 NVIDIA 소프트웨어 구성 요소의 관리를 자동화하는 GitHub의 NVIDIA GPU Operator
를 사용하여 NVIDIA Kubernetes 디바이스 플러그인을 설치하고 관리할 수 있습니다. -
NVIDIA 디바이스 플러그인 DaemonSet가 실행 중인지 확인하세요.
kubectl get ds -n nvidia nvdp-nvidia-device-pluginNAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE nvdp-nvidia-device-plugin 2 2 2 2 2 <none> 60s -
노드에 할당 가능한 GPU가 있는지 확인하세요.
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 1 ip-192-168-24-96.us-west-2.compute.internal 1
포드에서 NVIDIA GPU 요청
디바이스 플러그인을 사용하여 NVIDIA GPU를 요청하려면 컨테이너 리소스 요청 및 제한에서 nvidia.com/gpu 리소스를 지정합니다.
apiVersion: v1 kind: Pod metadata: name: nvidia-smi spec: restartPolicy: OnFailure containers: - name: gpu-demo image: public.ecr.aws/amazonlinux/amazonlinux:2023-minimal command: ["/bin/sh", "-c"] args: ["nvidia-smi && tail -f /dev/null"] resources: limits: nvidia.com/gpu: 1 requests: nvidia.com/gpu: 1 tolerations: - key: "nvidia.com/gpu" operator: "Equal" value: "true" effect: "NoSchedule"
이 테스트를 실행하려면 매니페스트를 적용하고 로그를 봅니다.
kubectl apply -f nvidia-smi.yaml kubectl logs nvidia-smi
예제 출력은 다음과 같습니다.
+-----------------------------------------------------------------------------------------+ | NVIDIA-SMI XXX.XXX.XX Driver Version: XXX.XXX.XX CUDA Version: XX.X | |-----------------------------------------+------------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 NVIDIA L4 On | 00000000:31:00.0 Off | 0 | | N/A 27C P8 11W / 72W | 0MiB / 23034MiB | 0% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ +-----------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=========================================================================================| | No running processes found | +-----------------------------------------------------------------------------------------+