

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# SageMaker HyperPod EKS에서 오토 스케일링
<a name="sagemaker-hyperpod-eks-autoscaling"></a>

Amazon SageMaker HyperPod는 EKS 오케스트레이션으로 생성된 클러스터에 대해 관리형 Karpenter 기반 노드 오토 스케일링 솔루션을 제공합니다. [Karpenter](https://karpenter.sh/)는 클러스터 규모 조정 및 비용 효율성을 최적화 AWS 하는에서 구축한 오픈 소스 Kubernetes 노드 수명 주기 관리자입니다. 자체 관리형 Karpenter 배포와 달리 SageMaker HyperPod의 관리형 구현은 Karpenter 컨트롤러를 설치, 구성 및 유지 관리하는 데 드는 운영 오버헤드를 없애는 동시에 통합 복원력과 내결함성을 제공합니다. 이 관리형 오토 스케일링 솔루션은 HyperPod의 [지속적 프로비저닝](sagemaker-hyperpod-scaling-eks.md) 기능을 기반으로 하며 자동 장애 처리 및 복구를 통해 훈련 및 추론 워크로드를 위한 컴퓨팅 리소스를 효율적으로 규모 조정할 수 있도록 합니다.

사용한 만큼만 지불합니다. 오토 스케일링을 통해 자동으로 프로비저닝되는 모든 컴퓨팅 인스턴스에 대해 표준 SageMaker HyperPod 요금에 따라 비용을 지불해야 합니다. 요금에 대한 자세한 내용은 [Amazon SageMaker AI](https://aws.amazon.com/sagemaker/ai/pricing/)를 참조하세요.

HyperPod를 사용하여 Karpenter 기반 오토 스케일링을 활성화하면 다음에 액세스할 수 있습니다.
+ **서비스 관리형 수명 주기** - HyperPod는 Karpenter 설치, 업데이트 및 유지 관리를 처리하여 운영 오버헤드를 제거합니다.
+ **적시 프로비저닝** - Karpenter는 보류 중인 포드를 관찰하고 온디맨드 풀에서 워크로드에 필요한 컴퓨팅을 프로비저닝합니다.
+ **0으로 규모 조정** - 전용 컨트롤러 인프라를 유지 관리하지 않고 노드를 0개로 스케일 다운합니다.
+ **워크로드 인식 노드 선택** - Karpenter는 포드 요구 사항, 가용 영역 및 요금을 기반으로 최적의 인스턴스 유형을 선택하여 비용을 최소화합니다.
+ **자동 노드 통합** - Karpenter는 정기적으로 클러스터의 최적화 기회를 평가하여 사용률이 낮은 노드를 제거하기 위해 워크로드를 이동합니다.
+ **통합 복원력** - HyperPod의 내장 내결함성 및 노드 복구 메커니즘을 활용합니다.

다음 주제에서는 Karpenter를 사용하여 HyperPod 오토 스케일링을 활성화하는 방법을 설명합니다.

**Topics**
+ [사전 조건](#sagemaker-hyperpod-eks-autoscaling-prereqs)
+ [Karpenter를 사용한 HyperPod 오토 스케일링을 위한 IAM 역할 생성](sagemaker-hyperpod-eks-autoscaling-iam.md)
+ [Karpenter 오토 스케일링을 사용하여 HyperPod 클러스터 생성 및 구성](sagemaker-hyperpod-eks-autoscaling-cluster.md)
+ [NodeClass 생성](sagemaker-hyperpod-eks-autoscaling-nodeclass.md)
+ [NodePool 생성](sagemaker-hyperpod-eks-autoscaling-nodepool.md)
+ [워크로드 배포](sagemaker-hyperpod-eks-autoscaling-workload.md)

## 사전 조건
<a name="sagemaker-hyperpod-eks-autoscaling-prereqs"></a>
+ HyperPod 클러스터에서 지속적인 프로비저닝이 활성화되어 있어야 합니다. SageMaker HyperPod 클러스터를 생성할 때 `--node-provisioning-mode`를 `Continuous`로 설정하여 지속적 프로비저닝을 활성화합니다. 자세한 내용은 [Amazon EKS에서 향상된 클러스터 작업을 위한 지속적 프로비저닝](sagemaker-hyperpod-scaling-eks.md) 단원을 참조하십시오.
+ 상태 모니터링 에이전트 버전 1.0.742.0\$11.0.241.0 이상이 설치되어 있어야 합니다. HyperPod 클러스터 작업 및 모니터링에 필요합니다. 적절한 클러스터 상태 보고 및 노드 수명 주기 관리를 보장하려면 Karpenter 오토 스케일링을 활성화하기 전에 에이전트를 구성해야 합니다. 자세한 내용은 [상태 모니터링 시스템](sagemaker-hyperpod-eks-resiliency-health-monitoring-agent.md) 단원을 참조하십시오.
+ Amazon EKS 클러스터에 Karpenter가 실행 중인 경우에만 Karpenter `NodePool` 및 `NodeClaim` 버전이 v1이어야 합니다.
+ `NodeRecovery`를 자동으로 설정해야 합니다. 자세한 내용은 [자동 노드 복구](sagemaker-hyperpod-eks-resiliency-node-recovery.md) 단원을 참조하십시오.

# Karpenter를 사용한 HyperPod 오토 스케일링을 위한 IAM 역할 생성
<a name="sagemaker-hyperpod-eks-autoscaling-iam"></a>

다음 단계에서는 SageMaker HyperPod가 Karpenter 기반 오토 스케일링을 통해 클러스터의 Kubernetes 노드를 관리할 수 있도록 허용하는 IAM 역할을 생성합니다. 이 역할은 HyperPod가 워크로드 수요에 따라 클러스터 노드를 자동으로 추가 및 제거하는 데 필요한 권한을 제공합니다.

**IAM 콘솔 열기**

1. 에 로그인 AWS Management Console 하고 console.aws.amazon.com IAM 콘솔을 엽니다.

1. 탐색 창에서 **Roles**를 선택합니다.

1. **역할 생성(Create role)**을 선택합니다.

**신뢰 정책 구성**

1. **신뢰할 수 있는 엔터티 유형(Trusted entity type)**에서 **사용자 지정 정책(Custom trust policy)**을 선택합니다.

1. **사용자 지정 신뢰 정책** 편집기에서 기본 정책을 다음으로 바꿉니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": [
                       "hyperpod.sagemaker.amazonaws.com"
                   ]
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

------

1. **다음**을 선택합니다.

**권한 정책 생성 및 연결**

SageMaker HyperPod에는 AWS 관리형 정책에서 사용할 수 없는 특정 권한이 필요하므로 사용자 지정 정책을 생성해야 합니다.

1. **정책 생성**을 선택합니다. 그러면 새 브라우저 탭이 열립니다.

1. **JSON** 탭을 선택합니다.

1. 기본 정책을 다음으로 바꿉니다.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "sagemaker:BatchAddClusterNodes",
                   "sagemaker:BatchDeleteClusterNodes"
               ],
               "Resource": "arn:aws:sagemaker:*:*:cluster/*",
               "Condition": {
                   "StringEquals": {
                       "aws:ResourceAccount": "${aws:PrincipalAccount}"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Action": [
                   "kms:CreateGrant",
                   "kms:DescribeKey"
               ],
               "Resource": "arn:aws:kms:*:*:key/*",
               "Condition": {
                   "StringLike": {
                       "kms:ViaService": "sagemaker.*.amazonaws.com"
                   },
                   "Bool": {
                       "kms:GrantIsForAWSResource": "true"
                   },
                   "ForAllValues:StringEquals": {
                       "kms:GrantOperations": [
                           "CreateGrant",
                           "Decrypt",
                           "DescribeKey",
                           "GenerateDataKeyWithoutPlaintext",
                           "ReEncryptTo",
                           "ReEncryptFrom",
                           "RetireGrant"
                       ]
                   }
               }
           }
       ]
   }
   ```

------

1. **다음**을 선택합니다.

1. **정책 이름(Policy name)**에 **SageMakerHyperPodKarpenterPolicy**을 입력합니다.

1. (선택 사항) **설명**에 정책에 대한 설명을 입력합니다.

1. **정책 생성**을 선택합니다.

1. 역할 생성 탭으로 돌아가서 정책 목록을 새로 고칩니다.

1. 방금 생성한 **SageMakerHyperPodKarpenterPolicy**를 검색하여 선택합니다.

1. **다음**을 선택합니다.

**역할 이름 지정 및 생성**

1. **역할 이름**에 `SageMakerHyperPodKarpenterRole`을 입력합니다.

1. (선택 사항) **설명**에 역할에 대한 설명을 입력합니다.

1. **1단계: 신뢰할 수 있는 엔터티 선택** 섹션에서 신뢰 정책에 올바른 서비스 위탁자가 표시되는지 확인합니다.

1. **2단계: 권한 추가** 섹션에서 `SageMakerHyperPodKarpenterPolicy`가 연결되어 있는지 확인합니다.

1. **역할 생성**을 선택합니다.

**역할 ARN 기록**

역할이 성공적으로 생성된 후 다음을 수행하세요.

1. **역할** 목록에서 이름이 `SageMakerHyperPodKarpenterRole`인 역할을 선택합니다.

1. **요약** 섹션에서 **역할 ARN**을 복사합니다. HyperPod 클러스터를 생성할 때 이 ARN이 필요합니다.

역할 ARN은 `arn:aws:iam::ACCOUNT-ID:role/SageMakerHyperPodKarpenterRole` 형식을 따릅니다.

# Karpenter 오토 스케일링을 사용하여 HyperPod 클러스터 생성 및 구성
<a name="sagemaker-hyperpod-eks-autoscaling-cluster"></a>

다음 단계에서는 지속적 프로비저닝이 활성화된 SageMaker HyperPod 클러스터를 생성하고 Karpenter 기반 오토 스케일링을 사용하도록 구성합니다.

**HyperPod 클러스터 생성**

1. 환경 구성을 로드하고 CloudFormation 스택에서 값을 추출합니다.

   ```
   source .env
   SUBNET1=$(cfn-output $VPC_STACK_NAME PrivateSubnet1)
   SUBNET2=$(cfn-output $VPC_STACK_NAME PrivateSubnet2)
   SUBNET3=$(cfn-output $VPC_STACK_NAME PrivateSubnet3)
   SECURITY_GROUP=$(cfn-output $VPC_STACK_NAME NoIngressSecurityGroup)
   EKS_CLUSTER_ARN=$(cfn-output $EKS_STACK_NAME ClusterArn)
   EXECUTION_ROLE=$(cfn-output $SAGEMAKER_STACK_NAME ExecutionRole)
   SERVICE_ROLE=$(cfn-output $SAGEMAKER_STACK_NAME ServiceRole)
   BUCKET_NAME=$(cfn-output $SAGEMAKER_STACK_NAME Bucket)
   HP_CLUSTER_NAME="hyperpod-eks-test-$(date +%s)"
   EKS_CLUSTER_NAME=$(cfn-output $EKS_STACK_NAME ClusterName)
   HP_CLUSTER_ROLE=$(cfn-output $SAGEMAKER_STACK_NAME ClusterRole)
   ```

1. 노드 초기화 스크립트를 Amazon S3 버킷에 업로드합니다.

   ```
   aws s3 cp lifecyclescripts/on_create_noop.sh s3://$BUCKET_NAME
   ```

1. 환경 변수를 사용하여 클러스터 구성 파일을 생성합니다.

   ```
   cat > cluster_config.json << EOF
   {
       "ClusterName": "$HP_CLUSTER_NAME",
       "InstanceGroups": [
           {
               "InstanceCount": 1,
               "InstanceGroupName": "system",
               "InstanceType": "ml.c5.xlarge",
               "LifeCycleConfig": {
                   "SourceS3Uri": "s3://$BUCKET_NAME",
                   "OnCreate": "on_create_noop.sh"
               },
               "ExecutionRole": "$EXECUTION_ROLE"
           },
           {
               "InstanceCount": 0,
               "InstanceGroupName": "auto-c5-az1",
               "InstanceType": "ml.c5.xlarge",
               "LifeCycleConfig": {
                   "SourceS3Uri": "s3://$BUCKET_NAME",
                   "OnCreate": "on_create_noop.sh"
               },
               "ExecutionRole": "$EXECUTION_ROLE"
           },
           {
               "InstanceCount": 0,
               "InstanceGroupName": "auto-c5-4xaz2",
               "InstanceType": "ml.c5.4xlarge",
               "LifeCycleConfig": {
                   "SourceS3Uri": "s3://$BUCKET_NAME",
                   "OnCreate": "on_create_noop.sh"
               },
               "ExecutionRole": "$EXECUTION_ROLE",
               "OverrideVpcConfig": {
                   "SecurityGroupIds": [
                       "$SECURITY_GROUP"
                   ],
                   "Subnets": [
                       "$SUBNET2"
                   ]
               }
           },
           {
               "InstanceCount": 0,
               "InstanceGroupName": "auto-g5-az3",
               "InstanceType": "ml.g5.xlarge",
               "LifeCycleConfig": {
                   "SourceS3Uri": "s3://$BUCKET_NAME",
                   "OnCreate": "on_create_noop.sh"
               },
               "ExecutionRole": "$EXECUTION_ROLE",
               "OverrideVpcConfig": {
                   "SecurityGroupIds": [
                       "$SECURITY_GROUP"
                   ],
                   "Subnets": [
                       "$SUBNET3"
                   ]
               }
           }
       ],
       "VpcConfig": {
           "SecurityGroupIds": [
               "$SECURITY_GROUP"
           ],
           "Subnets": [
               "$SUBNET1"
           ]
       },
       "Orchestrator": {
           "Eks": {
               "ClusterArn": "$EKS_CLUSTER_ARN"
           }
       },
       "ClusterRole": "$HP_CLUSTER_ROLE",
       "AutoScaling": {
           "Mode": "Enable",
           "AutoScalerType": "Karpenter"
       },
       "NodeProvisioningMode": "Continuous"
   }
   EOF
   ```

1. 다음 명령을 실행하여 HyperPod 클러스터를 생성합니다.

   ```
   aws sagemaker create-cluster --cli-input-json file://./cluster_config.json
   ```

1. 클러스터 생성 프로세스에는 20분 정도 걸립니다. ClusterStatus와 AutoScaling.Status 모두에 InService가 표시될 때까지 클러스터 상태를 모니터링합니다.

1. 후속 작업을 위해 클러스터 ARN을 저장합니다.

   ```
   HP_CLUSTER_ARN=$(aws sagemaker describe-cluster --cluster-name $HP_CLUSTER_NAME \
      --output text --query ClusterArn)
   ```

**Karpenter 오토 스케일링 활성화**

1. 다음 명령을 실행하여 지속적 노드 프로비저닝 모드가 있는 클러스터에서 Karpenter 기반 오토 스케일링을 활성화합니다.

   ```
   aws sagemaker update-cluster \
       --cluster-name $HP_CLUSTER_NAME \
       --auto-scaling Mode=Enable,AutoScalerType=Karpenter \
       --cluster-role $HP_CLUSTER_ROLE
   ```

1. Karpenter가 성공적으로 활성화되었는지 확인합니다.

   ```
   aws sagemaker describe-cluster --cluster-name $HP_CLUSTER_NAME --query 'AutoScaling'
   ```

1. 예상 결과:

   ```
   {
       "Mode": "Enable",
       "AutoScalerType": "Karpenter",
       "Status": "InService"
   }
   ```

NodeClass 및 NodePool 구성을 진행하기 전에 `Status`가 `InService`가 될 때까지 기다립니다.

# NodeClass 생성
<a name="sagemaker-hyperpod-eks-autoscaling-nodeclass"></a>

**중요**  
인스턴스 그룹에서 노드 0개로 시작하고 Karpenter가 오토 스케일링을 처리하도록 해야 합니다. 0개보다 많은 노드로 시작하는 경우 Karpenter는 노드를 0개로 스케일 다운합니다.

노드 클래스(`NodeClass`)는 네트워크 구성, 스토리지 설정, 리소스 태그 지정을 포함하여 Amazon EKS 클러스터의 노드 그룹에 적용되는 인프라 수준 설정을 정의합니다. `HyperPodNodeClass`는 SageMaker HyperPod에서 미리 생성된 인스턴스 그룹에 매핑되는 사용자 지정 `NodeClass`로, Karpenter의 오토 스케일링 결정에 지원되는 인스턴스 유형 및 가용 영역에 대한 제약 조건을 정의합니다.

**노드 클래스 생성 시 고려 사항**
+ `NodeClass`에서 인스턴스 그룹을 최대 10개까지 지정할 수 있습니다.
+ MIG(다중 인스턴스 GPU)와 함께 GPU 파티셔닝을 사용하는 경우 Karpenter는 MIG 지원 인스턴스 그룹으로 노드를 자동으로 프로비저닝할 수 있습니다. 인스턴스 그룹에 MIG 지원 인스턴스 유형(ml.p4d.24xlarge, ml.p5.48xlarge 또는 ml.p5e/p5en.48xlarge)이 포함되어 있는지 확인하고 클러스터 생성 중에 적절한 MIG 레이블을 구성합니다. GPU 파티셔닝 구성에 대한 자세한 내용은 섹션을 참조하세요[Amazon SageMaker HyperPod에서 GPU 파티션 사용](sagemaker-hyperpod-eks-gpu-partitioning.md).
+ 사용자 지정 레이블이 인스턴스 그룹에 적용되는 경우 `HyperpodNodeClass` 상태를 쿼리할 때 `desiredLabels` 필드에서 해당 레이블을 볼 수 있습니다. 여기에는와 같은 MIG 구성 레이블이 포함됩니다`nvidia.com/mig.config`. 수신 작업이 MIG 리소스를 요청하면 Karpenter는 적절한 MIG 레이블이 적용된 상태로 인스턴스를 자동으로 조정합니다.
+ 인스턴스 그룹을 삭제하기로 선택한 경우 HyperPod 클러스터에서 삭제하기 전에 `NodeClass`에서 인스턴스 그룹을 제거하는 것이 좋습니다. `NodeClass`에서 인스턴스 그룹을 사용하는 동안 인스턴스 그룹이 삭제되면 `NodeClass`는 프로비저닝에 대해 `Ready` 상태가 아닌 것으로 표시되고 인스턴스 그룹이 `NodeClass`에서 제거될 때까지 후속 규모 조정 작업에 사용되지 않습니다.
+ `NodeClass`에서 인스턴스 그룹을 제거하면 Karpenter는 인스턴스 그룹에서 Karpenter가 관리한 노드의 드리프트를 감지하고 중단 예산 제어에 따라 노드를 중단합니다.
+ 인스턴스 그룹에서 사용하는 서브넷은 동일한 AZ에 속해야 합니다. 서브넷은 인스턴스 그룹 수준 또는 클러스터 수준에서 `OverrideVpcConfig`를 사용하여 지정됩니다. `VpcConfig`는 기본적으로 사용됩니다.
+ 현재, 온디맨드 용량만 지원됩니다. 훈련 계획 또는 예약 용량이 있는 인스턴스 그룹은 지원되지 않습니다.
+ `DeepHealthChecks (DHC)`가 있는 인스턴스 그룹은 지원되지 않습니다. 이는 DHC를 완료하는 데 약 60\$190분이 걸리고 해당 기간 동안 포드가 보류 중 상태로 유지되어 오버프로비저닝이 발생할 수 있기 때문입니다.

다음 단계에서는 `NodeClass`를 생성하는 방법을 다룹니다.

1. `NodeClass` 구성으로 YAML 파일(예: nodeclass.yaml)을 생성합니다.

1. kubectl을 사용하여 클러스터에 구성을 적용합니다.

1. `NodePool` 구성에서 `NodeClass`를 참조합니다.

1. 다음은 ml.c5.xlarge 및 ml.c5.4xlarge 인스턴스 유형을 사용하는 샘플 `NodeClass`입니다.

   ```
   apiVersion: karpenter.sagemaker.amazonaws.com/v1
   kind: HyperpodNodeClass
   metadata:
     name: sample-nc
   spec:
     instanceGroups:
       # name of InstanceGroup in HyperPod cluster. InstanceGroup needs to pre-created
       # MaxItems: 10
       - auto-c5-xaz1
       - auto-c5-4xaz2
   ```

1. 구성을 적용합니다.

   ```
   kubectl apply -f nodeclass.yaml
   ```

1. NodeClass 상태를 모니터링하여 상태의 Ready 조건이 True로 설정되어 있는지 확인합니다.

   ```
   kubectl get hyperpodnodeclass sample-nc -o yaml
   ```

   ```
   apiVersion: karpenter.sagemaker.amazonaws.com/v1
   kind: HyperpodNodeClass
   metadata:
     creationTimestamp: "<timestamp>"
     name: sample-nc
     uid: <resource-uid>
   spec:
     instanceGroups:
     - auto-c5-az1
     - auto-c5-4xaz2
   status:
     conditions:
     // true when all IGs in the spec are present in SageMaker cluster, false otherwise
     - lastTransitionTime: "<timestamp>"
       message: ""
       observedGeneration: 3
       reason: InstanceGroupReady
       status: "True"
       type: InstanceGroupReady
     // true if subnets of IGs are discoverable, false otherwise
     - lastTransitionTime: "<timestamp>"
       message: ""
       observedGeneration: 3
       reason: SubnetsReady
       status: "True"
       type: SubnetsReady
     // true when all dependent resources are Ready [InstanceGroup, Subnets]
     - lastTransitionTime: "<timestamp>"
       message: ""
       observedGeneration: 3
       reason: Ready
       status: "True"
       type: Ready
     instanceGroups:
     - desiredLabels:
       - key: <custom_label_key>
         value: <custom_label_value>
       - key: nvidia.com/mig.config
         value: all-1g.5gb
       instanceTypes:
       - ml.c5.xlarge
       name: auto-c5-az1
       subnets:
       - id: <subnet-id>
         zone: <availability-zone-a>
         zoneId: <zone-id-a>
     - instanceTypes:
       - ml.c5.4xlarge
       name: auto-c5-4xaz2
       subnets:
       - id: <subnet-id>
         zone: <availability-zone-b>
         zoneId: <zone-id-b>
   ```

# NodePool 생성
<a name="sagemaker-hyperpod-eks-autoscaling-nodepool"></a>

`NodePool`은 Karpenter에서 생성할 수 있는 노드와 해당 노드에서 실행할 수 있는 포드에 대한 제약 조건을 설정합니다. 다음과 같은 작업을 수행하도록 `NodePool`을 구성할 수 있습니다.
+ 노드 생성을 특정 영역, 인스턴스 유형 및 컴퓨터 아키텍처로 제한합니다.
+ 레이블 또는 테인트를 정의하여 Karpenter가 생성하는 노드에서 실행할 수 있는 포드를 제한합니다.

**참고**  
HyperPod 제공업체는 아래에 설명된 잘 알려진 Kubernetes 및 Karpenter 요구 사항의 제한된 세트를 지원합니다.

다음 단계에서는 `NodePool`을 생성하는 방법을 다룹니다.

1. 원하는 `NodePool` 구성으로 nodepool.yaml이라는 YAML 파일을 생성합니다.

1. 아래 샘플 구성을 사용할 수 있습니다.

   모든 종속 리소스가 제대로 작동하고 있는지 보려면 `Conditions` 아래에서 `Ready`를 확인합니다.

   ```
   apiVersion: karpenter.sh/v1
   kind: NodePool
   metadata:
    name: sample-np
   spec:
    template:
      spec:
        nodeClassRef:
         group: karpenter.sagemaker.amazonaws.com
         kind: HyperpodNodeClass
         name: multiazc5
        expireAfter: Never
        requirements:
           - key: node.kubernetes.io/instance-type
             operator: Exists
   ```

1. 클러스터에 `NodePool`을 적용합니다.

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

1. `NodePool` 상태를 모니터링하여 상태의 `Ready` 조건이 `True`로 설정되어 있는지 확인합니다.

   ```
   kubectl get nodepool sample-np -oyaml
   ```

   ```
   apiVersion: karpenter.sh/v1
   kind: NodePool
   metadata:
     name: <nodepool-name>
     uid: <resource-uid>
     ...
   spec:
     disruption:
       budgets:
       - nodes: 90%
       consolidateAfter: 0s
       consolidationPolicy: WhenEmptyOrUnderutilized
     template:
       spec:
         expireAfter: 720h
         nodeClassRef:
           group: karpenter.sagemaker.amazonaws.com
           kind: HyperpodNodeClass
           name: <nodeclass-name>
         requirements:
         - key: node.kubernetes.io/instance-type
           operator: Exists
   status:
     conditions:
     - lastTransitionTime: "<timestamp>"
       message: ""
       observedGeneration: 2
       reason: ValidationSucceeded
       status: "True"
       type: ValidationSucceeded
     - lastTransitionTime: "<timestamp>"
       message: ""
       observedGeneration: 2
       reason: NodeClassReady
       status: "True"
       type: NodeClassReady
     - lastTransitionTime: "<timestamp>"
       message: ""
       observedGeneration: 2
       reason: Ready
       status: "True"
       type: Ready
   ```

**Karpenter HyperPod 제공업체에 지원되는 레이블**

다음은 `NodePool` 구성에서 지정할 수 있는 선택적 제약 조건 및 요구 사항입니다.


|  요구 사항 유형  |  용도  |  사용 사례/지원되는 값  |  권장 사항  | 
| --- | --- | --- | --- | 
|  인스턴스 유형(`node.kubernetes.io/instance-type`)  |  Karpenter가 선택할 수 있는 SageMaker 인스턴스 유형 제어  |  ml.c5.xlarge로만 제한하는 대신 Karpenter가 인스턴스 그룹의 사용 가능한 모든 유형 중에서 선택하도록 합니다.  |  이 항목을 정의하지 않은 상태로 두거나 Exists 운영자를 사용하여 Karpenter가 비용 효과적인 인스턴스 유형을 선택할 수 있는 유연성을 극대화합니다.  | 
|  가용 영역(`topology.kubernetes.io/zone`)  |  에서 생성할 수 있는 AWS 가용 영역 노드 제어  |  us-east-1c와 같은 특정 영역 이름입니다. 지연 시간 또는 규정 준수 이유로 특정 영역에서 실행하는 데 포드가 필요한 경우 사용합니다.  | 해당 사항 없음 | 
|  아키텍처(`kubernetes.io/arch`)  |  CPU 아키텍처 지정  |  amd64만 해당(현재 ARM 지원되지 않음)합니다.  |  해당 사항 없음  | 

# 워크로드 배포
<a name="sagemaker-hyperpod-eks-autoscaling-workload"></a>

다음 예시에서는 Karpenter를 사용한 HyperPod 오토 스케일링이 워크로드 수요에 따라 노드를 자동으로 프로비저닝하는 방법을 보여줍니다. 이 예시에서는 기본 규모 조정 동작과 다중 가용 영역 배포 패턴을 보여줍니다.

**간단한 워크로드 배포**

1. 다음 Kubernetes 배포에는 복제본 또는 포드당 1개의 CPU 및 256M의 메모리를 요청하는 포드가 포함됩니다. 이 시나리오에서는 포드가 아직 구동되지 않습니다.

   ```
   kubectl apply -f https://raw.githubusercontent.com/aws/karpenter-provider-aws/refs/heads/main/examples/workloads/inflate.yaml
   ```

1. 스케일 업 프로세스를 테스트하려면 다음 명령을 실행합니다. Karpenter는 클러스터에 새 노드를 추가합니다.

   ```
   kubectl scale deployment inflate --replicas 10
   ```

1. 스케일 다운 프로세스를 테스트하려면 다음 명령을 실행합니다. Karpenter는 클러스터에서 노드를 제거합니다.

   ```
   kubectl scale deployment inflate --replicas 0
   ```

**여러 AZ에 워크로드 배포**

1. 다음 명령을 실행하여 배포 중인 포드가 최대 스큐 1로 여러 가용 영역에 고르게 분산되어야 하는 Kubernetes 배포를 실행하는 워크로드를 배포합니다.

   ```
   kubectl apply -f https://raw.githubusercontent.com/aws/karpenter-provider-aws/refs/heads/main/examples/workloads/spread-zone.yaml
   ```

1. 다음 명령을 실행하여 포드 수를 조정합니다.

   ```
   kubectl scale deployment zone-spread --replicas 15
   ```

   Karpenter는 다른 가용 영역에서 하나 이상의 노드가 있는 클러스터에 새 노드를 추가합니다.

자세한 예는 GitHub의 [Karpenter example workloads](https://github.com/aws/karpenter-provider-aws/tree/main/examples/workloads)를 참조하세요.