본문으로 건너뛰기

컴퓨팅 프로비저닝

이 실습에서는 Karpenter를 사용하여 가속화된 머신러닝 추론을 위해 특별히 설계된 AWS Neuron 노드를 프로비저닝합니다. Inferentia와 Trainium은 AWS의 전용 ML 가속기로, Mistral-7B 모델과 같은 추론 워크로드를 실행하는 데 높은 성능과 비용 효율성을 제공합니다.

Karpenter에 대해 자세히 알아보려면 이 워크샵의 Karpenter 모듈을 확인하세요.

Karpenter는 이미 EKS 클러스터에 설치되어 있으며 Deployment로 실행됩니다:

~$kubectl get deployment karpenter -n kube-system
NAME        READY   UP-TO-DATE   AVAILABLE   AGE
karpenter   2/2     2            2           11m

Neuron 인스턴스를 프로비저닝하는 데 사용할 Karpenter NodePool의 구성을 살펴보겠습니다:

~/environment/eks-workshop/modules/aiml/chatbot/nodepool.yaml
apiVersion: karpenter.sh/v1
kind: NodePool
metadata:
name: neuron
spec:
template:
metadata:
labels:
neuron.amazonaws.com/neuron-device: "true"
vpc.amazonaws.com/has-trunk-attached: "true" # Required for Pod ENI
spec:
taints:
- key: aws.amazon.com/neuron
value: "true"
effect: "NoSchedule"
requirements:
- key: node.kubernetes.io/instance-type
operator: In
values: ["trn1.2xlarge", "inf2.xlarge"]
- key: "kubernetes.io/arch"
operator: In
values: ["amd64"]
- key: "karpenter.sh/capacity-type"
operator: In
values: ["on-demand"]
expireAfter: 720h
terminationGracePeriod: 24h
nodeClassRef:
group: karpenter.k8s.aws
kind: EC2NodeClass
name: neuron
limits:
aws.amazon.com/neuron: 2
cpu: 16
memory: 64Gi
disruption:
consolidateAfter: 300s
consolidationPolicy: WhenEmptyOrUnderutilized

---
apiVersion: karpenter.k8s.aws/v1
kind: EC2NodeClass
metadata:
name: neuron
spec:
amiFamily: AL2023
amiSelectorTerms:
- alias: al2023@latest
instanceStorePolicy: RAID0
blockDeviceMappings:
- deviceName: /dev/xvda
ebs:
deleteOnTermination: true
encrypted: true
volumeSize: 256Gi
iops: 16000
throughput: 1000
volumeType: gp3
role: ${KARPENTER_NODE_ROLE}
userData: |
apiVersion: node.eks.aws/v1alpha1
kind: NodeConfig
spec:
featureGates:
FastImagePull: true

securityGroupSelectorTerms:
- tags:
karpenter.sh/discovery: ${EKS_CLUSTER_NAME}
- tags:
kubernetes.io/cluster/eks-workshop: owned
subnetSelectorTerms:
- tags:
karpenter.sh/discovery: ${EKS_CLUSTER_NAME}
kubernetes.io/role/internal-elb: "1"
tags:
app.kubernetes.io/created-by: eks-workshop
karpenter.sh/discovery: ${EKS_CLUSTER_NAME}
aws-neuron: "true"
A

실행 중인 리전에서 사용 가능한 항목에 따라 inf2.xlarge 또는 trn1.2xlarge 인스턴스 유형을 사용하도록 NodePool을 구성하고 있습니다.

B

NodePool CRD는 인스턴스 유형 및 영역과 같은 노드 속성 정의를 지원합니다. 이 예제에서는 karpenter.sh/capacity-type을 설정하여 Karpenter가 초기에 On-Demand 인스턴스를 프로비저닝하도록 제한하고, karpenter.k8s.aws/instance-type을 설정하여 특정 인스턴스 유형의 하위 집합으로 제한합니다. 사용 가능한 다른 속성은 여기에서 확인할 수 있습니다.

C

Taint는 노드가 특정 Pod 집합을 거부할 수 있도록 하는 특정 속성 집합을 정의합니다. 이 속성은 일치하는 레이블인 Toleration과 함께 작동합니다. Toleration과 Taint는 함께 작동하여 Pod가 적절한 노드에 올바르게 스케줄링되도록 합니다. 다른 속성에 대한 자세한 내용은 이 리소스에서 확인할 수 있습니다.

D

NodePool은 관리하는 CPU 및 메모리 양에 대한 제한을 정의할 수 있습니다. 이 제한에 도달하면 Karpenter는 해당 특정 NodePool과 관련된 추가 용량을 프로비저닝하지 않으며, 전체 컴퓨팅에 상한선을 제공합니다.

NodePool을 생성해 보겠습니다:

~$cat ~/environment/eks-workshop/modules/aiml/chatbot/nodepool.yaml \
| envsubst | kubectl apply -f-
ec2nodeclass.karpenter.k8s.aws/neuron created
nodepool.karpenter.sh/neuron created

제대로 배포되면 NodePool을 확인합니다:

~$kubectl get nodepool
NAME         NODECLASS    NODES   READY   AGE
neuron       neuron       0       True    31s

위 명령에서 볼 수 있듯이 NodePool이 제대로 프로비저닝되어 Karpenter가 필요에 따라 새 노드를 프로비저닝할 수 있습니다. 다음 단계에서 ML 워크로드를 배포하면 Karpenter는 지정한 리소스 요청 및 제한에 따라 필요한 Neuron 인스턴스를 자동으로 생성합니다.