

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Observabilité du modèle pour les tâches de formation sur des SageMaker HyperPod clusters orchestrés par Amazon EKS
<a name="sagemaker-hyperpod-eks-cluster-observability-model"></a>

SageMaker HyperPod les clusters orchestrés avec Amazon EKS peuvent s'intégrer à l'[application MLflow sur Amazon SageMaker Studio](https://docs.aws.amazon.com/sagemaker/latest/dg/mlflow.html). Les administrateurs de clusters configurent le serveur MLflow et le connectent aux SageMaker HyperPod clusters. Les scientifiques des données peuvent mieux comprendre le modèle.

**Pour configurer un serveur MLflow à l'aide AWS de la CLI**

Un administrateur de cluster doit créer un serveur de suivi MLflow.

1. Créez un serveur de suivi SageMaker AI MLflow, en suivant les instructions de la section [Créer un serveur de suivi à l'aide de la AWS CLI](https://docs.aws.amazon.com/sagemaker/latest/dg/mlflow-create-tracking-server-cli.html#mlflow-create-tracking-server-cli-infra-setup).

1. Assurez-vous que l'[https://docs.aws.amazon.com/eks/latest/APIReference/API_auth_AssumeRoleForPodIdentity.html](https://docs.aws.amazon.com/eks/latest/APIReference/API_auth_AssumeRoleForPodIdentity.html)autorisation existe dans le rôle d'exécution IAM pour SageMaker HyperPod.

1. Si le module complémentaire `eks-pod-identity-agent` n’est pas déjà installé sur votre cluster EKS, installez-le sur le cluster EKS.

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

1. Créez un fichier `trust-relationship.json` pour un nouveau rôle pour pod afin d’appeler les API MLflow.

   ```
   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
   ```

   Exécutez le code suivant pour créer le rôle et attacher la relation d’approbation.

   ```
   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. Créez la politique suivante qui accorde au pod l’accès pour appeler toutes les opérations `sagemaker-mlflow` et pour placer les artefacts du modèle dans S3. L’autorisation S3 existe déjà sur le serveur de suivi, mais si les artefacts du modèle sont trop volumineux, un appel direct à s3 est effectué à partir du code MLflow pour charger les artefacts.

   ```
   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
   ```
**Note**  
Les ARN sont ceux du serveur MLflow et du compartiment S3, configurés avec le serveur MLflow pendant la création du serveur en suivant les instructions fournies dans [Configuration de l’infrastructure MLflow](https://docs.aws.amazon.com/sagemaker/latest/dg/mlflow-create-tracking-server-cli.html#mlflow-create-tracking-server-cli-infra-setup).

1. Attachez la politique `mlflow-metrics-emit-policy` à `hyperpod-mlflow-role` en utilisant le document de politique enregistré à l’étape précédente.

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

1. Créez un compte de service Kubernetes pour que le pod accède au serveur MLflow. 

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

   Exécutez la commande suivante à appliquer au cluster EKS.

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

1. Créez une association d’identité du pod.

   ```
   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}}
   ```

**Pour collecter des métriques à partir des tâches d’entraînement sur le serveur MLflow**

Les scientifiques des données doivent configurer le script d’entraînement et l’image Docker pour transmettre des métriques au serveur MLflow.

1. Ajoutez les lignes suivantes au début de votre script d’entraînement.

   ```
   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. Générez une image Docker avec le script d’entraînement et envoyez-la (push) à Amazon ECR. Obtenez l’ARN du conteneur ECR. Pour plus d’informations sur la génération et le transfert (push) d’une image Docker, consultez [Transmission d’une image Docker](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html) dans le *Guide de l’utilisateur ECR*.
**Astuce**  
Assurez-vous d’ajouter l’installation des packages mlflow et sagemaker-mlflow dans le fichier Docker. Pour en savoir plus sur l'installation des packages, les exigences et les versions compatibles des packages, voir [Installer MLflow et le plugin SageMaker AI MLflow](https://docs.aws.amazon.com/sagemaker/latest/dg/mlflow-track-experiments.html#mlflow-track-experiments-install-plugin).

1. Ajoutez un compte de service dans les pods des tâches d’entraînement pour leur donner accès à `hyperpod-mlflow-role`. Cela permet aux pods d’appeler les API MLflow. Exécutez le modèle de soumission de tâches SageMaker HyperPod CLI suivant. Créez-le avec le nom de fichier `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. Démarrez la tâche en utilisant le fichier YAML comme suit.

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

1. Générez une URL pré-signée pour le serveur de suivi MLflow. Vous pouvez ouvrir le lien dans votre navigateur et commencer à suivre votre tâche d’entraînement.

   ```
   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}}
   ```