

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

# 모델 배포를 위한 HyperPod 클러스터 설정
<a name="sagemaker-hyperpod-model-deployment-setup"></a>

이 가이드에서는 Amazon SageMaker HyperPod 클러스터에서 추론 기능을 활성화하는 방법을 보여줍니다. 기계 학습 엔지니어가 추론 엔드포인트를 배포하고 관리하는 데 필요한 인프라, 권한 및 운영자를 설정합니다.

**참고**  
추론 연산자가 사전 설치된 클러스터를 생성하려면 섹션을 참조하세요[EKS에 의해 오케스트레이션된 SageMaker HyperPod 클러스터 생성](sagemaker-hyperpod-quickstart.md#sagemaker-hyperpod-quickstart-eks). 기존 클러스터에 추론 연산자를 설치하려면 다음 절차를 계속 진행합니다.

간소화된 환경을 위해 SageMaker AI 콘솔을 사용하여 추론 연산자를 설치하거나 더 많은 제어를 위해 AWS CLI를 사용할 수 있습니다. 이 가이드에서는 두 가지 설치 방법을 모두 다룹니다.

## 방법 1: SageMaker AI 콘솔을 통해 HyperPod 추론 추가 기능 설치(권장)
<a name="sagemaker-hyperpod-model-deployment-setup-ui"></a>

SageMaker AI 콘솔은 두 가지 설치 옵션으로 가장 간소화된 환경을 제공합니다.
+ **빠른 설치:** IAM 역할, Amazon S3 버킷 및 종속성 추가 기능을 포함하여 최적화된 기본값으로 필요한 모든 리소스를 자동으로 생성합니다. JumpStart 모델을 관련 클러스터에 배포하는 데 필요한 권한이 있는 새 Studio 도메인이 생성됩니다. 이 옵션은 최소한의 구성 결정으로 빠르게 시작하는 데 적합합니다.
+ **사용자 지정 설치:** 원클릭 환경을 유지하면서 기존 리소스를 지정하거나 구성을 사용자 지정할 수 있는 유연성을 제공합니다. 고객은 조직의 요구 사항에 따라 기존 IAM 역할, Amazon S3 버킷 또는 종속성 추가 기능을 재사용하도록 선택할 수 있습니다.

### 사전 조건
<a name="sagemaker-hyperpod-model-deployment-setup-ui-prereqs"></a>
+ Amazon EKS 오케스트레이션을 사용하는 기존 HyperPod 클러스터
+ Amazon EKS 클러스터 관리에 대한 IAM 권한
+ 클러스터 액세스를 위해 구성된 kubectl

### 설치 단계
<a name="sagemaker-hyperpod-model-deployment-setup-ui-steps"></a>

1. SageMaker AI 콘솔로 이동하여 **HyperPod 클러스터** → **클러스터 관리**로 이동합니다.

1. 추론 연산자를 설치할 클러스터를 선택합니다.

1. **추론** 탭으로 이동합니다. 자동 설정을 위해 **빠른 설치를** 선택하고 구성 유연성을 위해 **사용자 지정 설치를** 선택합니다.

1. 사용자 지정 설치를 선택하는 경우 기존 리소스를 지정하거나 필요에 따라 설정을 사용자 지정합니다.

1. **설치를** 클릭하여 자동 설치 프로세스를 시작합니다.

1. 콘솔을 통해 또는 다음 명령을 실행하여 설치 상태를 확인합니다.

   ```
   kubectl get pods -n hyperpod-inference-system
   ```

   ```
   aws eks describe-addon --cluster-name CLUSTER-NAME --addon-name amazon-sagemaker-hyperpod-inference --region REGION
   ```

추가 기능이 성공적으로 설치되면 모델 배포 설명서를 사용하여 모델을 배포하거나 로 이동할 수 있습니다[추론 운영자가 작동하는지 확인](#sagemaker-hyperpod-model-deployment-setup-verify).

## 방법 2: AWS CLI를 사용하여 추론 연산자 설치
<a name="sagemaker-hyperpod-model-deployment-setup-addon"></a>

 AWS CLI 설치 방법은 설치 프로세스를 더 잘 제어할 수 있으며 자동화 및 고급 구성에 적합합니다.

### 사전 조건
<a name="sagemaker-hyperpod-model-deployment-setup-prereq-addon"></a>

추론 연산자를 사용하면 Amazon EKS 클러스터에서 기계 학습 추론 엔드포인트를 배포하고 관리할 수 있습니다. 설치하기 전에 클러스터에 필요한 보안 구성과 지원 인프라가 있는지 확인합니다. 다음 단계를 완료하여 IAM 역할을 구성하고, AWS Load Balancer 컨트롤러를 설치하고, Amazon S3 및 Amazon FSx CSI 드라이버를 설정하고, KEDA 및 cert-manager를 배포합니다.

1. [클러스터에 연결하고 환경 변수를 설정합니다.](#sagemaker-hyperpod-model-deployment-setup-connect-addon)

1. [추론 연산자에 대한 IAM 역할 구성](#sagemaker-hyperpod-model-deployment-setup-prepare-addon)

1. [ALB 컨트롤러 역할 생성](#sagemaker-hyperpod-model-deployment-setup-alb-addon)

1. [KEDA 운영자 역할 생성](#sagemaker-hyperpod-model-deployment-setup-keda-addon)

1. [종속성 EKS 추가 기능 설치](#sagemaker-hyperpod-model-deployment-setup-install-dependencies)

**참고**  
또는 CloudFormation 템플릿을 사용하여 사전 조건 설정을 자동화할 수 있습니다. 자세한 내용은 [CloudFormation 템플릿을 사용하여 사전 조건 스택 생성](#sagemaker-hyperpod-model-deployment-setup-cfn) 단원을 참조하십시오.

### 클러스터에 연결하고 환경 변수를 설정합니다.
<a name="sagemaker-hyperpod-model-deployment-setup-connect-addon"></a>

계속하기 전에 자격 AWS 증명이 올바르게 구성되어 있고 필요한 권한이 있는지 확인합니다. Amazon EKS 클러스터에 대한 관리자 권한 및 클러스터 관리자 액세스 권한이 있는 IAM 보안 주체를 사용하여 다음 단계를 실행합니다. 를 사용하여 HyperPod 클러스터를 생성했는지 확인합니다[Amazon EKS 오케스트레이션을 사용하여 SageMaker HyperPod 클러스터 생성](sagemaker-hyperpod-eks-operate-console-ui-create-cluster.md). helm, eksctl 및 kubectl 명령줄 유틸리티를 설치합니다.

Amazon EKS 클러스터에 대한 Kubernetes 관리 액세스의 경우 Amazon EKS 콘솔을 열고 클러스터를 선택합니다. **액세스** 탭에서 **IAM 액세스 항목을** 선택합니다. IAM 보안 주체에 대한 항목이 없는 경우 **액세스 항목 생성을** 선택합니다. 원하는 IAM 보안 주체를 선택하고를 해당 보안 주체`AmazonEKSClusterAdminPolicy`와 연결합니다.

1. Amazon EKS 클러스터에 의해 오케스트레이션되어 새로 생성된 HyperPod 클러스터에 연결하도록 kubectl을 구성합니다. 리전 및 HyperPod 클러스터 이름을 지정합니다.

   ```
   export HYPERPOD_CLUSTER_NAME=<hyperpod-cluster-name>
   export REGION=<region>
   
   # S3 bucket where tls certificates will be uploaded
   export BUCKET_NAME="hyperpod-tls-<your-bucket-suffix>" # Bucket should have prefix: hyperpod-tls-*
   
   export EKS_CLUSTER_NAME=$(aws --region $REGION sagemaker describe-cluster --cluster-name $HYPERPOD_CLUSTER_NAME \
   --query 'Orchestrator.Eks.ClusterArn' --output text | \
   cut -d'/' -f2)
   aws eks update-kubeconfig --name $EKS_CLUSTER_NAME --region $REGION
   ```
**참고**  
로 시작하지 않는 사용자 지정 버킷 이름을 사용하는 경우 실행 역할에 다음 정책을 `hyperpod-tls-`연결합니다.  

   ```
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "TLSBucketDeleteObjectsPermission",
               "Effect": "Allow",
               "Action": ["s3:DeleteObject"],
               "Resource": ["arn:aws:s3:::${BUCKET_NAME}/*"],
               "Condition": {
                   "StringEquals": {
                       "aws:ResourceAccount": "${aws:PrincipalAccount}"
                   }
               }
           },
           {
               "Sid": "TLSBucketGetObjectAccess",
               "Effect": "Allow",
               "Action": ["s3:GetObject"],
               "Resource": ["arn:aws:s3:::${BUCKET_NAME}/*"]
           },
           {
               "Sid": "TLSBucketPutObjectAccess",
               "Effect": "Allow",
               "Action": ["s3:PutObject", "s3:PutObjectTagging"],
               "Resource": ["arn:aws:s3:::${BUCKET_NAME}/*"],
               "Condition": {
                   "StringEquals": {
                       "aws:ResourceAccount": "${aws:PrincipalAccount}"
                   }
               }
           }
       ]
   }
   ```

1. 기본 환경 변수를 설정합니다.

   ```
   HYPERPOD_INFERENCE_ROLE_NAME="SageMakerHyperPodInference-$HYPERPOD_CLUSTER_NAME"
   HYPERPOD_INFERENCE_NAMESPACE="hyperpod-inference-system"
   ```

1. 클러스터 ARN에서 Amazon EKS 클러스터 이름을 추출하고, 로컬 kubeconfig를 업데이트하고, 네임스페이스 전반의 모든 포드를 나열하여 연결을 확인합니다.

   ```
   kubectl get pods --all-namespaces
   ```

1. (선택 사항) NVIDIA 디바이스 플러그인을 설치하여 클러스터에서 GPU 지원을 활성화합니다.

   ```
   # Install nvidia device plugin
   kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.5/nvidia-device-plugin.yml
   # Verify that GPUs are visible to k8s
   kubectl get nodes -o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia.com/gpu
   ```

### 추론 연산자에 대한 IAM 역할 구성
<a name="sagemaker-hyperpod-model-deployment-setup-prepare-addon"></a>

1. Amazon EKS, SageMaker AI 및 IAM 구성 요소 간의 서비스 통합을 구성하는 데 필요한 필수 AWS 리소스 식별자 및 ARNs을 수집합니다.

   ```
   %%bash -x
   
   export ACCOUNT_ID=$(aws --region $REGION sts get-caller-identity --query 'Account' --output text)
   export OIDC_ID=$(aws --region $REGION eks describe-cluster --name $EKS_CLUSTER_NAME --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
   export EKS_CLUSTER_ROLE=$(aws eks --region $REGION describe-cluster --name $EKS_CLUSTER_NAME --query 'cluster.roleArn' --output text)
   ```

1. IAM OIDCidentity 제공업체를 EKS 클러스터와 연결합니다.

   ```
   eksctl utils associate-iam-oidc-provider --region=$REGION --cluster=$EKS_CLUSTER_NAME --approve
   ```

1. HyperPod 추론 연산자 IAM 역할에 필요한 신뢰 정책을 생성합니다. 이러한 정책은 Amazon EKS, SageMaker AI 및 기타 AWS 서비스 간의 안전한 서비스 간 통신을 가능하게 합니다.

   ```
   %%bash -x
   
   # Create trust policy JSON
   cat << EOF > trust-policy.json
   {
   "Version": "2012-10-17",		 	 	 
   "Statement": [
       {
           "Effect": "Allow",
           "Principal": {
               "Service": [
                   "sagemaker.amazonaws.com"
               ]
           },
           "Action": "sts:AssumeRole"
       },
       {
           "Effect": "Allow",
           "Principal": {
               "Federated": "arn:aws:iam::${ACCOUNT_ID}:oidc-provider/oidc.eks.${REGION}.amazonaws.com/id/${OIDC_ID}"
           },
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
               "StringLike": {
                   "oidc.eks.${REGION}.amazonaws.com/id/${OIDC_ID}:aud": "sts.amazonaws.com",
                   "oidc.eks.${REGION}.amazonaws.com/id/${OIDC_ID}:sub": "system:serviceaccount:hyperpod-inference-system:hyperpod-inference-controller-manager"
               }
           }
       }
   ]
   }
   EOF
   ```

1. 추론 운영자에 대한 실행 역할을 생성합니다.

   ```
   aws iam create-role --role-name $HYPERPOD_INFERENCE_ROLE_NAME --assume-role-policy-document file://trust-policy.json
   aws iam attach-role-policy --role-name $HYPERPOD_INFERENCE_ROLE_NAME --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerHyperPodInferenceAccess
   ```

1. 추론 연산자 리소스의 네임스페이스 생성

   ```
   kubectl create namespace $HYPERPOD_INFERENCE_NAMESPACE
   ```

### ALB 컨트롤러 역할 생성
<a name="sagemaker-hyperpod-model-deployment-setup-alb-addon"></a>

1. 신뢰 정책 및 권한 정책을 생성합니다.

   ```
   # Create trust policy
   cat <<EOF > /tmp/alb-trust-policy.json
   {
   "Version": "2012-10-17",		 	 	 
   "Statement": [
       {
           "Effect": "Allow",
           "Principal": {
               "Federated": "arn:aws:iam::$ACCOUNT_ID:oidc-provider/oidc.eks.$REGION.amazonaws.com/id/$OIDC_ID"
           },
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
               "StringLike": {
                   "oidc.eks.$REGION.amazonaws.com/id/$OIDC_ID:sub": "system:serviceaccount:hyperpod-inference-system:aws-load-balancer-controller",
                   "oidc.eks.$REGION.amazonaws.com/id/$OIDC_ID:aud": "sts.amazonaws.com"
               }
           }
       }
   ]
   }
   EOF
   
   # Create permissions policy
   export ALBController_IAM_POLICY_NAME=HyperPodInferenceALBControllerIAMPolicy
   curl -o AWSLoadBalancerControllerIAMPolicy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.13.0/docs/install/iam_policy.json
   
   # Create the role
   aws iam create-role \
       --role-name alb-role \
       --assume-role-policy-document file:///tmp/alb-trust-policy.json 
   
   # Create the policy
   ALB_POLICY_ARN=$(aws iam create-policy \
       --policy-name $ALBController_IAM_POLICY_NAME \
       --policy-document file://AWSLoadBalancerControllerIAMPolicy.json \
       --query 'Policy.Arn' \
       --output text)
   
   # Attach the policy to the role
   aws iam attach-role-policy \
       --role-name alb-role \
       --policy-arn $ALB_POLICY_ARN
   ```

1. Amazon EKS 클러스터(퍼블릭 및 프라이빗 모두`kubernetes.io.role/elb`)의 모든 서브넷에 태그()를 적용합니다.

   ```
   export VPC_ID=$(aws --region $REGION eks describe-cluster --name $EKS_CLUSTER_NAME --query 'cluster.resourcesVpcConfig.vpcId' --output text)
   
   # Add Tags
   aws ec2 describe-subnets \
   --filters "Name=vpc-id,Values=${VPC_ID}" "Name=map-public-ip-on-launch,Values=true" \
   --query 'Subnets[*].SubnetId' --output text | \
   tr '\t' '\n' | \
   xargs -I{} aws ec2 create-tags --resources {} --tags Key=kubernetes.io/role/elb,Value=1
   
   # Verify Tags are added
   aws ec2 describe-subnets \
   --filters "Name=vpc-id,Values=${VPC_ID}" "Name=map-public-ip-on-launch,Values=true" \
   --query 'Subnets[*].SubnetId' --output text | \
   tr '\t' '\n' |
   xargs -n1 -I{} aws ec2 describe-tags --filters "Name=resource-id,Values={}" "Name=key,Values=kubernetes.io/role/elb" --query "Tags[0].Value" --output text
   ```

1. Amazon S3 VPC 엔드포인트 생성

   ```
   aws ec2 create-vpc-endpoint \
       --region ${REGION} \
       --vpc-id ${VPC_ID} \
       --vpc-endpoint-type Gateway \
       --service-name "com.amazonaws.${REGION}.s3" \
       --route-table-ids $(aws ec2 describe-route-tables --region $REGION --filters "Name=vpc-id,Values=${VPC_ID}" --query 'RouteTables[].Associations[].RouteTableId' --output text | tr ' ' '\n' | sort -u | tr '\n' ' ')
   ```

### KEDA 운영자 역할 생성
<a name="sagemaker-hyperpod-model-deployment-setup-keda-addon"></a>

1. 신뢰 정책 및 권한 정책을 생성합니다.

   ```
   # Create trust policy
   cat <<EOF > /tmp/keda-trust-policy.json
   {
   "Version": "2012-10-17",		 	 	 
   "Statement": [
       {
           "Effect": "Allow",
           "Principal": {
               "Federated": "arn:aws:iam::$ACCOUNT_ID:oidc-provider/oidc.eks.$REGION.amazonaws.com/id/$OIDC_ID"
           },
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
               "StringLike": {
                   "oidc.eks.$REGION.amazonaws.com/id/$OIDC_ID:sub": "system:serviceaccount:hyperpod-inference-system:keda-operator",
                   "oidc.eks.$REGION.amazonaws.com/id/$OIDC_ID:aud": "sts.amazonaws.com"
               }
           }
       }
   ]
   }
   EOF
   
   # Create permissions policy
   cat <<EOF > /tmp/keda-policy.json
   {
   "Version": "2012-10-17",		 	 	 
   "Statement": [
       {
           "Effect": "Allow",
           "Action": [
               "cloudwatch:GetMetricData",
               "cloudwatch:GetMetricStatistics",
               "cloudwatch:ListMetrics"
           ],
           "Resource": "*"
       },
       {
           "Effect": "Allow",
           "Action": [
               "aps:QueryMetrics",
               "aps:GetLabels",
               "aps:GetSeries",
               "aps:GetMetricMetadata"
           ],
           "Resource": "*"
       }
   ]
   }
   EOF
   
   # Create the role
   aws iam create-role \
       --role-name keda-operator-role \
       --assume-role-policy-document file:///tmp/keda-trust-policy.json
   
   # Create the policy
   KEDA_POLICY_ARN=$(aws iam create-policy \
       --policy-name KedaOperatorPolicy \
       --policy-document file:///tmp/keda-policy.json \
       --query 'Policy.Arn' \
       --output text)
   
   # Attach the policy to the role
   aws iam attach-role-policy \
       --role-name keda-operator-role \
       --policy-arn $KEDA_POLICY_ARN
   ```

1. 게이트 모델을 사용하는 경우 IAM 역할을 생성하여 게이트 모델에 액세스합니다.

   1. IAM 정책을 생성합니다.

      ```
      %%bash -s $REGION
      
      JUMPSTART_GATED_ROLE_NAME="JumpstartGatedRole-${REGION}-${HYPERPOD_CLUSTER_NAME}"
      
      cat <<EOF > /tmp/trust-policy.json
      {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Principal": {
                  "Federated": "arn:aws:iam::$ACCOUNT_ID:oidc-provider/oidc.eks.$REGION.amazonaws.com/id/$OIDC_ID"
              },
              "Action": "sts:AssumeRoleWithWebIdentity",
              "Condition": {
                  "StringLike": {
                      "oidc.eks.$REGION.amazonaws.com/id/$OIDC_ID:sub": "system:serviceaccount:*:hyperpod-inference-service-account*",
                      "oidc.eks.$REGION.amazonaws.com/id/$OIDC_ID:aud": "sts.amazonaws.com"
                  }
              }
          },
              {
              "Effect": "Allow",
              "Principal": {
                  "Service": "sagemaker.amazonaws.com"
              },
              "Action": "sts:AssumeRole"
          }
      ]
      }
      EOF
      ```

   1. IAM 역할을 생성합니다.

      ```
      # Create the role using existing trust policy
      aws iam create-role \
      --role-name $JUMPSTART_GATED_ROLE_NAME \
      --assume-role-policy-document file:///tmp/trust-policy.json
      
      aws iam attach-role-policy \
      --role-name $JUMPSTART_GATED_ROLE_NAME \
      --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerHyperPodGatedModelAccess
      ```

      ```
      JUMPSTART_GATED_ROLE_ARN_LIST= !aws iam get-role --role-name=$JUMPSTART_GATED_ROLE_NAME --query "Role.Arn" --output text
      JUMPSTART_GATED_ROLE_ARN = JUMPSTART_GATED_ROLE_ARN_LIST[0]
      !echo $JUMPSTART_GATED_ROLE_ARN
      ```

### 종속성 EKS 추가 기능 설치
<a name="sagemaker-hyperpod-model-deployment-setup-install-dependencies"></a>

추론 연산자를 설치하기 전에 클러스터에 다음과 같은 필수 EKS 추가 기능을 설치해야 합니다. 이러한 종속성 중 하나라도 누락된 경우 추론 연산자는 설치에 실패합니다. 각 추가 기능에는 추론 추가 기능과의 호환성을 위한 최소 버전 요구 사항이 있습니다.

**중요**  
추론 연산자를 설치하기 전에 모든 종속성 추가 기능을 설치합니다. 종속성이 누락되면 특정 오류 메시지와 함께 설치가 실패합니다.

#### 필수 추가 기능
<a name="sagemaker-hyperpod-model-deployment-setup-required-addons"></a>

1. **Amazon S3 Mountpoint CSI 드라이버**(최소 버전: v1.14.1-eksbuild.1)

   추론 워크로드에서 S3 버킷을 영구 볼륨으로 탑재하는 데 필요합니다.

   ```
   aws eks create-addon \
       --cluster-name $EKS_CLUSTER_NAME \
       --addon-name aws-mountpoint-s3-csi-driver \
       --region $REGION \
       --service-account-role-arn $S3_CSI_ROLE_ARN
   ```

   필요한 IAM 권한을 포함한 자세한 설치 지침은 [Mountpoint for Amazon S3 CSI 드라이버](https://docs.aws.amazon.com/eks/latest/userguide/workloads-add-ons-available-eks.html#mountpoint-for-s3-add-on)를 참조하세요.

1. **Amazon FSx CSI 드라이버**(최소 버전: v1.6.0-eksbuild.1)

   고성능 모델 스토리지를 위해 FSx 파일 시스템을 탑재하는 데 필요합니다.

   ```
   aws eks create-addon \
       --cluster-name $EKS_CLUSTER_NAME \
       --addon-name aws-fsx-csi-driver \
       --region $REGION \
       --service-account-role-arn $FSX_CSI_ROLE_ARN
   ```

   필요한 IAM 권한을 포함한 자세한 설치 지침은 [Amazon FSx for Lustre CSI 드라이버](https://docs.aws.amazon.com/eks/latest/userguide/workloads-add-ons-available-eks.html#add-ons-aws-fsx-csi-driver)를 참조하세요.

1. **지표 서버**(최소 버전: v0.7.2-eksbuild.4)

   Auto Scaling 기능 및 리소스 지표 수집에 필요합니다.

   ```
   aws eks create-addon \
       --cluster-name $EKS_CLUSTER_NAME \
       --addon-name metrics-server \
       --region $REGION
   ```

   자세한 설치 지침은 [지표 서버를 참조하세요](https://docs.aws.amazon.com/eks/latest/userguide/metrics-server.html).

1. **Cert Manager**(최소 버전: v1.18.2-eksbuild.2)

   보안 추론 엔드포인트를 위한 TLS 인증서 관리에 필요합니다.

   ```
   aws eks create-addon \
       --cluster-name $EKS_CLUSTER_NAME \
       --addon-name cert-manager \
       --region $REGION
   ```

   자세한 설치 지침은 [cert-manager](https://docs.aws.amazon.com/eks/latest/userguide/community-addons.html#addon-cert-manager)를 참조하세요.

#### 추가 기능 설치 확인
<a name="sagemaker-hyperpod-model-deployment-setup-verify-dependencies"></a>

필요한 추가 기능을 설치한 후 올바르게 실행되고 있는지 확인합니다.

```
# Check add-on status
aws eks describe-addon --cluster-name $EKS_CLUSTER_NAME --addon-name aws-mountpoint-s3-csi-driver --region $REGION
aws eks describe-addon --cluster-name $EKS_CLUSTER_NAME --addon-name aws-fsx-csi-driver --region $REGION
aws eks describe-addon --cluster-name $EKS_CLUSTER_NAME --addon-name metrics-server --region $REGION
aws eks describe-addon --cluster-name $EKS_CLUSTER_NAME --addon-name cert-manager --region $REGION

# Verify pods are running
kubectl get pods -n kube-system | grep -E "(mountpoint|fsx|metrics-server)"
kubectl get pods -n cert-manager
```

추론 연산자 설치를 진행하기 전에 모든 추가 기능에 상태가 "ACTIVE"로 표시되고 모든 포드가 "Running" 상태여야 합니다.

**참고**  
빠른 설정 또는 사용자 지정 설정 옵션을 사용하여 HyperPod 클러스터를 생성한 경우 FSx CSI 드라이버 및 Cert Manager가 이미 설치되어 있을 수 있습니다. 위의 명령을 사용하여 존재 여부를 확인합니다.

### EKS 추가 기능을 사용하여 추론 연산자 설치
<a name="sagemaker-hyperpod-model-deployment-setup-install-inference-operator-addon"></a>

EKS 추가 기능 설치 방법은 자동 업데이트 및 통합 종속성 검증을 통해 관리형 환경을 제공합니다. 이는 추론 연산자를 설치하는 데 권장되는 접근 방식입니다.

**추론 연산자 추가 기능 설치**

1. 필요한 모든 ARNs을 수집하고 구성 파일을 생성하여 추가 기능 구성을 준비합니다.

   ```
   # Gather required ARNs
   export EXECUTION_ROLE_ARN=$(aws iam get-role --role-name $HYPERPOD_INFERENCE_ROLE_NAME --query "Role.Arn" --output text)
   export HYPERPOD_CLUSTER_ARN=$(aws sagemaker describe-cluster --cluster-name $HYPERPOD_CLUSTER_NAME --region $REGION --query "ClusterArn" --output text)
   export KEDA_ROLE_ARN=$(aws iam get-role --role-name keda-operator-role --query 'Role.Arn' --output text)
   export ALB_ROLE_ARN=$(aws iam get-role --role-name alb-role --query 'Role.Arn' --output text)
   
   # Verify all ARNs are set correctly
   echo "Execution Role ARN: $EXECUTION_ROLE_ARN"
   echo "HyperPod Cluster ARN: $HYPERPOD_CLUSTER_ARN"
   echo "KEDA Role ARN: $KEDA_ROLE_ARN"
   echo "ALB Role ARN: $ALB_ROLE_ARN"
   echo "TLS S3 Bucket: $BUCKET_NAME"
   ```

1. 필요한 모든 설정을 사용하여 추가 기능 구성 파일을 생성합니다.

   ```
   cat > addon-config.json << EOF
   {
     "executionRoleArn": "$EXECUTION_ROLE_ARN",
     "tlsCertificateS3Bucket": "$BUCKET_NAME",
     "hyperpodClusterArn": "$HYPERPOD_CLUSTER_ARN",
     "jumpstartGatedModelDownloadRoleArn": "$JUMPSTART_GATED_ROLE_ARN",
     "alb": {
       "serviceAccount": {
         "create": true,
         "roleArn": "$ALB_ROLE_ARN"
       }
     },
     "keda": {
       "auth": {
         "aws": {
           "irsa": {
             "roleArn": "$KEDA_ROLE_ARN"
           }
         }
       }
     }
   }
   EOF
   
   # Verify the configuration file
   cat addon-config.json
   ```

1. 추론 연산자 추가 기능(최소 버전: v1.0.0-eksbuild.1)을 설치합니다.

   ```
   aws eks create-addon \
       --cluster-name $EKS_CLUSTER_NAME \
       --addon-name amazon-sagemaker-hyperpod-inference \
       --configuration-values file://addon-config.json \
       --region $REGION
   ```

1. 설치 진행 상황을 모니터링하고 성공적인 완료를 확인합니다.

   ```
   # Check installation status (repeat until status shows "ACTIVE")
   aws eks describe-addon \
       --cluster-name $EKS_CLUSTER_NAME \
       --addon-name amazon-sagemaker-hyperpod-inference \
       --region $REGION \
       --query "addon.{Status:status,Health:health}" \
       --output table
   
   # Verify pods are running
   kubectl get pods -n hyperpod-inference-system
   
   # Check operator logs for any issues
   kubectl logs -n hyperpod-inference-system deployment/hyperpod-inference-controller-manager --tail=50
   ```

설치 문제에 대한 자세한 문제 해결은 섹션을 참조하세요[HyperPod 추론 문제 해결](sagemaker-hyperpod-model-deployment-ts.md).

추론 연산자가 올바르게 작동하는지 확인하려면 로 계속 진행합니다[추론 운영자가 작동하는지 확인](#sagemaker-hyperpod-model-deployment-setup-verify).

### CloudFormation 템플릿을 사용하여 사전 조건 스택 생성
<a name="sagemaker-hyperpod-model-deployment-setup-cfn"></a>

사전 조건을 수동으로 구성하는 대신 CloudFormation 템플릿을 사용하여 추론 연산자에 필요한 IAM 역할 및 정책 생성을 자동화할 수 있습니다.

1. 입력 변수를 설정합니다. 자리 표시자 값을 자신의 값으로 바꿉니다.

   ```
   #!/bin/bash
   set -e
   
   # ===== INPUT VARIABLES =====
   HP_CLUSTER_NAME="my-hyperpod-cluster"  # Replace with your HyperPod cluster name
   REGION="us-east-1"  # Replace with your AWS region
   PREFIX="my-prefix"  # Replace with your resource prefix
   SHORT_PREFIX="12a34d56"  # Replace with your short prefix (maximum 8 characters)
   CREATE_DOMAIN="true"  # Set to "false" if you don't need a SageMaker Studio domain
   STACK_NAME="hyperpod-inference-prerequisites"  # Replace with your stack name
   TEMPLATE_URL="https://aws-sagemaker-hyperpod-cluster-setup-${REGION}-prod.s3.${REGION}.amazonaws.com/templates/main-stack-inference-operator-addon-template.yaml"
   ```

1. 클러스터 및 네트워크 정보를 도출합니다.

   ```
   # ===== DERIVE EKS CLUSTER NAME =====
   EKS_CLUSTER_NAME=$(aws sagemaker describe-cluster --cluster-name $HP_CLUSTER_NAME --region $REGION --query 'Orchestrator.Eks.ClusterArn' --output text | awk -F'/' '{print $NF}')
   echo "EKS_CLUSTER_NAME=$EKS_CLUSTER_NAME"
   
   # ===== GET VPC AND OIDC =====
   VPC_ID=$(aws eks describe-cluster --name $EKS_CLUSTER_NAME --region $REGION --query 'cluster.resourcesVpcConfig.vpcId' --output text)
   echo "VPC_ID=$VPC_ID"
   
   OIDC_PROVIDER=$(aws eks describe-cluster --name $EKS_CLUSTER_NAME --region $REGION --query 'cluster.identity.oidc.issuer' --output text | sed 's|https://||')
   echo "OIDC_PROVIDER=$OIDC_PROVIDER"
   
   # ===== GET PRIVATE ROUTE TABLES =====
   ALL_ROUTE_TABLES=$(aws ec2 describe-route-tables --region $REGION --filters "Name=vpc-id,Values=$VPC_ID" --query 'RouteTables[].RouteTableId' --output text)
   EKS_PRIVATE_ROUTE_TABLES=""
   for rtb in $ALL_ROUTE_TABLES; do
       HAS_IGW=$(aws ec2 describe-route-tables --region $REGION --route-table-ids $rtb --query 'RouteTables[0].Routes[?GatewayId && starts_with(GatewayId, `igw-`)]' --output text 2>/dev/null)
       if [ -z "$HAS_IGW" ]; then
           EKS_PRIVATE_ROUTE_TABLES="${EKS_PRIVATE_ROUTE_TABLES:+$EKS_PRIVATE_ROUTE_TABLES,}$rtb"
       fi
   done
   echo "EKS_PRIVATE_ROUTE_TABLES=$EKS_PRIVATE_ROUTE_TABLES"
   
   # ===== CHECK S3 VPC ENDPOINT =====
   S3_ENDPOINT_EXISTS=$(aws ec2 describe-vpc-endpoints --region $REGION --filters "Name=vpc-id,Values=$VPC_ID" "Name=service-name,Values=com.amazonaws.$REGION.s3" --query 'VpcEndpoints[0].VpcEndpointId' --output text)
   CREATE_S3_ENDPOINT_STACK=$([ "$S3_ENDPOINT_EXISTS" == "None" ] && echo "true" || echo "false")
   echo "CREATE_S3_ENDPOINT_STACK=$CREATE_S3_ENDPOINT_STACK"
   
   # ===== GET HYPERPOD DETAILS =====
   HYPERPOD_CLUSTER_ARN=$(aws sagemaker describe-cluster --cluster-name $HP_CLUSTER_NAME --region $REGION --query 'ClusterArn' --output text)
   echo "HYPERPOD_CLUSTER_ARN=$HYPERPOD_CLUSTER_ARN"
   
   # ===== GET DEFAULT VPC FOR DOMAIN =====
   DOMAIN_VPC_ID=$(aws ec2 describe-vpcs --region $REGION --filters "Name=isDefault,Values=true" --query 'Vpcs[0].VpcId' --output text)
   echo "DOMAIN_VPC_ID=$DOMAIN_VPC_ID"
   
   DOMAIN_SUBNET_IDS=$(aws ec2 describe-subnets --region $REGION --filters "Name=vpc-id,Values=$DOMAIN_VPC_ID" --query 'Subnets[0].SubnetId' --output text)
   echo "DOMAIN_SUBNET_IDS=$DOMAIN_SUBNET_IDS"
   
   # ===== GET INSTANCE GROUPS =====
   INSTANCE_GROUPS=$(aws sagemaker describe-cluster --cluster-name $HP_CLUSTER_NAME --region $REGION --query 'InstanceGroups[].InstanceGroupName' --output json | python3 -c "import sys, json; groups = json.load(sys.stdin); print('[' + ','.join([f'\\\\\\\"' + g + '\\\\\\\"' for g in groups]) + ']')")
   echo "INSTANCE_GROUPS=$INSTANCE_GROUPS"
   ```

1. 파라미터 파일을 생성하고 스택을 배포합니다.

   ```
   # ===== CREATE PARAMETERS JSON =====
   cat > /tmp/cfn-params.json << EOF
   [
     {"ParameterKey":"ResourceNamePrefix","ParameterValue":"$PREFIX"},
     {"ParameterKey":"ResourceNameShortPrefix","ParameterValue":"$SHORT_PREFIX"},
     {"ParameterKey":"VpcId","ParameterValue":"$VPC_ID"},
     {"ParameterKey":"EksPrivateRouteTableIds","ParameterValue":"$EKS_PRIVATE_ROUTE_TABLES"},
     {"ParameterKey":"EKSClusterName","ParameterValue":"$EKS_CLUSTER_NAME"},
     {"ParameterKey":"OIDCProviderURLWithoutProtocol","ParameterValue":"$OIDC_PROVIDER"},
     {"ParameterKey":"HyperPodClusterArn","ParameterValue":"$HYPERPOD_CLUSTER_ARN"},
     {"ParameterKey":"HyperPodClusterName","ParameterValue":"$HP_CLUSTER_NAME"},
     {"ParameterKey":"CreateDomain","ParameterValue":"$CREATE_DOMAIN"},
     {"ParameterKey":"DomainVpcId","ParameterValue":"$DOMAIN_VPC_ID"},
     {"ParameterKey":"DomainSubnetIds","ParameterValue":"$DOMAIN_SUBNET_IDS"},
     {"ParameterKey":"CreateS3EndpointStack","ParameterValue":"$CREATE_S3_ENDPOINT_STACK"},
     {"ParameterKey":"TieredStorageConfig","ParameterValue":"{\"Mode\":\"Enable\",\"InstanceMemoryAllocationPercentage\":20}"},
     {"ParameterKey":"TieredKVCacheConfig","ParameterValue":"{\"KVCacheMode\":\"Enable\",\"InstanceGroup\":$INSTANCE_GROUPS,\"NVMeMode\":\"Enable\"}"}
   ]
   EOF
   
   echo -e "\n===== CREATING CLOUDFORMATION STACK ====="
   aws cloudformation create-stack \
       --region $REGION \
       --stack-name $STACK_NAME \
       --template-url $TEMPLATE_URL \
       --parameters file:///tmp/cfn-params.json \
       --capabilities CAPABILITY_NAMED_IAM
   ```

1. 스택 생성 상태를 모니터링합니다.

   ```
   aws cloudformation describe-stacks \
       --stack-name $STACK_NAME \
       --region $REGION \
       --query 'Stacks[0].StackStatus'
   ```

1. 스택이 성공적으로 생성되면 추론 연산자 설치에 사용할 출력 값을 검색합니다.

   ```
   aws cloudformation describe-stacks \
       --stack-name $STACK_NAME \
       --region $REGION \
       --query 'Stacks[0].Outputs'
   ```

 CloudFormation 스택이 생성된 후를 계속 진행[EKS 추가 기능을 사용하여 추론 연산자 설치](#sagemaker-hyperpod-model-deployment-setup-install-inference-operator-addon)하여 추론 연산자를 설치합니다.

## 방법 3: 차트 Helm 설치
<a name="sagemaker-hyperpod-model-deployment-setup-helm"></a>

**참고**  
가장 간단한 설치 환경을 위해 [방법 1: SageMaker AI 콘솔을 통해 HyperPod 추론 추가 기능 설치(권장)](#sagemaker-hyperpod-model-deployment-setup-ui) 또는를 사용하는 것이 좋습니다[방법 2: AWS CLI를 사용하여 추론 연산자 설치](#sagemaker-hyperpod-model-deployment-setup-addon). 차트 Helm 설치는 향후 릴리스에서 더 이상 사용되지 않을 수 있습니다.

### 사전 조건
<a name="sagemaker-hyperpod-model-deployment-setup-prereq"></a>

계속하기 전에 자격 AWS 증명이 올바르게 구성되어 있고 필요한 권한이 있는지 확인합니다. 다음 단계는 관리자 권한과 클러스터 관리자가 Amazon EKS 클러스터에 액세스할 수 있는 IAM 보안 주체가 실행해야 합니다. [Amazon EKS 오케스트레이션을 사용하여 SageMaker HyperPod 클러스터 생성](sagemaker-hyperpod-eks-operate-console-ui-create-cluster.md) 방법으로 HyperPod 클러스터를 생성했는지 확인합니다. helm, eksctl 및 kubectl 명령줄 유틸리티를 설치했는지 확인합니다.

Amazon EKS 클러스터에 대한 Kubernetes 관리 액세스의 경우 Amazon EKS 콘솔로 이동하여 사용 중인 클러스터를 선택합니다. **액세스** 탭에서 IAM 액세스 항목을 선택합니다. IAM 위탁자에 대한 항목이 없는 경우 **액세스 항목 생성**을 선택합니다. 그런 다음 원하는 IAM 위탁자를 선택하고 `AmazonEKSClusterAdminPolicy`를 해당 위탁자와 연결합니다.

1. Amazon EKS 클러스터에 의해 오케스트레이션되어 새로 생성된 HyperPod 클러스터에 연결하도록 kubectl을 구성합니다. 리전 및 HyperPod 클러스터 이름을 지정합니다.

   ```
   export HYPERPOD_CLUSTER_NAME=<hyperpod-cluster-name>
   export REGION=<region>
   
   # S3 bucket where tls certificates will be uploaded
   BUCKET_NAME="<Enter name of your s3 bucket>" # This should be bucket name, not URI
   
   export EKS_CLUSTER_NAME=$(aws --region $REGION sagemaker describe-cluster --cluster-name $HYPERPOD_CLUSTER_NAME \
   --query 'Orchestrator.Eks.ClusterArn' --output text | \
   cut -d'/' -f2)
   aws eks update-kubeconfig --name $EKS_CLUSTER_NAME --region $REGION
   ```

1. 기본 환경 변수를 설정합니다.

   ```
   LB_CONTROLLER_POLICY_NAME="AWSLoadBalancerControllerIAMPolicy-$HYPERPOD_CLUSTER_NAME"
   LB_CONTROLLER_ROLE_NAME="aws-load-balancer-controller-$HYPERPOD_CLUSTER_NAME"
   S3_MOUNT_ACCESS_POLICY_NAME="S3MountpointAccessPolicy-$HYPERPOD_CLUSTER_NAME"
   S3_CSI_ROLE_NAME="SM_HP_S3_CSI_ROLE-$HYPERPOD_CLUSTER_NAME"
   KEDA_OPERATOR_POLICY_NAME="KedaOperatorPolicy-$HYPERPOD_CLUSTER_NAME"
   KEDA_OPERATOR_ROLE_NAME="keda-operator-role-$HYPERPOD_CLUSTER_NAME"
   HYPERPOD_INFERENCE_ROLE_NAME="HyperpodInferenceRole-$HYPERPOD_CLUSTER_NAME"
   HYPERPOD_INFERENCE_SA_NAME="hyperpod-inference-operator-controller"
   HYPERPOD_INFERENCE_SA_NAMESPACE="hyperpod-inference-system"
   JUMPSTART_GATED_ROLE_NAME="JumpstartGatedRole-$HYPERPOD_CLUSTER_NAME"
   FSX_CSI_ROLE_NAME="AmazonEKSFSxLustreCSIDriverFullAccess-$HYPERPOD_CLUSTER_NAME"
   ```

1. 클러스터 ARN에서 Amazon EKS 클러스터 이름을 추출하고, 로컬 kubeconfig를 업데이트하고, 네임스페이스 전반의 모든 포드를 나열하여 연결을 확인합니다.

   ```
   kubectl get pods --all-namespaces
   ```

1. (선택 사항) NVIDIA 디바이스 플러그인을 설치하여 클러스터에서 GPU 지원을 활성화합니다.

   ```
   #Install nvidia device plugin
   kubectl create -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.14.5/nvidia-device-plugin.yml
   # Verify that GPUs are visible to k8s
   kubectl get nodes -o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia.com/gpu
   ```

### 추론 운영자 설치를 위한 환경 준비
<a name="sagemaker-hyperpod-model-deployment-setup-prepare"></a>

1. Amazon EKS, SageMaker AI 및 IAM 구성 요소 간의 서비스 통합을 구성하는 데 필요한 필수 AWS 리소스 식별자 및 ARNs을 수집합니다.

   ```
   %%bash -x
   
   export ACCOUNT_ID=$(aws --region $REGION sts get-caller-identity --query 'Account' --output text)
   export OIDC_ID=$(aws --region $REGION eks describe-cluster --name $EKS_CLUSTER_NAME --query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
   export EKS_CLUSTER_ROLE=$(aws eks --region $REGION describe-cluster --name $EKS_CLUSTER_NAME --query 'cluster.roleArn' --output text)
   ```

1. IAM OIDCidentity 제공업체를 EKS 클러스터와 연결합니다.

   ```
   eksctl utils associate-iam-oidc-provider --region=$REGION --cluster=$EKS_CLUSTER_NAME --approve
   ```

1. HyperPod 추론 연산자 IAM 역할에 필요한 신뢰 정책을 생성합니다. 이 정책은 Amazon EKS, SageMaker AI 및 기타 AWS 서비스 간의 안전한 서비스 간 통신을 가능하게 합니다.

   ```
   %%bash -x
   
   # Create trust policy JSON
   cat << EOF > trust-policy.json
   {
   "Version": "2012-10-17",		 	 	 
   "Statement": [
   {
       "Effect": "Allow",
       "Principal": {
           "Service": [
               "sagemaker.amazonaws.com"
           ]
       },
       "Action": "sts:AssumeRole"
   },
   {
       "Effect": "Allow",
       "Principal": {
           "Federated": "arn:aws:iam::${ACCOUNT_ID}:oidc-provider/oidc.eks.${REGION}.amazonaws.com/id/${OIDC_ID}"
       },
       "Action": "sts:AssumeRoleWithWebIdentity",
       "Condition": {
           "StringLike": {
               "oidc.eks.${REGION}.amazonaws.com/id/${OIDC_ID}:aud": "sts.amazonaws.com",
               "oidc.eks.${REGION}.amazonaws.com/id/${OIDC_ID}:sub": "system:serviceaccount:hyperpod-inference-system:hyperpod-inference-controller-manager"
           }
       }
   }
   ]
   }
   EOF
   ```

1. 추론 연산자에 대한 실행 역할을 생성하고 관리형 정책을 연결합니다.

   ```
   aws iam create-role --role-name $HYPERPOD_INFERENCE_ROLE_NAME --assume-role-policy-document file://trust-policy.json
   aws iam attach-role-policy --role-name $HYPERPOD_INFERENCE_ROLE_NAME --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerHyperPodInferenceAccess
   ```

1.  AWS Load Balancer 컨트롤러가 EKS 클러스터에서 Application Load Balancer 및 Network Load Balancer를 관리하는 데 필요한 IAM 정책을 다운로드하고 생성합니다.

   ```
   %%bash -x 
   
   export ALBController_IAM_POLICY_NAME=HyperPodInferenceALBControllerIAMPolicy
   
   curl -o AWSLoadBalancerControllerIAMPolicy.json https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.13.0/docs/install/iam_policy.json
   aws iam create-policy --policy-name $ALBController_IAM_POLICY_NAME --policy-document file://AWSLoadBalancerControllerIAMPolicy.json
   ```

1. Kubernetes 서비스 계정을 IAM 정책과 연결하는 IAM 서비스 계정을 생성하여 AWS Load Balancer 컨트롤러가 IRSA(서비스 계정에 대한 IAM 역할)를 통해 필요한 AWS 권한을 수임할 수 있도록 합니다.

   ```
   %%bash -x 
   
   export ALB_POLICY_ARN="arn:aws:iam::$ACCOUNT_ID:policy/$ALBController_IAM_POLICY_NAME"
   
   # Create IAM service account with gathered values
   eksctl create iamserviceaccount \
   --approve \
   --override-existing-serviceaccounts \
   --name=aws-load-balancer-controller \
   --namespace=kube-system \
   --cluster=$EKS_CLUSTER_NAME \
   --attach-policy-arn=$ALB_POLICY_ARN \
   --region=$REGION
   
   # Print the values for verification
   echo "Cluster Name: $EKS_CLUSTER_NAME"
   echo "Region: $REGION"
   echo "Policy ARN: $ALB_POLICY_ARN"
   ```

1. Amazon EKS 클러스터(퍼블릭 및 프라이빗 모두`kubernetes.io.role/elb`)의 모든 서브넷에 태그()를 적용합니다.

   ```
   export VPC_ID=$(aws --region $REGION eks describe-cluster --name $EKS_CLUSTER_NAME --query 'cluster.resourcesVpcConfig.vpcId' --output text)
   
   # Add Tags
   aws ec2 describe-subnets \
   --filters "Name=vpc-id,Values=${VPC_ID}" "Name=map-public-ip-on-launch,Values=true" \
   --query 'Subnets[*].SubnetId' --output text | \
   tr '\t' '\n' | \
   xargs -I{} aws ec2 create-tags --resources {} --tags Key=kubernetes.io/role/elb,Value=1
   
   # Verify Tags are added
   aws ec2 describe-subnets \
   --filters "Name=vpc-id,Values=${VPC_ID}" "Name=map-public-ip-on-launch,Values=true" \
   --query 'Subnets[*].SubnetId' --output text | \
   tr '\t' '\n' |
   xargs -n1 -I{} aws ec2 describe-tags --filters "Name=resource-id,Values={}" "Name=key,Values=kubernetes.io/role/elb" --query "Tags[0].Value" --output text
   ```

1. KEDA 및 Cert Manager용 네임스페이스를 생성합니다.

   ```
   kubectl create namespace keda
   kubectl create namespace cert-manager
   ```

1. Amazon S3 VPC 엔드포인트 생성

   ```
   aws ec2 create-vpc-endpoint \
   --vpc-id ${VPC_ID} \
   --vpc-endpoint-type Gateway \
   --service-name "com.amazonaws.${REGION}.s3" \
   --route-table-ids $(aws ec2 describe-route-tables --filters "Name=vpc-id,Values=${VPC_ID}" --query 'RouteTables[].Associations[].RouteTableId' --output text | tr ' ' '\n' | sort -u | tr '\n' ' ')
   ```

1. S3 스토리지 액세스를 구성합니다.

   1. 클러스터 내에서 파일 시스템이 S3 버킷에 액세스할 수 있도록 Mountpoint for Amazon S3를 사용하는 데 필요한 S3 권한을 부여하는 IAM 정책을 생성합니다.

      ```
      %%bash -x
      
      export S3_CSI_BUCKET_NAME=“<bucketname_for_mounting_through_filesystem>”
      
      cat <<EOF> s3accesspolicy.json
      {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
          
          {
              "Sid": "MountpointAccess",
              "Effect": "Allow",
              "Action": [
                  "s3:ListBucket",
                  "s3:GetObject",
                  "s3:PutObject",
                  "s3:AbortMultipartUpload",
                  "s3:DeleteObject"
              ],
              "Resource": [
                      "arn:aws:s3:::${S3_CSI_BUCKET_NAME}",
                      "arn:aws:s3:::${S3_CSI_BUCKET_NAME}/*"
              ]
          }
      ]
      }
      EOF
      
      aws iam create-policy \
      --policy-name S3MountpointAccessPolicy \
      --policy-document file://s3accesspolicy.json
      
      cat <<EOF> s3accesstrustpolicy.json
      {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Principal": {
                  "Federated": "arn:aws:iam::$ACCOUNT_ID:oidc-provider/oidc.eks.$REGION.amazonaws.com/id/${OIDC_ID}"
              },
              "Action": "sts:AssumeRoleWithWebIdentity",
              "Condition": {
                  "StringEquals": {
                      "oidc.eks.$REGION.amazonaws.com/id/${OIDC_ID}:aud": "sts.amazonaws.com",
                      "oidc.eks.$REGION.amazonaws.com/id/${OIDC_ID}:sub": "system:serviceaccount:kube-system:${s3-csi-driver-sa}"
                  }
              }
          }
      ]
      }
      EOF
      
      aws iam create-role --role-name $S3_CSI_ROLE_NAME --assume-role-policy-document file://s3accesstrustpolicy.json
      
      aws iam attach-role-policy --role-name $S3_CSI_ROLE_NAME --policy-arn "arn:aws:iam::$ACCOUNT_ID:policy/S3MountpointAccessPolicy"
      ```

   1. (선택 사항) Amazon S3 CSI 드라이버에 대한 IAM 서비스 계정을 생성합니다. Amazon S3 CSI 드라이버에는 S3 버킷을 Amazon EKS 클러스터에 영구 볼륨으로 탑재할 수 있는 적절한 권한이 있는 IAM 서비스 계정이 필요합니다. 이 단계에서는 필수 S3 액세스 정책을 사용하여 필요한 IAM 역할과 Kubernetes 서비스 계정을 생성합니다.

      ```
      %%bash -x 
      
      export S3_CSI_ROLE_NAME="SM_HP_S3_CSI_ROLE-$REGION"
      export S3_CSI_POLICY_ARN=$(aws iam list-policies --query 'Policies[?PolicyName==`S3MountpointAccessPolicy`]' | jq '.[0].Arn' |  tr -d '"')
      
      eksctl create iamserviceaccount \
      --name s3-csi-driver-sa \
      --namespace kube-system \
      --cluster $EKS_CLUSTER_NAME \
      --attach-policy-arn $S3_CSI_POLICY_ARN \
      --approve \
      --role-name $S3_CSI_ROLE_NAME \
      --region $REGION 
      
      kubectl label serviceaccount s3-csi-driver-sa app.kubernetes.io/component=csi-driver app.kubernetes.io/instance=aws-mountpoint-s3-csi-driver app.kubernetes.io/managed-by=EKS app.kubernetes.io/name=aws-mountpoint-s3-csi-driver -n kube-system --overwrite
      ```

   1. (선택 사항) Amazon S3 CSI 드라이버 추가 기능을 설치합니다. 이 드라이버를 사용하면 포드가 S3 버킷을 영구 볼륨으로 탑재하여 Kubernetes 워크로드 내에서 S3 스토리지에 직접 액세스할 수 있도록 합니다.

      ```
      %%bash -x
      
      export S3_CSI_ROLE_ARN=$(aws iam get-role --role-name $S3_CSI_ROLE_NAME  --query 'Role.Arn' --output text)
      eksctl create addon --name aws-mountpoint-s3-csi-driver --cluster $EKS_CLUSTER_NAME --service-account-role-arn $S3_CSI_ROLE_ARN --force
      ```

   1. (선택 사항) S3 스토리지에 대한 영구 볼륨 클레임(PVC)을 생성합니다. 이 PVC를 사용하면 포드가 기존 파일 시스템인 것처럼 S3 스토리지를 요청하고 사용할 수 있습니다.

      ```
      %%bash -x 
      
      cat <<EOF> pvc_s3.yaml
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
      name: s3-claim
      spec:
      accessModes:
      - ReadWriteMany # supported options: ReadWriteMany / ReadOnlyMany
      storageClassName: "" # required for static provisioning
      resources:
      requests:
          storage: 1200Gi # ignored, required
      volumeName: s3-pv
      EOF
      
      kubectl apply -f pvc_s3.yaml
      ```

1. (선택 사항) FSx 스토리지 액세스를 구성합니다. Amazon FSx CSI 드라이버에 대한 IAM 서비스 계정을 생성합니다. 이 서비스 계정은 FSx CSI 드라이버가 클러스터를 대신하여 Amazon FSx 서비스와 상호 작용하는 데 사용됩니다.

   ```
   %%bash -x 
   
   
   eksctl create iamserviceaccount \
   --name fsx-csi-controller-sa \
   --namespace kube-system \
   --cluster $EKS_CLUSTER_NAME \
   --attach-policy-arn arn:aws:iam::aws:policy/AmazonFSxFullAccess \
   --approve \
   --role-name FSXLCSI-${EKS_CLUSTER_NAME}-${REGION} \
   --region $REGION
   ```

### KEDA 운영자 역할 생성
<a name="sagemaker-hyperpod-model-deployment-setup-keda"></a>

1. 신뢰 정책 및 권한 정책을 생성합니다.

   ```
   # Create trust policy
   cat <<EOF > /tmp/keda-trust-policy.json
   {
   "Version": "2012-10-17",		 	 	 
   "Statement": [
       {
           "Effect": "Allow",
           "Principal": {
               "Federated": "arn:aws:iam::$ACCOUNT_ID:oidc-provider/oidc.eks.$REGION.amazonaws.com/id/$OIDC_ID"
           },
           "Action": "sts:AssumeRoleWithWebIdentity",
           "Condition": {
               "StringLike": {
                   "oidc.eks.$REGION.amazonaws.com/id/$OIDC_ID:sub": "system:serviceaccount:kube-system:keda-operator",
                   "oidc.eks.$REGION.amazonaws.com/id/$OIDC_ID:aud": "sts.amazonaws.com"
               }
           }
       }
   ]
   }
   EOF
   # Create permissions policy
   cat <<EOF > /tmp/keda-policy.json
   {
   "Version": "2012-10-17",		 	 	 
   "Statement": [
       {
           "Effect": "Allow",
           "Action": [
               "cloudwatch:GetMetricData",
               "cloudwatch:GetMetricStatistics",
               "cloudwatch:ListMetrics"
           ],
           "Resource": "*"
       },
       {
           "Effect": "Allow",
           "Action": [
               "aps:QueryMetrics",
               "aps:GetLabels",
               "aps:GetSeries",
               "aps:GetMetricMetadata"
           ],
           "Resource": "*"
       }
   ]
   }
   EOF
   # Create the role
   aws iam create-role \
   --role-name keda-operator-role \
   --assume-role-policy-document file:///tmp/keda-trust-policy.json
   # Create the policy
   KEDA_POLICY_ARN=$(aws iam create-policy \
   --policy-name KedaOperatorPolicy \
   --policy-document file:///tmp/keda-policy.json \
   --query 'Policy.Arn' \
   --output text)
   # Attach the policy to the role
   aws iam attach-role-policy \
   --role-name keda-operator-role \
   --policy-arn $KEDA_POLICY_ARN
   ```

1. 게이트 모델을 사용하는 경우 IAM 역할을 생성하여 게이트 모델에 액세스합니다.

   1. 게이트된 모델 액세스를 위한 신뢰 정책 및 IAM 역할을 생성합니다.

      ```
      %%bash -s $REGION
      
      JUMPSTART_GATED_ROLE_NAME="JumpstartGatedRole-${REGION}-${HYPERPOD_CLUSTER_NAME}"
      
      cat <<EOF > /tmp/trust-policy.json
      {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Principal": {
                  "Federated": "arn:aws:iam::$ACCOUNT_ID:oidc-provider/oidc.eks.$REGION.amazonaws.com/id/$OIDC_ID"
              },
              "Action": "sts:AssumeRoleWithWebIdentity",
              "Condition": {
                  "StringLike": {
                      "oidc.eks.$REGION.amazonaws.com/id/$OIDC_ID:sub": "system:serviceaccount:*:hyperpod-inference-service-account*",
                      "oidc.eks.$REGION.amazonaws.com/id/$OIDC_ID:aud": "sts.amazonaws.com"
                  }
              }
          },
              {
              "Effect": "Allow",
              "Principal": {
                  "Service": "sagemaker.amazonaws.com"
              },
              "Action": "sts:AssumeRole"
          }
      ]
      }
      EOF
      
      # Create the role and attach the managed policy
      aws iam create-role \
      --role-name $JUMPSTART_GATED_ROLE_NAME \
      --assume-role-policy-document file:///tmp/trust-policy.json
      
      aws iam attach-role-policy \
      --role-name $JUMPSTART_GATED_ROLE_NAME \
      --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerHyperPodGatedModelAccess
      ```

      ```
      JUMPSTART_GATED_ROLE_ARN_LIST= !aws iam get-role --role-name=$JUMPSTART_GATED_ROLE_NAME --query "Role.Arn" --output text
      JUMPSTART_GATED_ROLE_ARN = JUMPSTART_GATED_ROLE_ARN_LIST[0]
      !echo $JUMPSTART_GATED_ROLE_ARN
      ```

### 추론 운영자 설치
<a name="sagemaker-hyperpod-model-deployment-setup-install"></a>

1. HyperPod 추론 운영자를 설치합니다. 이 단계에서는 필요한 AWS 리소스 식별자를 수집하고 적절한 구성 파라미터를 사용하여 헬름 설치 명령을 생성합니다.

   [https://github.com/aws/sagemaker-hyperpod-cli/tree/main/helm\_chart](https://github.com/aws/sagemaker-hyperpod-cli/tree/main/helm_chart)에서 헬름 차트에 액세스합니다.

   ```
   git clone https://github.com/aws/sagemaker-hyperpod-cli
   cd sagemaker-hyperpod-cli
   cd helm_chart/HyperPodHelmChart
   helm dependencies update charts/inference-operator
   ```

   ```
   %%bash -x
   
   HYPERPOD_INFERENCE_ROLE_ARN=$(aws iam get-role --role-name=$HYPERPOD_INFERENCE_ROLE_NAME --query "Role.Arn" --output text)
   echo $HYPERPOD_INFERENCE_ROLE_ARN
   
   S3_CSI_ROLE_ARN=$(aws iam get-role --role-name=$S3_CSI_ROLE_NAME --query "Role.Arn" --output text)
   echo $S3_CSI_ROLE_ARN
   
   HYPERPOD_CLUSTER_ARN=$(aws sagemaker describe-cluster --cluster-name $HYPERPOD_CLUSTER_NAME --query "ClusterArn")
   
   # Verify values
   echo "Cluster Name: $EKS_CLUSTER_NAME"
   echo "Execution Role: $HYPERPOD_INFERENCE_ROLE_ARN"
   echo "Hyperpod ARN: $HYPERPOD_CLUSTER_ARN"
   # Run the the HyperPod inference operator installation. 
   
   helm install hyperpod-inference-operator charts/inference-operator \
   -n kube-system \
   --set region=$REGION \
   --set eksClusterName=$EKS_CLUSTER_NAME \
   --set hyperpodClusterArn=$HYPERPOD_CLUSTER_ARN \
   --set executionRoleArn=$HYPERPOD_INFERENCE_ROLE_ARN \
   --set s3.serviceAccountRoleArn=$S3_CSI_ROLE_ARN \
   --set s3.node.serviceAccount.create=false \
   --set keda.podIdentity.aws.irsa.roleArn="arn:aws:iam::$ACCOUNT_ID:role/keda-operator-role" \
   --set tlsCertificateS3Bucket="s3://$BUCKET_NAME" \
   --set alb.region=$REGION \
   --set alb.clusterName=$EKS_CLUSTER_NAME \
   --set alb.vpcId=$VPC_ID
   
   # For JumpStart Gated Model usage, Add
   # --set jumpstartGatedModelDownloadRoleArn=$UMPSTART_GATED_ROLE_ARN
   ```

1. IAM 통합을 위한 서비스 계정 주석을 구성합니다. 이 주석을 사용하면 운영자의 서비스 계정이 추론 엔드포인트를 관리하고 AWS 서비스와 상호 작용하는 데 필요한 IAM 권한을 수임할 수 있습니다.

   ```
   %%bash -x 
   
   EKS_CLUSTER_ROLE_NAME=$(echo $EKS_CLUSTER_ROLE | sed 's/.*\///')
   
   # Annotate service account
   kubectl annotate serviceaccount hyperpod-inference-operator-controller-manager \
   -n hyperpod-inference-system \
   eks.amazonaws.com/role-arn=arn:aws:iam::${ACCOUNT_ID}:role/${EKS_CLUSTER_ROLE_NAME} \
   --overwrite
   ```

## 추론 운영자가 작동하는지 확인
<a name="sagemaker-hyperpod-model-deployment-setup-verify"></a>

다음 단계에 따라 간단한 모델을 배포하고 테스트하여 추론 운영자 설치가 올바르게 작동하는지 확인합니다.

**테스트 모델을 배포하여 연산자 확인**

1. 모델 배포 구성 파일을 만듭니다. 그러면 HyperPod 추론 운영자에 대한 JumpStart 모델 배포를 정의하는 Kubernetes 매니페스트 파일이 생성됩니다.

   ```
   cat <<EOF>> simple_model_install.yaml
   ---
   apiVersion: inference.sagemaker.aws.amazon.com/v1
   kind: JumpStartModel
   metadata:
   name: testing-deployment-bert
   namespace: default
   spec:
   model:
   modelId: "huggingface-eqa-bert-base-cased"
   sageMakerEndpoint:
   name: "hp-inf-ep-for-testing"
   server:
   instanceType: "ml.c5.2xlarge"
   environmentVariables:
   - name: SAMPLE_ENV_VAR
       value: "sample_value"
   maxDeployTimeInSeconds: 1800
   EOF
   ```

1. 모델을 배포하고 구성 파일을 정리합니다.

   ```
   kubectl create -f simple_model_install.yaml
   rm -f simple_model_install.yaml
   ```

1. 서비스 계정 구성을 확인하여 운영자가 AWS 권한을 수임할 수 있는지 확인합니다.

   ```
   # Get the service account details
   kubectl get serviceaccount -n hyperpod-inference-system
   
   # Check if the service account has the AWS annotations
   kubectl describe serviceaccount hyperpod-inference-operator-controller-manager -n hyperpod-inference-system
   ```

**배포 설정 구성(Studio UI를 사용하는 경우)**

1. **배포 설정**에서 권장 인스턴스 유형을 검토합니다.

1. **인스턴스 유형을** 수정하는 경우 HyperPod 클러스터와 호환되는지 확인합니다. 호환되는 인스턴스를 사용할 수 없는 경우 관리자에게 문의하세요.

1. MIG가 활성화된 GPU 분할 인스턴스의 경우 사용 가능한 MIG 프로파일에서 적절한 **GPU 파티션**을 선택하여 GPU 사용률을 최적화합니다. 자세한 내용은 [Amazon SageMaker HyperPod에서 GPU 파티션 사용](sagemaker-hyperpod-eks-gpu-partitioning.md) 단원을 참조하십시오.

1. 작업 거버넌스를 사용하는 경우 모델 배포 선점 기능에 대한 우선 순위 설정을 구성합니다.

1. 관리자가 제공한 네임스페이스를 입력합니다. 필요한 경우 관리자에게 문의하여 올바른 네임스페이스를 확인합니다.

## (선택 사항) SageMaker AI Studio Classic에서 JumpStart UI를 통한 사용자 액세스 설정
<a name="sagemaker-hyperpod-model-deployment-setup-optional-js"></a>

Studio Classic 사용자에 대한 SageMaker HyperPod 액세스를 설정하고 데이터 과학자 사용자에 대한 세분화된 Kubernetes RBAC 권한을 구성하는 방법에 대한 자세한 내용은 [Studio에서 Amazon EKS 클러스터 설정](sagemaker-hyperpod-studio-setup-eks.md) 및 [Kubernetes 역할 기반 액세스 제어 설정](sagemaker-hyperpod-eks-setup-rbac.md) 섹션을 참조하세요.

1. 데이터 과학자 사용자가 SageMaker AI Studio Classic에서 모델을 관리하고 SageMaker HyperPod에 배포하는 데 사용할 IAM 역할을 식별합니다. 일반적으로 Studio Classic 사용자의 사용자 프로필 실행 역할 또는 도메인 실행 역할입니다.

   ```
   %%bash -x
   
   export DATASCIENTIST_ROLE_NAME="<Execution Role Name used in SageMaker Studio Classic>"
   
   export DATASCIENTIST_POLICY_NAME="HyperPodUIAccessPolicy"
   export EKS_CLUSTER_ARN=$(aws --region $REGION sagemaker describe-cluster --cluster-name $HYPERPOD_CLUSTER_NAME \
     --query 'Orchestrator.Eks.ClusterArn' --output text)
   
   export DATASCIENTIST_HYPERPOD_NAMESPACE="team-namespace"
   ```

1. 모델 배포 액세스를 활성화하는 ID 정책을 연결합니다.

   ```
   %%bash -x
   
   # Create access policy
   cat << EOF > hyperpod-deployment-ui-access-policy.json
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "DescribeHyerpodClusterPermissions",
               "Effect": "Allow",
               "Action": [
                   "sagemaker:DescribeCluster"
               ],
               "Resource": "$HYPERPOD_CLUSTER_ARN"
           },
           {
               "Sid": "UseEksClusterPermissions",
               "Effect": "Allow",
               "Action": [
                   "eks:DescribeCluster",
                   "eks:AccessKubernetesApi",
                   "eks:MutateViaKubernetesApi",
                   "eks:DescribeAddon"
               ],
               "Resource": "$EKS_CLUSTER_ARN"
           },
           {
               "Sid": "ListPermission",
               "Effect": "Allow",
               "Action": [
                   "sagemaker:ListClusters",
                   "sagemaker:ListEndpoints"
               ],
               "Resource": "*"
           },
           {
               "Sid": "SageMakerEndpointAccess",
               "Effect": "Allow",
               "Action": [
                   "sagemaker:DescribeEndpoint",
                   "sagemaker:InvokeEndpoint"
               ],
               "Resource": "arn:aws:sagemaker:$REGION:$ACCOUNT_ID:endpoint/*"
           }
       ]
   }
   EOF
   
   aws iam put-role-policy --role-name DATASCIENTIST_ROLE_NAME --policy-name HyperPodDeploymentUIAccessInlinePolicy --policy-document file://hyperpod-deployment-ui-access-policy.json
   ```

1. kubernetes 그룹에 매핑하는 사용자를 위해 EKS 액세스 항목을 생성합니다.

   ```
   %%bash -x
   
   aws eks create-access-entry --cluster-name $EKS_CLUSTER_NAME \
       --principal-arn "arn:aws:iam::$ACCOUNT_ID:role/$DATASCIENTIST_ROLE_NAME" \
       --kubernetes-groups '["hyperpod-scientist-user-namespace-level","hyperpod-scientist-user-cluster-level"]'
   ```

1. 사용자를 위한 Kubernetes RBAC 정책을 생성합니다.

   ```
   %%bash -x
   
   cat << EOF > cluster_level_config.yaml
   kind: ClusterRole
   apiVersion: rbac.authorization.k8s.io/v1
   metadata:
     name: hyperpod-scientist-user-cluster-role
   rules:
   - apiGroups: [""]
     resources: ["pods"]
     verbs: ["list"]
   - apiGroups: [""]
     resources: ["nodes"]
     verbs: ["list"]
   - apiGroups: [""]
     resources: ["namespaces"]
     verbs: ["list"]
   ---
   apiVersion: rbac.authorization.k8s.io/v1
   kind: ClusterRoleBinding
   metadata:
     name: hyperpod-scientist-user-cluster-role-binding
   subjects:
   - kind: Group
     name: hyperpod-scientist-user-cluster-level
     apiGroup: rbac.authorization.k8s.io
   roleRef:
     kind: ClusterRole
     name: hyperpod-scientist-user-cluster-role
     apiGroup: rbac.authorization.k8s.io
   EOF
   
   
   kubectl apply -f cluster_level_config.yaml
   
   
   cat << EOF > namespace_level_role.yaml
   kind: Role
   apiVersion: rbac.authorization.k8s.io/v1
   metadata:
     namespace: $DATASCIENTIST_HYPERPOD_NAMESPACE
     name: hyperpod-scientist-user-namespace-level-role
   rules:
   - apiGroups: [""]
     resources: ["pods"]
     verbs: ["create", "get"]
   - apiGroups: [""]
     resources: ["nodes"]
     verbs: ["get", "list"]
   - apiGroups: [""]
     resources: ["pods/log"]
     verbs: ["get", "list"]
   - apiGroups: [""]
     resources: ["pods/exec"]
     verbs: ["get", "create"]
   - apiGroups: ["kubeflow.org"]
     resources: ["pytorchjobs", "pytorchjobs/status"]
     verbs: ["get", "list", "create", "delete", "update", "describe"]
   - apiGroups: [""]
     resources: ["configmaps"]
     verbs: ["create", "update", "get", "list", "delete"]
   - apiGroups: [""]
     resources: ["secrets"]
     verbs: ["create", "get", "list", "delete"]
   - apiGroups: [ "inference.sagemaker.aws.amazon.com" ]
     resources: [ "inferenceendpointconfig", "inferenceendpoint", "jumpstartmodel" ]
     verbs: [ "get", "list", "create", "delete", "update", "describe" ]
   - apiGroups: [ "autoscaling" ]
     resources: [ "horizontalpodautoscalers" ]
     verbs: [ "get", "list", "watch", "create", "update", "patch", "delete" ]
   ---
   apiVersion: rbac.authorization.k8s.io/v1
   kind: RoleBinding
   metadata:
     namespace: $DATASCIENTIST_HYPERPOD_NAMESPACE
     name: hyperpod-scientist-user-namespace-level-role-binding
   subjects:
   - kind: Group
     name: hyperpod-scientist-user-namespace-level
     apiGroup: rbac.authorization.k8s.io
   roleRef:
     kind: Role
     name: hyperpod-scientist-user-namespace-level-role
     apiGroup: rbac.authorization.k8s.io
   EOF
   
   
   kubectl apply -f namespace_level_role.yaml
   ```