

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

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

# 가속화된 워크로드 배포
<a name="auto-accelerated"></a>

이 자습서에서는 Amazon EKS Auto Mode가 하드웨어 가속 워크로드 시작을 단순화하는 방법을 보여줍니다. Amazon EKS Auto Mode는 컴퓨팅, 네트워킹, 로드 밸런싱, 스토리지, Identity Access and Management 기능을 즉시 제공하는 주요 인프라 구성 요소를 자동화하여 클러스터 자체를 넘어 운영을 간소화합니다.

Amazon EKS Auto Mode에는 NVIDIA 및 AWS Neuron 드라이버와 같은 특정 인스턴스 유형에 필요한 드라이버와 디바이스 플러그인이 포함되어 있습니다. 이러한 구성 요소를 설치 또는 업데이트할 필요가 없습니다.

EKS Auto Mode는 이러한 액셀러레이터의 드라이버를 자동으로 관리합니다.
+  [AWS Trainium](https://aws.amazon.com/ai/machine-learning/trainium/) 
+  [AWS Inferentia](https://aws.amazon.com/ai/machine-learning/inferentia/) 
+  [Amazon EC2 가속 인스턴스의 NVIDIA GPU](https://docs.aws.amazon.com/ec2/latest/instancetypes/ac.html) 

**참고**  
EKS Auto Mode에는 Kubernetes용 NVIDIA 디바이스 플러그인이 포함되어 있습니다. 이 플러그인은 자동으로 실행되고 클러스터에서 대몬 세트로 표시되지 않습니다.

추가 네트워킹 지원:
+  [Elastic Fabric Adapter(EFA)](https://aws.amazon.com/hpc/efa/) 

Amazon EKS Auto Mode를 사용하면 액셀러레이터 드라이버 및 디바이스 플러그인 관리할 필요가 없습니다.

클러스터를 0으로 조정하면 비용을 절감할 수도 있습니다. 실행 중인 워크로드가 없을 때 인스턴스를 종료하도록 EKS Auto Mode를 구성할 수 있습니다. 이는 배치 기반 추론 워크로드에 유용합니다.

다음은 Amazon EKS Auto Mode를 사용하여 가속화된 워크로드를 시작하는 방법의 예제입니다.

## 사전 조건
<a name="_prerequisites"></a>
+ Amazon EKS Auto Mode가 구성된 Kubernetes 클러스터.
+ `general-purpose` 또는 `system` 관리형 노드 풀이 활성화될 때 생성된 `default` EKS 노드 클래스.

## 1단계: GPU 워크로드 배포
<a name="_step_1_deploy_a_gpu_workload"></a>

이 예제에서는 45GB GPU 메모리가 필요한 NVIDIA 기반 워크로드용 NodePool을 생성합니다. EKS Auto Mode에서는 Kubernetes 예약 제약 조건을 사용하여 인스턴스 요구 사항을 정의합니다.

Amazon EKS Auto Mode `NodePool` 및 샘플 `workload`를 배포하려면 다음 NodePool 및 포드 정의를 검토하고 `nodepool-gpu.yaml` 및 `pod.yaml`로 저장합니다.

 **nodepool-gpu.yaml** 

```
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: gpu
spec:
  disruption:
    budgets:
    - nodes: 10%
    consolidateAfter: 1h
    consolidationPolicy: WhenEmpty
  template:
    metadata: {}
    spec:
      nodeClassRef:
        group: eks.amazonaws.com
        kind: NodeClass
        name: default
      requirements:
        - key: "karpenter.sh/capacity-type"
          operator: In
          values: ["on-demand"]
        - key: "kubernetes.io/arch"
          operator: In
          values: ["amd64"]
        - key: "eks.amazonaws.com/instance-family"
          operator: In
          values:
          - g6e
          - g6
      taints:
        - key: nvidia.com/gpu
          effect: NoSchedule
      terminationGracePeriod: 24h0m0s
```

 **pod.yaml** 

```
apiVersion: v1
kind: Pod
metadata:
  name: nvidia-smi
spec:
  nodeSelector:
    eks.amazonaws.com/compute-type: auto
  restartPolicy: OnFailure
  containers:
  - name: nvidia-smi
    image: public.ecr.aws/amazonlinux/amazonlinux:2023-minimal
    args:
    - "nvidia-smi"
    resources:
      requests:
        memory: "30Gi"
        cpu: "3500m"
        nvidia.com/gpu: 1
      limits:
        memory: "30Gi"
        nvidia.com/gpu: 1
  tolerations:
  - key: nvidia.com/gpu
    effect: NoSchedule
    operator: Exists
```

`eks.amazonaws.com/compute-type: auto` 선택기를 사용하려면 Amazon EKS Auto Mode 노드에 워크로드를 배포해야 합니다. 또한 NodePool은 Nvidia GPU가 예약되도록 허용 오차가 있는 포드만 허용하는 테인트를 설정합니다.

클러스터에 NodePool과 워크로드를 적용합니다.

```
kubectl apply -f nodepool-gpu.yaml
kubectl apply -f pod.yaml
```

다음 결과가 표시됩니다.

```
nodepool.karpenter.sh/gpu configured created
pod/nvidia-smi created
```

몇 초 정도 기다리고, 클러스터의 노드를 확인합니다. 이제 Amazon EKS Auto Mode 클러스터에 프로비저닝된 새 노드가 표시됩니다.

```
> kubectl get nodes

NAME        TYPE          CAPACITY    ZONE         NODE                  READY   AGE
gpu-dnknr   g6e.2xlarge   on-demand   us-west-2b   i-02315c7d7643cdee6   True    76s
```

## 2단계: 검증
<a name="_step_2_validate"></a>

다음 Kubernetes 예약 제약 조건에 따라 워크로드에 l40s `GPU`가 있는 인스턴스가 필요하므로 Amazon EKS Auto Mode가 `g6.2xlarge` 대신 `g6e.2xlarge`를 시작한 것을 확인할 수 있습니다.

```
...
  nodeSelector:
    eks.amazonaws.com/instance-gpu-name: l40s
...
    requests:
        memory: "30Gi"
        cpu: "3500m"
        nvidia.com/gpu: 1
      limits:
        memory: "30Gi"
        nvidia.com/gpu: 1
```

이제 다음 명령을 실행하여 컨테이너 로그를 살펴봅니다.

```
kubectl logs nvidia-smi
```

샘플 출력은 다음과 같습니다.

```
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.230.02             Driver Version: 535.230.02   CUDA Version: 12.2     |
|-----------------------------------------+----------------------+----------------------+
| 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 L40S                    On  | 00000000:30:00.0 Off |                    0 |
| N/A   27C    P8              23W / 350W |      0MiB / 46068MiB |      0%      Default |
|                                         |                      |                  N/A |
+-----------------------------------------+----------------------+----------------------+

+---------------------------------------------------------------------------------------+
| Processes:                                                                            |
|  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
|        ID   ID                                                             Usage      |
|=======================================================================================|
|  No running processes found                                                           |
+---------------------------------------------------------------------------------------+
```

컨테이너가 `NVIDIA` GPU가 있는 인스턴스에서 실행 중임을 감지했으며 Amazon EKS Auto Mode에서 관리하므로 디바이스 드라이버를 설치할 필요가 없음을 알 수 있습니다.

## 3단계: 정리
<a name="_step_3_clean_up"></a>

생성된 모든 객체를 제거하려면 `kubectl`을 사용하여 노드가 종료되도록 샘플 배포와 NodePool을 삭제합니다.

```
kubectl delete -f nodepool-gpu.yaml
kubectl delete -f pod.yaml
```

## NodePools 참조 예제
<a name="_example_nodepools_reference"></a>

### NVIDIA NodePool 생성
<a name="_create_an_nvidia_nodepool"></a>

다음 NodePool에서 정의하는 사항:
+ `g6e` 및 `g6` 패밀리의 인스턴스만 시작
+ 1시간 동안 비어 있는 경우 노드 통합
  + `consolodateAfter`의 1시간 값은 급증하는 워크로드를 지원하고 노드 이탈을 줄입니다. 워크로드 요구 사항에 따라 `consolidateAfter`를 조정할 수 있습니다.

 **GPU 인스턴스 패밀리 및 통합이 포함된 NodePool 예제** 

```
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
  name: gpu
spec:
  disruption:
    budgets:
    - nodes: 10%
    consolidateAfter: 1h
    consolidationPolicy: WhenEmpty
  template:
    metadata: {}
    spec:
      nodeClassRef:
        group: eks.amazonaws.com
        kind: NodeClass
        name: default
      requirements:
        - key: "karpenter.sh/capacity-type"
          operator: In
          values: ["on-demand"]
        - key: "kubernetes.io/arch"
          operator: In
          values: ["amd64"]
        - key: "eks.amazonaws.com/instance-family"
          operator: In
          values:
          - g6e
          - g6
      terminationGracePeriod: 24h0m0s
```

`eks.amazonaws.com/instance-gpu-name`을 설정하는 대신 `eks.amazonaws.com/instance-family`를 사용하여 인스턴스 패밀리를 지정할 수 있습니다. 예약 검토에 영향을 미치는 다른 잘 알려진 레이블은 [EKS 자동 모드 지원 레이블](create-node-pool.md#auto-supported-labels) 섹션을 참조하세요.

특정 스토리지 요구 사항이 있는 경우 NodePool의 참조에 대해 [NodeClass](create-node-class.md)를 생성하여 노드 임시 스토리지 `iops`, `size` 및 `throughput`를 조정할 수 있습니다. [구성 가능한 NodeClass 옵션](create-node-class.md)에 대해 자세히 알아봅니다.

 **NodeClass의 스토리지 구성 예제** 

```
apiVersion: eks.amazonaws.com/v1
kind: NodeClass
metadata:
  name: gpu
spec:
  ephemeralStorage:
    iops: 3000
    size: 80Gi
    throughput: 125
```

### AWS Trainium 및 AWS Inferentia NodePool 정의
<a name="define_an_shared_aws_trainium_and_shared_aws_inferentia_nodepool"></a>

다음 NodePool에는 Inferentia 및 Trainium 패밀리의 인스턴스만 시작하도록 하는 `eks.amazonaws.com/instance-category` 세트가 있습니다.

```
        - key: "eks.amazonaws.com/instance-category"
          operator: In
          values:
            - inf
            - trn
```