

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

# Amazon EKS에 의해 오케스트레이션된 SageMaker HyperPod 클러스터의 훈련 작업에 대한 관찰성
<a name="sagemaker-hyperpod-eks-cluster-observability-model"></a>

Amazon EKS로 오케스트레이션된 SageMaker HyperPod 클러스터는 [Amazon SageMaker Studio의 MLflow 애플리케이션](https://docs.aws.amazon.com/sagemaker/latest/dg/mlflow.html)과 통합할 수 있습니다. 클러스터 관리자는 MLflow 서버를 설정하고 이를 SageMaker HyperPod 클러스터와 연결합니다. 데이터 과학자는 모델에 대한 인사이트를 얻을 수 있습니다.

** AWS CLI를 사용하여 MLflow 서버를 설정하려면**

클러스터 관리자는 MLflow 추적 서버를 생성해야 합니다.

1. CLI를 사용하여 추적 서버 생성의 지침에 따라 SageMaker AI MLflow 추적 서버를 생성합니다. [AWS](https://docs.aws.amazon.com/sagemaker/latest/dg/mlflow-create-tracking-server-cli.html#mlflow-create-tracking-server-cli-infra-setup) 

1. [https://docs.aws.amazon.com/eks/latest/APIReference/API_auth_AssumeRoleForPodIdentity.html](https://docs.aws.amazon.com/eks/latest/APIReference/API_auth_AssumeRoleForPodIdentity.html) 권한이 SageMaker HyperPod의 IAM 실행 역할에 있는지 확인합니다.

1. `eks-pod-identity-agent` 추가 기능이 EKS 클러스터에 아직 설치되지 않은 경우 EKS 클러스터에 추가 기능을 설치합니다.

   ```
   aws eks create-addon \
       --cluster-name <eks_cluster_name> \
       --addon-name eks-pod-identity-agent \
       --addon-version vx.y.z-eksbuild.1
   ```

1. 포드가 MLflow API를 직접적으로 호출할 새 역할에 대한 `trust-relationship.json` 파일을 생성합니다.

   ```
   cat >trust-relationship.json <<EOF
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "AllowEksAuthToAssumeRoleForPodIdentity",
               "Effect": "Allow",
               "Principal": {
                   "Service": "pods.eks.amazonaws.com"
   
               },
               "Action": [
                   "sts:AssumeRole",
                   "sts:TagSession"
               ]
           }
       ]
   }
   EOF
   ```

   다음 코드를 실행하여 역할을 생성하고 신뢰 관계를 연결합니다.

   ```
   aws iam create-role --role-name hyperpod-mlflow-role \
       --assume-role-policy-document file://trust-relationship.json \
       --description "allow pods to emit mlflow metrics and put data in s3"
   ```

1. 포드에 모든 `sagemaker-mlflow` 작업을 직접적으로 호출하고 S3에 모델 아티팩트를 넣을 수 있는 액세스 권한을 부여하는 다음 정책을 생성합니다. 추적 서버 내에 S3 권한이 이미 있지만 모델 아티팩트가 너무 큰 경우 MLflow 코드에서 s3를 직접 호출하여 아티팩트를 업로드합니다.

   ```
   cat >hyperpod-mlflow-policy.json <<EOF
   {
       "Version": "2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "sagemaker-mlflow:AccessUI",
                   "sagemaker-mlflow:CreateExperiment",
                   "sagemaker-mlflow:SearchExperiments",
                   "sagemaker-mlflow:GetExperiment",
                   "sagemaker-mlflow:GetExperimentByName",
                   "sagemaker-mlflow:DeleteExperiment",
                   "sagemaker-mlflow:RestoreExperiment",
                   "sagemaker-mlflow:UpdateExperiment",
                   "sagemaker-mlflow:CreateRun",
                   "sagemaker-mlflow:DeleteRun",
                   "sagemaker-mlflow:RestoreRun",
                   "sagemaker-mlflow:GetRun",
                   "sagemaker-mlflow:LogMetric",
                   "sagemaker-mlflow:LogBatch",
                   "sagemaker-mlflow:LogModel",
                   "sagemaker-mlflow:LogInputs",
                   "sagemaker-mlflow:SetExperimentTag",
                   "sagemaker-mlflow:SetTag",
                   "sagemaker-mlflow:DeleteTag",
                   "sagemaker-mlflow:LogParam",
                   "sagemaker-mlflow:GetMetricHistory",
                   "sagemaker-mlflow:SearchRuns",
                   "sagemaker-mlflow:ListArtifacts",
                   "sagemaker-mlflow:UpdateRun",
                   "sagemaker-mlflow:CreateRegisteredModel",
                   "sagemaker-mlflow:GetRegisteredModel",
                   "sagemaker-mlflow:RenameRegisteredModel",
                   "sagemaker-mlflow:UpdateRegisteredModel",
                   "sagemaker-mlflow:DeleteRegisteredModel",
                   "sagemaker-mlflow:GetLatestModelVersions",
                   "sagemaker-mlflow:CreateModelVersion",
                   "sagemaker-mlflow:GetModelVersion",
                   "sagemaker-mlflow:UpdateModelVersion",
                   "sagemaker-mlflow:DeleteModelVersion",
                   "sagemaker-mlflow:SearchModelVersions",
                   "sagemaker-mlflow:GetDownloadURIForModelVersionArtifacts",
                   "sagemaker-mlflow:TransitionModelVersionStage",
                   "sagemaker-mlflow:SearchRegisteredModels",
                   "sagemaker-mlflow:SetRegisteredModelTag",
                   "sagemaker-mlflow:DeleteRegisteredModelTag",
                   "sagemaker-mlflow:DeleteModelVersionTag",
                   "sagemaker-mlflow:DeleteRegisteredModelAlias",
                   "sagemaker-mlflow:SetRegisteredModelAlias",
                   "sagemaker-mlflow:GetModelVersionByAlias"
               ],
               "Resource": "arn:aws:sagemaker:us-west-2:111122223333:mlflow-tracking-server/<ml tracking server name>"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject"
               ],
               "Resource": "arn:aws:s3:::<mlflow-s3-bucket_name>"
           }
       ]
   }
   EOF
   ```
**참고**  
ARN은 [Set up MLflow infrastructure](https://docs.aws.amazon.com/sagemaker/latest/dg/mlflow-create-tracking-server-cli.html#mlflow-create-tracking-server-cli-infra-setup)의 지침에 따라 생성한 서버 중에 MLflow 서버로 설정된 S3 버킷과 MLflow 서버의 ARN입니다.

1. 이전 단계에서 저장한 정책 문서를 사용하여 `mlflow-metrics-emit-policy` 정책을 `hyperpod-mlflow-role`에 연결합니다.

   ```
   aws iam put-role-policy \
     --role-name hyperpod-mlflow-role \
     --policy-name mlflow-metrics-emit-policy \
     --policy-document file://hyperpod-mlflow-policy.json
   ```

1. 포드가 MLflow 서버에 액세스할 수 있도록 Kubernetes 서비스 계정을 생성합니다.

   ```
   cat >mlflow-service-account.yaml <<EOF
   apiVersion: v1
   kind: ServiceAccount
   metadata:
     name: mlflow-service-account
     namespace: kubeflow
   EOF
   ```

   다음 명령을 실행하여 EKS 클러스터에 적용합니다.

   ```
   kubectl apply -f mlflow-service-account.yaml
   ```

1. Pod Identity 연결을 생성합니다.

   ```
   aws eks create-pod-identity-association \
       --cluster-name EKS_CLUSTER_NAME \
       --role-arn arn:aws:iam::111122223333:role/hyperpod-mlflow-role \
       --namespace kubeflow \
       --service-account mlflow-service-account
   ```

**훈련 작업에서 MLflow 서버로 지표를 수집하는 방법**

데이터 과학자는 MLflow 서버에 지표를 내보내기 위해 훈련 스크립트와 Docker 이미지를 설정해야 합니다.

1. 훈련 스크립트의 시작 부분에 다음 줄을 추가합니다.

   ```
   import mlflow
   
   # Set the Tracking Server URI using the ARN of the Tracking Server you created
   mlflow.set_tracking_uri(os.environ['MLFLOW_TRACKING_ARN'])
   # Enable autologging in MLflow
   mlflow.autolog()
   ```

1. 훈련 스크립트를 사용하여 Docker 이미지를 구축하고 Amazon ECR로 푸시합니다. ECR 컨테이너의 ARN을 가져옵니다. Docker 이미지 구축 및 푸시에 대한 자세한 내용은 *ECR 사용 설명서*의 [Pushing a Docker image](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html)를 참조하세요.
**작은 정보**  
Docker 파일에 mlflow 및 sagemaker-mlflow 패키지의 설치를 추가해야 합니다. 패키지 설치, 요구 사항 및 호환되는 패키지 버전에 대한 자세한 내용은 [Install MLflow and the SageMaker AI MLflow plugin](https://docs.aws.amazon.com/sagemaker/latest/dg/mlflow-track-experiments.html#mlflow-track-experiments-install-plugin)을 참조하세요.

1. 훈련 작업 포드에 서비스 계정을 추가하여 `hyperpod-mlflow-role`에 대한 액세스 권한을 부여합니다. 이렇게 하면 포드가 MLflow API를 직접적으로 호출할 수 있습니다. 다음 SageMaker HyperPod CLI 작업 제출 템플릿을 실행합니다. 파일 이름 `mlflow-test.yaml`로 생성합니다.

   ```
   defaults:
    - override hydra/job_logging: stdout
   
   hydra:
    run:
     dir: .
    output_subdir: null
   
   training_cfg:
    entry_script: ./train.py
    script_args: []
    run:
     name: test-job-with-mlflow # Current run name
     nodes: 2 # Number of nodes to use for current training
     # ntasks_per_node: 1 # Number of devices to use per node
   cluster:
    cluster_type: k8s # currently k8s only
    instance_type: ml.c5.2xlarge
    cluster_config:
     # name of service account associated with the namespace
     service_account_name: mlflow-service-account
     # persistent volume, usually used to mount FSx
     persistent_volume_claims: null
     namespace: kubeflow
     # required node affinity to select nodes with SageMaker HyperPod
     # labels and passed health check if burn-in enabled
     label_selector:
         required:
             sagemaker.amazonaws.com/node-health-status:
                 - Schedulable
         preferred:
             sagemaker.amazonaws.com/deep-health-check-status:
                 - Passed
         weights:
             - 100
     pullPolicy: IfNotPresent # policy to pull container, can be Always, IfNotPresent and Never
     restartPolicy: OnFailure # restart policy
   
   base_results_dir: ./result # Location to store the results, checkpoints and logs.
   container: 111122223333.dkr.ecr.us-west-2.amazonaws.com/tag # container to use
   
   env_vars:
    NCCL_DEBUG: INFO # Logging level for NCCL. Set to "INFO" for debug information
    MLFLOW_TRACKING_ARN: arn:aws:sagemaker:us-west-2:11112223333:mlflow-tracking-server/tracking-server-name
   ```

1. 다음과 같이 YAML 파일을 사용하여 작업을 시작합니다.

   ```
   hyperpod start-job --config-file /path/to/mlflow-test.yaml
   ```

1. MLflow 추적 서버에 대해 미리 서명된 URL을 생성합니다. 브라우저에서 링크를 열고 훈련 작업 추적을 시작할 수 있습니다.

   ```
   aws sagemaker create-presigned-mlflow-tracking-server-url \                          
       --tracking-server-name "tracking-server-name" \
       --session-expiration-duration-in-seconds 1800 \
       --expires-in-seconds 300 \
       --region region
   ```