

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

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

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

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

Karpenter, EKS 관리형 노드 그룹 또는 자체 관리형 노드에서 [정적 용량 프로비저닝](https://karpenter.sh/docs/concepts/nodepools/#static-nodepool)을 사용할 때는 Kubernetes 버전 1.34 이상의 새 배포에 DRA 드라이버를 사용하는 것이 좋습니다. 현재 DRA는 EKS Auto Mode에서 지원되지 않습니다. Neuron DRA 드라이버는 사용자 지정 스케줄러 확장을 요구하지 않고도 토폴로지 인식 할당, 연결된 디바이스 하위 세트 예약, 논리적 NeuronCore(LNC) 구성 및 UltraServer 다중 노드 할당을 제공합니다.

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


| 기능 | Neuron DRA 드라이버 | Neuron 디바이스 플러그인 | 
| --- | --- | --- | 
| 최소 Kubernetes 버전 | 1.34 | 모든 EKS 지원 Kubernetes 버전 | 
| EKS 컴퓨팅 | Karpenter(정적 용량만 해당), 관리형 노드 그룹, 자체 관리형 노드 | 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>
+ Karpenter, 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 드라이버를 설치하지 마세요. 두 메커니즘은 동일한 노드에 공존할 수 없습니다. 이렇게 하면 기본 디바이스가 동일한 노드의 여러 포드에 자동으로 과다 구독될 수 있습니다.

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)를 참조하세요.