

 **이 페이지 개선에 도움 주기** 

이 사용자 가이드에 기여하려면 모든 페이지의 오른쪽 창에 있는 **GitHub에서 이 페이지 편집** 링크를 선택합니다.

# Amazon EKS에서 NVIDIA GPU 디바이스 관리
<a name="device-management-nvidia"></a>

NVIDIA GPU는 기계 학습 훈련, 추론 및 고성능 컴퓨팅 워크로드에 널리 사용됩니다. Amazon EKS는 EKS 클러스터에서 NVIDIA GPU 디바이스를 관리하기 위한 두 가지 메커니즘(*GPU용 NVIDIA DRA 드라이버* 및 *NVIDIA Kubernetes 디바이스 플러그인*)을 지원합니다.

EKS 관리형 노드 그룹 또는 자체 관리형 노드 그룹과 함께 Kubernetes 버전 1.34 이상을 실행하는 클러스터의 새 배포에 대해 NVIDIA DRA 드라이버를 사용하는 것이 좋습니다. NVIDIA DRA 드라이버를 사용하면 컨테이너 사이에서 유연한 GPU 할당 및 GPU 공유가 가능합니다.

NVIDIA DRA 드라이버는 Karpenter 또는 EKS 자율 모드에서 지원되지 않습니다. Karpenter 및 EKS 자율 모드에서 [NVIDIA 디바이스 플러그인](#nvidia-device-plugin)을 사용합니다. 또한 NVIDIA 디바이스 플러그인은 EKS 관리형 노드 그룹 및 자체 관리형 노드에 대해서도 계속 지원됩니다.

## NVIDIA DRA 드라이버 및 NVIDIA 디바이스 플러그인 비교
<a name="_nvidia_dra_driver_vs_nvidia_device_plugin"></a>


| 기능 | NVIDIA DRA 드라이버 | NVIDIA 디바이스 플러그인 | 
| --- | --- | --- | 
| 최소 Kubernetes 버전 | 1.34 | 모든 EKS 지원 Kubernetes 버전 | 
| EKS 컴퓨팅 | 관리형 노드 그룹, 자체 관리형 노드 | EKS 자율 모드, Karpenter, 관리형 노드 그룹, 자체 관리형 노드 | 
| EKS 최적화 AMI | AL2023(NVIDIA) | AL2023(NVIDIA), Bottlerocket | 
| 디바이스 알림 | GPU 모델, 메모리, 드라이버 버전 및 토폴로지를 포함한 `ResourceSlice` 객체를 통한 다양한 속성 | `nvidia.com/gpu` 확장 리소스 수(정수) | 
| GPU 공유 | 동일한 포드의 여러 컨테이너가 공유 `ResourceClaim` 참조를 통해 GPU를 공유할 수 있음 | 지원되지 않음. 각 GPU는 하나의 컨테이너에만 할당됩니다. | 
| ComputeDomains | 다중 노드 보안 GPU 통신에서 `ComputeDomain` 리소스를 통해 다중 노드 NVLink(MNNVL) 관리 | 지원되지 않음 | 
| 속성 기반 선택 | CEL 표현식을 사용하여 모델, 메모리 또는 기타 속성을 기준으로 GPU 필터링 | 지원되지 않음 | 
| 토폴로지 인식 EFA 할당 | DRA 네이티브 토폴로지 인식 | 자동 토폴로지 인식(EKS 최적화 AL2023 AMI만 해당) | 

## NVIDIA DRA 드라이버 설치
<a name="nvidia-dra-driver"></a>

GPU용 NVIDIA DRA 드라이버는 GPU 및 ComputeDomains와 같은 두 가지 유형의 리소스를 관리합니다. 두 개의 DRA kubelet 플러그인(`gpu-kubelet-plugin` 및 `compute-domain-kubelet-plugin`)을 실행합니다. 각각 설치 중에 개별적으로 활성화하거나 비활성화할 수 있습니다. 이 가이드는 GPU 할당에 초점을 맞춥니다. ComputeDomains 사용에 대해서는 [Amazon EKS에서 P6e-GB200 UltraServers 사용](ml-eks-nvidia-ultraserver.md) 섹션을 참조하세요.

### 사전 조건
<a name="_prerequisites"></a>
+ EKS 관리형 노드 그룹 또는 자체 관리형 노드 그룹을 사용하여 Kubernetes 버전 1.34 이상을 실행하는 Amazon EKS 클러스터.
+ NVIDIA GPU 인스턴스 유형이 있는 노드(예: `P` 또는 `G` 인스턴스).
+ NVIDIA GPU에 대해 호스트 수준 구성 요소가 설치된 노드. EKS 최적화 AL2023 또는 Bottlerocket NVIDIA AMI를 사용하는 경우 호스트 수준 NVIDIA 드라이버, CUDA 사용자 모드 드라이버 및 컨테이너 툴킷이 사전 설치됩니다.
+ 명령줄 환경에 설치된 Helm에 대한 자세한 내용은 [Helm 설정 지침](helm.md)을 참조하세요.
+  클러스터와 통신하도록 구성된 `kubectl`. 자세한 내용은 [`kubectl` 설치 또는 업데이트](install-kubectl.md#kubectl-install-update) 섹션을 참조하세요.

### 절차
<a name="_procedure"></a>

**중요**  
GPU 디바이스 관리에 대해 NVIDIA DRA 드라이버를 사용하는 경우 동일한 노드에 NVIDIA 디바이스 플러그인과 함께 배포할 수 없습니다. 업데이트는 업스트림 Kubernetes [KEP-5004](https://github.com/kubernetes/enhancements/issues/5004)를 참조하세요.

**중요**  
현재 Bottlerocket에서 NVIDIA DRA 드라이버 사용은 지원되지 않습니다.

1. NVIDIA DRA 드라이버 헬름 차트 리포지토리를 추가하세요.

   ```
   helm repo add nvidia https://helm.ngc.nvidia.com/nvidia
   ```

1. 로컬 헬름 리포지토리를 업데이트하세요.

   ```
   helm repo update
   ```

1. NVIDIA DRA 드라이버의 최신 버전을 가져오세요.

   ```
   helm search repo nvidia/nvidia-dra
   ```

1. NVIDIA DRA 드라이버를 설치하세요.

   ```
   helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \
       --create-namespace \
       --namespace nvidia-dra-driver-gpu \
       --set resources.computeDomains.enabled=false \
       --set 'gpuResourcesEnabledOverride=true'
   ```

   고급 구성 옵션은 [NVIDIA DRA 드라이버 헬름 차트](https://github.com/kubernetes-sigs/nvidia-dra-driver-gpu/blob/main/deployments/helm/nvidia-dra-driver-gpu/values.yaml)를 참조하세요.

1. DRA 드라이버 포드가 실행 중인지 확인하세요.

   ```
   kubectl get pods -n nvidia-dra-driver-gpu
   ```

1. `DeviceClass` 객체가 생성되었는지 확인하세요.

   ```
   kubectl get deviceclass
   ```

   ```
   NAME            AGE
   gpu.nvidia.com  60s
   ```

1. `ResourceSlice` GPU 노드에 대해 객체가 게시되었는지 확인하세요.

   ```
   kubectl get resourceslice
   ```

   DRA 드라이버를 사용하여 NVIDIA GPU를 요청하려면 `gpu.nvidia.com` `DeviceClass`를 참조하는 `ResourceClaimTemplate`를 생성하고 포드 사양에서 이를 참조합니다. 다음 예제에서는 단일 GPU를 요청합니다. 토폴로지에 맞게 정렬된 EFA 인터페이스를 사용하여 NVIDIA GPU를 할당하는 단계는 [토폴로지 인식 EFA 및 GPU/Neuron 디바이스 할당](device-management-efa.md#efa-dra-topology-aware) 섹션을 참조하세요.

   ```
   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: app
       ...
       resources:
         claims:
         - name: gpu
     resourceClaims:
     - name: gpu
       resourceClaimTemplateName: single-gpu
     tolerations:
     - key: "nvidia.com/gpu"
       operator: "Exists"
       effect: "NoSchedule"
   ```

## NVIDIA Kubernetes 디바이스 플러그인 설치
<a name="nvidia-device-plugin"></a>

NVIDIA Kubernetes 디바이스 플러그인은 NVIDIA GPU를 `nvidia.com/gpu` 확장 리소스로 알립니다. 컨테이너 리소스 요청 및 제한에서 GPU를 요청합니다.

### 사전 조건
<a name="_prerequisites_2"></a>
+ Amazon EKS 클러스터.
+ EKS 최적화 AL2023 NVIDIA AMI를 사용하는 NVIDIA GPU 인스턴스 유형이 있는 노드. EKS 최적화 Bottlerocket AMI에는 NVIDIA 디바이스 플러그인이 포함되어 있으며 별도의 설치가 필요하지 않습니다.
+ 명령줄 환경에 설치된 Helm에 대한 자세한 내용은 [Helm 설정 지침](helm.md)을 참조하세요.
+  클러스터와 통신하도록 구성된 `kubectl`. 자세한 내용은 [`kubectl` 설치 또는 업데이트](install-kubectl.md#kubectl-install-update) 섹션을 참조하세요.

### 절차
<a name="_procedure_2"></a>

1. NVIDIA 디바이스 플러그인 헬름 차트 리포지토리를 추가하세요.

   ```
   helm repo add nvdp https://nvidia.github.io/k8s-device-plugin
   ```

1. 로컬 헬름 리포지토리를 업데이트하세요.

   ```
   helm repo update
   ```

1. NVIDIA Kubernetes 디바이스 플러그인을 설치하세요.

   ```
   helm install nvdp nvdp/nvidia-device-plugin \
       --namespace nvidia \
       --create-namespace \
       --set gfd.enabled=true
   ```
**EFA 디바이스를 사용하여 노드에서 MOFED 비활성화**  
`k8s-device-plugin` v0.19.0부터 `--mofed-enabled` 플래그의 기본값은 `true`입니다. 이로 인해 NVIDIA 디바이스 플러그인은 GPU(`nvidia.com/gpu`)를 요청하는 컨테이너에 모든 `/dev/infiniband/uverbs*` 디바이스를 탑재합니다. 이는 `uverbs` 디바이스 탑재를 관리하는 AWS EFA 디바이스 플러그인과 충돌합니다. NVIDIA 디바이스 플러그인이 기본적으로 모든 `uverbs` 디바이스를 클레임하기 때문에 노드에서 모든 EFA 디바이스보다 적게 요청하는 워크로드는 영향을 받습니다.  
노드에 EFA 디바이스가 있는 경우 NVIDIA 디바이스 플러그인을 설치할 때 MOFED를 명시적으로 비활성화합니다.  

   ```
   helm upgrade --install nvdp nvdp/nvidia-device-plugin \
       --namespace nvidia \
       --create-namespace \
       --set gfd.enabled=true \
       --set mofedEnabled=false
   ```
[NVIDIA GPU 운영자](https://github.com/NVIDIA/gpu-operator)를 통해 NVIDIA 디바이스 플러그인을 관리하는 경우 `devicePlugin.env` 필드를 사용하여 MOFED를 비활성화합니다.  

   ```
   helm upgrade --install gpu-operator nvidia/gpu-operator \
       --namespace gpu-operator \
       --set 'devicePlugin.env[0].name=MOFED_ENABLED' \
       --set 'devicePlugin.env[0].value=false'
   ```
자세한 내용은 [NVIDIA k8s-device-plugin issue \#1692](https://github.com/NVIDIA/k8s-device-plugin/issues/1692)를 참조하세요.
**참고**  
또한 GPU를 프로비저닝하는 데 필요한 모든 NVIDIA 소프트웨어 구성 요소의 관리를 자동화하는 [NVIDIA GPU Operator](https://github.com/NVIDIA/gpu-operator)를 사용하여 NVIDIA Kubernetes 디바이스 플러그인을 설치하고 관리할 수 있습니다.

1. NVIDIA 디바이스 플러그인 DaemonSet가 실행 중인지 확인하세요.

   ```
   kubectl get ds -n nvidia nvdp-nvidia-device-plugin
   ```

   ```
   NAME                        DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
   nvdp-nvidia-device-plugin   2         2         2       2            2           <none>          60s
   ```

1. 노드에 할당 가능한 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 요청
<a name="_request_nvidia_gpus_in_a_pod"></a>

디바이스 플러그인을 사용하여 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                                                             |
+-----------------------------------------------------------------------------------------+
```