가속 워크로드 배포하기
가속 워크로드 배포하기
이 튜토리얼은 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또는systemManaged Node Pools가 활성화될 때 생성되는defaultEKS 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