

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

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

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

 AWS Trainium 및 AWS Inferentia는 AWS에서 설계한 목적별 기계 학습 칩입니다. Amazon EKS는 EKS 클러스터에서 Neuron 디바이스를 관리하기 위한 두 가지 메커니즘(*Neuron DRA 드라이버* 및 *Neuron Kubernetes 디바이스 플러그인*)을 지원합니다.

EKS 관리형 노드 그룹 또는 자체 관리형 노드 그룹과 함께 Kubernetes 버전 1.34 이상을 실행하는 클러스터의 새 배포에 대해 Neuron DRA 드라이버를 사용하는 것이 좋습니다. Neuron DRA 드라이버는 사용자 지정 스케줄러 확장을 요구하지 않고도 토폴로지 인식 할당, 연결된 디바이스 하위 세트 예약, 논리적 NeuronCore(LNC) 구성 및 UltraServer 다중 노드 할당을 제공합니다.

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

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


| 기능 | Neuron DRA 드라이버 | Neuron 디바이스 플러그인 | 
| --- | --- | --- | 
| 최소 Kubernetes 버전 | 1.34 | 모든 EKS 지원 Kubernetes 버전 | 
| EKS 컴퓨팅 | 관리형 노드 그룹, 자체 관리형 노드 | EKS 자율 모드, Karpenter, 관리형 노드 그룹, 자체 관리형 노드 | 
| EKS 최적화 AMI 지원 | AL2023(Neuron), Bottlerocket | AL2023(Neuron), Bottlerocket | 
| 디바이스 알림 | 디바이스 ID, 인스턴스 유형, 토폴로지, 드라이버 버전, EFA 지역성을 포함한 `ResourceSlice` 객체를 통한 다양한 속성 | `aws.amazon.com/neuron` 및 `aws.amazon.com/neuroncore` 확장 리소스 수(정수) | 
| 연결된 디바이스 하위 세트 | 토폴로지 제약 조건을 사용하여 연결된 Neuron 디바이스의 1개, 4개, 8개 또는 16개의 하위 세트 할당 | 연속 디바이스 할당을 위해 [Neuron 스케줄러 확장](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/tutorials/k8s-neuron-scheduler.html) 필요 | 
| LNC 구성 | `ResourceClaimTemplate` 파라미터를 통한 워크로드별 논리적 NeuronCore 구성(LNC=1 또는 LNC=2) | EC2 시작 템플릿에서 사전 구성 필요 | 
| 속성 기반 선택 | CEL 표현식을 사용하여 인스턴스 유형, 드라이버 버전 및 기타 속성을 기준으로 디바이스 필터링 | 지원되지 않음 | 
| 토폴로지 인식 EFA 할당 | DRA 네이티브 토폴로지 인식 | 자동 토폴로지 인식(EKS 최적화 AL2023 AMI만 해당) | 

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

Neuron DRA 드라이버는 Neuron 디바이스를 `DeviceClass` 이름이 `neuron.aws.com`인 `ResourceSlice` 객체로 알립니다. 드라이버는 DaemonSet로 실행되며 Neuron 디바이스와 해당 토폴로지 속성을 자동으로 검색합니다.

Neuron DRA 드라이버에 대한 자세한 내용은 [Neuron DRA 설명서](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/neuron-dra.html#neuron-dra-driver-attributes-reference)에서 확인할 수 있습니다.

### 사전 조건
<a name="_prerequisites"></a>
+ EKS 관리형 노드 그룹 또는 자체 관리형 노드 그룹을 사용하여 Kubernetes 버전 1.34 이상을 실행하는 Amazon EKS 클러스터.
+ AWS Trainium 또는 Inferentia2 인스턴스 유형이 있는 노드.
+ 명령줄 환경에 설치된 Helm에 대한 자세한 내용은 [Helm 설정 지침](helm.md)을 참조하세요.
+  클러스터와 통신하도록 구성된 `kubectl`. 자세한 내용은 [`kubectl` 설치 또는 업데이트](install-kubectl.md#kubectl-install-update) 섹션을 참조하세요.

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

**중요**  
Neuron 디바이스 플러그인이 실행 중인 노드에 Neuron DRA 드라이버를 설치하지 마세요. 두 메커니즘은 동일한 노드에 공존할 수 없습니다. 업데이트는 업스트림 Kubernetes [KEP-5004](https://github.com/kubernetes/enhancements/issues/5004)를 참조하세요.

1. 헬름을 사용하여 드라이버를 설치하세요.

   ```
   helm upgrade --install neuron-helm-chart oci://public.ecr.aws/neuron/neuron-helm-chart \
       --namespace neuron-dra-driver \
       --create-namespace \
       --set "devicePlugin.enabled=false" \
       --set "npd.enabled=false" \
       --set "draDriver.enabled=true"
   ```

   드라이버는 기본적으로 `DeviceClass` `neuron.aws.com`을 사용하여 `neuron-dra-driver` 네임스페이스에 DaemonSet로 배포됩니다.

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

   ```
   kubectl get ds -n neuron-dra-driver neuron-dra-driver-kubelet-plugin
   ```

   ```
   NAME                              DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
   neuron-dra-driver-kubelet-plugin  1         1         1       1            1           <none>          60s
   ```

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

   ```
   kubectl get deviceclass neuron.aws.com
   ```

   ```
   NAME            AGE
   neuron.aws.com  60s
   ```

1. 노드에서 `ResourceSlice` 객체가 알려졌는지 확인하세요.

   ```
   kubectl get resourceslice
   ```

사용 가능한 `ResourceSlice` 객체 속성에 대한 자세한 내용은 [Neuron DRA 설명서](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/neuron-dra.html#neuron-dra-driver-attributes-reference)를 참조하세요.

### 포드에서 Neuron 디바이스 요청
<a name="_request_neuron_devices_in_a_pod"></a>

DRA 드라이버를 사용하여 Neuron 디바이스를 요청하려면 `neuron.aws.com` `DeviceClass`를 참조하는 `ResourceClaimTemplate`를 생성하고 포드 사양에서 이를 참조합니다.

다음 예제에서는 `trn2.48xlarge` 인스턴스에서 모든 Neuron 디바이스를 요청합니다.

```
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: all-neurons
spec:
  spec:
    devices:
      requests:
      - name: neurons
        exactly:
          deviceClassName: neuron.aws.com
          selectors:
          - cel:
              expression: "device.attributes['neuron.aws.com'].instanceType == 'trn2.48xlarge'"
          allocationMode: All
---
apiVersion: v1
kind: Pod
metadata:
  name: neuron-workload
spec:
  containers:
  - name: app
    ...
    resources:
      claims:
      - name: neurons
  resourceClaims:
  - name: neurons
    resourceClaimTemplateName: all-neurons
```

### 연결된 디바이스 하위 세트 할당
<a name="_allocate_connected_device_subsets"></a>

Neuron DRA 드라이버는 [Neuron 스케줄러 확장](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/tutorials/k8s-neuron-scheduler.html)을 요구하지 않고도 연결된 Neuron 디바이스의 하위 세트를 할당할 수 있습니다. 지원되는 하위 세트 크기는 1개, 4개, 8개 또는 16개 디바이스입니다. 토폴로지 그룹 ID와 함께 `matchAttribute` 제약 조건을 사용하여 디바이스가 연결되어 있는지 확인합니다.

다음 예제에서는 연결된 Neuron 디바이스 4개를 요청합니다.

```
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: 1x4-connected-neurons
spec:
  spec:
    devices:
      requests:
      - name: neurons
        exactly:
          deviceClassName: neuron.aws.com
          allocationMode: ExactCount
          count: 4
          selectors:
          - cel:
              expression: "device.attributes['neuron.aws.com'].instanceType == 'trn2.48xlarge'"
      constraints:
      - requests: ["neurons"]
        matchAttribute: "resource.aws.com/devicegroup4_id"
```

연결된 하위 세트에 대해 지원되는 `matchAttribute` 값은 `resource.aws.com/devicegroup1_id`, `resource.aws.com/devicegroup4_id`, `resource.aws.com/devicegroup8_id` 및 `resource.aws.com/devicegroup16_id`입니다. `devicegroup` 속성 이름의 숫자는 연결된 토폴로지 그룹에서 Neuron 디바이스 수에 해당합니다. 예를 들어 `resource.aws.com/devicegroup1_id`는 단일 Neuron 디바이스를 식별하고, `resource.aws.com/devicegroup4_id`는 4개의 연결된 디바이스로 구성된 그룹을 식별하고, `resource.aws.com/devicegroup8_id` 및 `resource.aws.com/devicegroup16_id`는 각각 8개 및 16개의 연결된 디바이스로 구성된 그룹을 식별합니다. 할당된 디바이스가 연결된 동일한 토폴로지 그룹에 속하도록 요청에서 `count` 디바이스와 일치하는 `matchAttribute`를 선택합니다. 이러한 속성에 대한 자세한 내용은 [Neuron DRA 드라이버 설명서](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/neuron-dra.html)를 참조하세요.

### 논리적 NeuronCores(LNC) 구성
<a name="_configure_logical_neuroncores_lnc"></a>

Neuron DRA 드라이버는 `ResourceClaimTemplate` 파라미터를 통해 워크로드별 논리적 NeuronCore 구성을 허용합니다. 따라서 EC2 시작 템플릿에서 LNC를 사전 구성하지 않아도 됩니다.

다음 예제에서는 LNC가 1로 설정된 모든 Neuron 디바이스를 요청합니다.

```
apiVersion: resource.k8s.io/v1
kind: ResourceClaimTemplate
metadata:
  name: all-neurons-lnc-1
spec:
  spec:
    devices:
      requests:
      - name: neurons
        exactly:
          deviceClassName: neuron.aws.com
          selectors:
          - cel:
              expression: "device.attributes['neuron.aws.com'].instanceType == 'trn2.48xlarge'"
          allocationMode: All
      config:
      - requests: ["neurons"]
        opaque:
          driver: neuron.aws.com
          parameters:
            apiVersion: neuron.aws.com/v1
            kind: NeuronConfig
            logicalNeuronCore: 1
```

### 정렬된 EFA 인터페이스를 사용하는 Neuron 디바이스 할당
<a name="_allocate_neuron_devices_with_aligned_efa_interfaces"></a>

[토폴로지 인식 EFA 및 GPU/Neuron 디바이스 할당](device-management-efa.md#efa-dra-topology-aware) 섹션을 참조하세요 

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

Neuron Kubernetes 디바이스 플러그인은 Neuron 디바이스를 `aws.amazon.com/neuron`으로, NeuronCores를 `aws.amazon.com/neuroncore` 확장 리소스로 알립니다. 컨테이너 리소스 요청 및 제한에서 Neuron 디바이스를 요청합니다.

### 사전 조건
<a name="_prerequisites_2"></a>
+ Amazon EKS 클러스터.
+ AWS Trainium 또는 AWS Inferentia 인스턴스에 대해 호스트 수준 구성 요소가 설치된 노드. EKS AL2023 가속 AMI 또는 EKS Bottlerocket AMI를 사용하는 경우에 포함됩니다.
+ 명령줄 환경에 설치된 Helm에 대한 자세한 내용은 [Helm 설정 지침](helm.md)을 참조하세요.
+  클러스터와 통신하도록 구성된 `kubectl`. 자세한 내용은 [`kubectl` 설치 또는 업데이트](install-kubectl.md#kubectl-install-update) 섹션을 참조하세요.

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

1. 헬름을 사용하여 Neuron Kubernetes 디바이스 플러그인을 설치하세요.

   ```
   helm upgrade --install neuron-helm-chart oci://public.ecr.aws/neuron/neuron-helm-chart \
       --set "npd.enabled=false"
   ```

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

   ```
   kubectl get ds -n kube-system neuron-device-plugin
   ```

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

1. 노드에 할당 가능한 Neuron 디바이스가 있는지 확인하세요.

   ```
   kubectl get nodes "-o=custom-columns=NAME:.metadata.name,NeuronDevice:.status.allocatable.aws\.amazon\.com/neuron,NeuronCore:.status.allocatable.aws\.amazon\.com/neuroncore"
   ```

   ```
   NAME                                           NeuronDevice   NeuronCore
   ip-192-168-47-173.us-west-2.compute.internal   1              2
   ```

### 테스트 포드를 사용하여 Neuron 디바이스 확인
<a name="_verify_neuron_devices_with_a_test_pod"></a>

테스트 포드에서 `neuron-ls` 도구를 실행하여 Neuron 디바이스에 액세스할 수 있는지 확인할 수 있습니다.

1. 다음 콘텐츠를 가진 `neuron-ls.yaml`이라는 파일을 생성합니다: 이 매니페스트는 `neuron-ls` 도구가 설치된 [Neuron Monitor](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/tools/neuron-sys-tools/neuron-monitor-user-guide.html) 컨테이너를 시작합니다.

   ```
   apiVersion: v1
   kind: Pod
   metadata:
     name: neuron-ls
   spec:
     restartPolicy: Never
     containers:
     - name: neuron-container
       image: public.ecr.aws/g4h4h0b5/neuron-monitor:1.0.0
       command: ["/bin/sh"]
       args: ["-c", "neuron-ls"]
       resources:
         limits:
           aws.amazon.com/neuron: 1
         requests:
           aws.amazon.com/neuron: 1
     tolerations:
     - key: "aws.amazon.com/neuron"
       operator: "Exists"
       effect: "NoSchedule"
   ```

1. 매니페스트를 적용합니다.

   ```
   kubectl apply -f neuron-ls.yaml
   ```

1. 포드 실행을 마친 후 로그를 확인하세요.

   ```
   kubectl logs neuron-ls
   ```

   예제 출력은 다음과 같습니다.

   ```
   instance-type: inf2.xlarge
   instance-id: ...
   +--------+--------+--------+---------+
   | NEURON | NEURON | NEURON |   PCI   |
   | DEVICE | CORES  | MEMORY |   BDF   |
   +--------+--------+--------+---------+
   | 0      | 2      | 32 GB  | 00:1f.0 |
   +--------+--------+--------+---------+
   ```

**참고**  
Neuron 디바이스 플러그인을 사용하는 경우 여러 Neuron 디바이스(예: `trn2.48xlarge`)가 있는 인스턴스에서 연속 디바이스를 할당하려면 [Neuron Kubernetes 스케줄러 확장](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/tutorials/k8s-neuron-scheduler.html)이 필요합니다. Neuron DRA 드라이버는 토폴로지 제약 조건을 통해 이를 자동으로 처리합니다.

자세한 내용은 [EKS 실행에 대한 Neuron 설명서](https://awsdocs-neuron.readthedocs-hosted.com/en/latest/containers/kubernetes-getting-started.html)를 참조하세요.