コンピュートのプロビジョニング
このラボでは、Karpenterを使用して、加速された機械学習推論用に特別に設計されたAWS Neuronノードをプロビジョニングします。InferentiaとTrainiumはAWSの専用ML高速化プロセッサーで、Mistral-7Bモデルのような推論ワークロードを実行する際の高性能とコスト効率性を提供します。
Karpenterについて詳しく知りたい場合は、このワークショップのKarpenterモジュールをチェックしてください。
KarpenterはすでにEKSクラスタにインストールされており、Deploymentとして実行されています:
NAME READY UP-TO-DATE AVAILABLE AGE
karpenter 2/2 2 2 11m
Neuronインスタンスをプロビジョニングするために使用するKarpenter NodePoolの設定を確認しましょう:
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"
実行しているリージョンで利用可能なものに基づいて、inf2.xlargeまたはtrn1.2xlargeのいずれかのインスタンスタイプを使用するようにNodePoolを設 定しています。
NodePool CRDはインスタンスタイプやゾーンなどのノードプロパティを定義することをサポートしています。この例では、karpenter.sh/capacity-typeを最初にKarpenterがオンデマンドインスタンスのみをプロビジョニングするように制限し、またkarpenter.k8s.aws/instance-typeで特定のインスタンスタイプのサブセットに限定しています。他にどのようなプロパティが利用可能かはこちらで確認できます。
Taintは、ノードが一連のPodを排除できるようにする特定のプロパティセットを定義します。このプロパティはマッチングするラベルであるTolerationと連携して機能します。TolerationとTaintは連携して、Podが適切なノードに正しくスケジュールされることを保証します。他のプロパティについては、このリソースで詳しく学べます。
NodePoolは、それによって管理されるCPUとメモリの量に制限を定義できます。この制限に達すると、Karpenterはその特定のNodePoolに関連する追加のキャパシティをプロビジョニングしなく なり、合計コンピュートに上限を設けます。
NodePoolを作成しましょう:
ec2nodeclass.karpenter.k8s.aws/neuron created
nodepool.karpenter.sh/neuron created
正しく展開されたら、NodePoolsを確認します:
NAME NODECLASS NODES READY AGE
neuron neuron 0 True 31s
上記のコマンドから、NodePoolが正しくプロビジョニングされていることがわかります。これにより、Karpenterは必要に応じて新しいノードをプロビジョニングできます。次のステップでMLワークロードをデプロイすると、Karpenterは指定したリソース要求と制限に基づいて必要なNeuronインスタンスを自動的に作成します。