가속 워크로드 배포하기

가속 워크로드 배포하기

이 튜토리얼은 Amazon EKS Auto Mode가 하드웨어 가속 워크로드 실행을 어떻게 단순화하는지 보여 줍니다. Amazon EKS Auto Mode는 컴퓨트, 네트워킹, 로드 밸런싱, 스토리지, 아이덴티티 및 접근 관리 기능을 기본 제공으로 제공하는 핵심 인프라 구성 요소를 자동화하여 클러스터 자체 너머의 운영도 간소화합니다.

Amazon EKS Auto Mode는 특정 인스턴스 유형에 필요한 드라이버와 디바이스 플러그인(NVIDIA 및 AWS Neuron 드라이버 등)을 포함합니다. 이 구성 요소를 설치하거나 업데이트할 필요가 없어요.

EKS Auto Mode는 다음 가속기의 드라이버를 자동으로 관리합니다.

  • AWS Trainium
  • AWS Inferentia
  • Amazon EC2 가속 인스턴스의 NVIDIA GPU

Note: EKS Auto Mode는 Kubernetes용 NVIDIA device plugin을 포함합니다. 이 플러그인은 자동으로 실행되며 클러스터에서 daemon set으로 표시되지 않아요.

추가 네트워킹 지원:

  • Elastic Fabric Adapter(EFA) — EKS 클러스터에서 EFA 디바이스 관리에 대한 정보는 Manage EFA devices on Amazon EKS를 참고하세요.

Amazon EKS Auto Mode는 가속기 드라이버와 디바이스 플러그인 관리의 수고(toil)를 없애줍니다. 또한 클러스터를 0으로 확장해 비용을 절감할 수 있어요. 실행 중인 워크로드가 없을 때 인스턴스를 종료하도록 EKS Auto Mode를 구성할 수 있으며, 이는 배치 기반 추론 워크로드에 유용합니다.

다음은 Amazon EKS Auto Mode로 가속 워크로드를 실행하는 예시입니다.

출처: 문서

본문

사전 조건

  • Amazon EKS Auto Mode가 구성된 Kubernetes 클러스터.
  • general-purpose 또는 system Managed Node Pools가 활성화될 때 생성되는 default EKS Node class.

1단계: GPU 워크로드 배포

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

Amazon EKS Auto Mode NodePool과 샘플 workload를 배포하려면 다음 NodePool과 Pod 정의를 검토하고 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용 toleration이 있는 Pod만 스케줄링되도록 하는 taint를 설정합니다.

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

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

다음 출력이 보일 거예요.

nodepool.karpenter.sh/gpu 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단계: 검증

다음 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 |
+-----------------------------------------+----------------------+----------------------+

컨테이너가 NVIDIA GPU가 있는 인스턴스에서 실행 중임을 감지했고, Amazon EKS Auto Mode가 관리하므로 디바이스 드라이버를 전혀 설치할 필요가 없었다는 것을 확인할 수 있어요.

3단계: 정리

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

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

예시 NodePools 참조

NVIDIA NodePool 생성

다음 NodePool은 다음을 정의합니다.

  • g6e와 g6 패밀리의 인스턴스만 시작
  • 1시간 동안 비어 있으면 노드 통합
  • consolidateAfter의 1시간 값은 폭주하는 워크로드를 지원하고 노드 교체를 줄입니다. consolidateAfter는 워크로드 요구에 따라 조정할 수 있어요.
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 Auto Mode Supported Labels를 참고하세요.

특정 스토리지 요구사항이 있다면 자체 NodeClass를 만들어 NodePool에서 참조해 노드의 임시 스토리지 iops, size, throughput을 조정할 수 있습니다. 구성 가능한 NodeClass 옵션에 대해 자세히 알아보세요.

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

AWS Trainium 및 AWS Inferentia NodePool 정의

다음 NodePool은 Inferentia와 Trainium 패밀리 인스턴스만 시작하도록 설정된 eks.amazonaws.com/instance-category를 가집니다.

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

더 알아보기 (Learn more)