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.
Utilisation de l’opérateur d’entraînement pour exécuter des tâches
Pour utiliser kubectl pour exécuter la tâche, vous devez créer un fichier job.yaml pour spécifier les spécifications de la tâche et exécuter kubectl apply -f job.yaml pour soumettre la tâche. Dans ce fichier YAML, vous pouvez spécifier des configurations personnalisées dans l’argument logMonitoringConfiguration afin de définir des règles de surveillance automatisées qui analysent les sorties de journal à partir de la tâche d’entraînement distribuée afin de détecter les problèmes et de les rétablir.
apiVersion: sagemaker.amazonaws.com/v1 kind: HyperPodPyTorchJob metadata: labels: app.kubernetes.io/name: HyperPod app.kubernetes.io/managed-by: kustomize name: &jobname xxx annotations: XXX: XXX ...... spec: nprocPerNode: "X" replicaSpecs: - name: 'XXX' replicas: 16 template: spec: nodeSelector: beta.kubernetes.io/instance-type: ml.p5.48xlarge containers: - name: XXX image: XXX imagePullPolicy: Always ports: - containerPort: 8080 # This is the port that HyperPodElasticAgent listens to resources: limits: nvidia.com/gpu: 8 hugepages-2Mi: 5120Mi requests: nvidia.com/gpu: 8 hugepages-2Mi: 5120Mi memory: 32000Mi ...... runPolicy: jobMaxRetryCount: 50 restartPolicy: numRestartBeforeFullJobRestart: 3 evalPeriodSeconds: 21600 maxFullJobRestarts: 1 cleanPodPolicy: "All" logMonitoringConfiguration: - name: "JobStart" logPattern: ".*Experiment configuration.*" # This is the start of the training script expectedStartCutOffInSeconds: 120 # Expected match in the first 2 minutes - name: "JobHangingDetection" logPattern: ".*\\[Epoch 0 Batch \\d+.*'training_loss_step': (\\d+(\\.\\d+)?).*" expectedRecurringFrequencyInSeconds: 300 # If next batch is not printed within 5 minute, consider it hangs. Or if loss is not decimal (e.g. nan) for 2 minutes, mark it hang as well. expectedStartCutOffInSeconds: 600 # Allow 10 minutes of job startup time - name: "NoS3CheckpointingDetection" logPattern: ".*The checkpoint is finalized. All shards is written.*" expectedRecurringFrequencyInSeconds: 600 # If next checkpoint s3 upload doesn't happen within 10 mins, mark it hang. expectedStartCutOffInSeconds: 1800 # Allow 30 minutes for first checkpoint upload - name: "LowThroughputDetection" logPattern: ".*\\[Epoch 0 Batch \\d+.*'samples\\/sec': (\\d+(\\.\\d+)?).*" metricThreshold: 80 # 80 samples/sec operator: "lteq" metricEvaluationDataPoints: 25 # if throughput lower than threshold for 25 datapoints, kill the job
Si vous souhaitez utiliser les options de surveillance du journal, assurez-vous d'émettre le journal d'entraînement sursys.stdout. HyperPod Elastic Agent surveille les journaux d'entraînement dans sys.stdout, qui est enregistré à l'adresse. /tmp/hyperpod/ Vous pouvez utiliser la commande suivante pour émettre des journaux d’entraînement.
logging.basicConfig(format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", level=logging.INFO, stream=sys.stdout)
Le tableau suivant décrit toutes les configurations de surveillance des journaux possibles :
| Paramètre | Usage |
|---|---|
| jobMaxRetryCompter | Nombre maximal de redémarrages au niveau du processus. |
| Politique de redémarrage : numRestartBefore FullJobRestart | Nombre maximal de redémarrages au niveau du processus avant que l’opérateur ne redémarre au niveau de la tâche. |
| Politique de redémarrage : evalPeriodSeconds | Période d’évaluation de la limite de redémarrage en secondes |
| Politique de redémarrage : redémarrages maxFullJob | Nombre maximal de redémarrages complets d’une tâche avant son échec. |
| cleanPodPolicy | Spécifie les pods que l’opérateur doit nettoyer. Les valeurs acceptées sont All, OnlyComplete et None. |
| logMonitoringConfiguration | Règles de surveillance des journaux pour la détection des tâches lentes et en suspens |
| expectedRecurringFrequencyInSeconds | Intervalle de temps entre deux LogPattern matchs consécutifs après lequel la règle prend la valeur HANGING. Si ce n'est pas spécifié, aucune contrainte de temps n'existe entre les LogPattern matchs consécutifs. |
| expectedStartCutOffInSeconds | Délai avant la première LogPattern correspondance, après quoi la règle passe à HANGING. Si ce n'est pas spécifié, aucune contrainte de temps n'existe pour le premier LogPattern match. |
| logPattern | Expression régulière qui identifie les lignes de journal auxquelles la règle s’applique lorsque la règle est active |
| metricEvaluationDataPoints | Nombre de fois consécutives qu’une règle doit prendre la valeur SLOW avant le marquage d’une tâche comme SLOW. Si la valeur n’est pas spécifiée, la valeur par défaut est 1. |
| metricThreshold | Seuil de valeur extraite LogPattern par un groupe de capture. S’il n’est pas spécifié, l’évaluation des métriques n’est pas effectuée. |
| opérateur | Inégalité à appliquer à la configuration de surveillance. Les valeurs acceptées sont gt, gteq, lt, lteq et eq. |
| stopPattern | Expression régulière pour identifier la ligne de journal sur laquelle la règle doit être désactivée. Si elle n’est pas spécifiée, la règle sera toujours active. |
| faultOnMatch | Indique si une correspondance de LogPattern doit immédiatement déclencher une erreur de tâche. Lorsque ce paramètre est défini sur true, la tâche est marquée comme défectueuse dès qu'elle LogPattern correspond, quels que soient les autres paramètres de la règle. Lorsqu'elle est fausse ou non spécifiée, la règle sera évaluée à SLOW ou HANGING en fonction d'autres paramètres. |
Pour une meilleure résilience de l’entraînement, spécifiez les détails de configuration des nœuds de rechange. Si votre tâche échoue, l’opérateur travaille avec Kueue pour utiliser les nœuds réservés à l’avance afin de continuer à exécuter la tâche. Les configurations de nœuds de rechange nécessitent Kueue. Par conséquent, si vous essayez de soumettre une tâche avec des nœuds de rechange mais que Kueue n’est pas installé, la tâche échouera. L’exemple suivant est un exemple de fichier job.yaml contenant des configurations de nœuds de rechange.
apiVersion: sagemaker.amazonaws.com/v1 kind: HyperPodPyTorchJob metadata: labels: kueue.x-k8s.io/queue-name: user-queue # Specify the queue to run the job. name: hyperpodpytorchjob-sample spec: nprocPerNode: "1" runPolicy: cleanPodPolicy: "None" replicaSpecs: - name: pods replicas: 1 spares: 1 # Specify how many spare nodes to reserve. template: spec: containers: - name: XXX image: XXX imagePullPolicy: Always ports: - containerPort: 8080 resources: requests: nvidia.com/gpu: "0" limits: nvidia.com/gpu: "0"
Contrôle
Amazon SageMaker HyperPod est intégré à l'observabilité avec Amazon Managed Grafana et Amazon Managed Service for Prometheus. Vous pouvez donc configurer la surveillance pour collecter et intégrer des métriques à ces outils d'observabilité.
Vous pouvez également récupérer les métriques via le service géré Amazon pour Prometheus sans gestion de l’observabilité. Pour ce faire, incluez les métriques que vous souhaitez surveiller dans votre fichier job.yaml lorsque vous exécutez des tâches avec kubectl.
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: hyperpod-training-operator namespace: aws-hyperpod spec: ...... endpoints: - port: 8081 path: /metrics interval: 15s
Les événements suivants sont émis par l’opérateur d’entraînement et vous pouvez les transmettre au service géré Amazon pour Prometheus afin de surveiller vos tâches d’entraînement.
| Événement | Description |
|---|---|
| hyperpod_training_operator_jobs_created_total | Nombre total de tâches exécutées par l’opérateur d’entraînement |
| hyperpod_training_operator_jobs_restart_latency | Latence de redémarrage de la tâche actuelle |
| hyperpod_training_operator_jobs_fault_detection_latency | Latence de détection de défaillance |
| hyperpod_training_operator_jobs_deleted_total | Nombre total de tâches supprimées |
| hyperpod_training_operator_jobs_successful_total | Nombre total de tâches terminées |
| hyperpod_training_operator_jobs_failed_total | Nombre total de tâches ayant échoué |
| hyperpod_training_operator_jobs_restarted_total | Nombre total de tâches redémarrées automatiquement |
Configuration avec un exemple de fichier docker
Voici un exemple de fichier docker que vous pouvez exécuter avec la commande hyperpod run.
export AGENT_CMD="--backend=nccl" exec hyperpodrun --server-host=${AGENT_HOST} --server-port=${AGENT_PORT} \ --tee=3 --log_dir=/tmp/hyperpod \ --nnodes=${NNODES} --nproc-per-node=${NPROC_PER_NODE} \ --pre-train-script=/workspace/echo.sh --pre-train-args='Pre-training script' \ --post-train-script=/workspace/echo.sh --post-train-args='Post-training script' \ /workspace/mnist.py --epochs=1000 ${AGENT_CMD}
Configurations de surveillance d’un exemple de journal
Détection des interruptions de tâche
Pour détecter les interruptions de tâche, utilisez les configurations suivantes. Elles utilisent les paramètres suivants :
-
expectedStartCutOffInSeconds — combien de temps le moniteur doit attendre avant d'attendre les premiers logs
-
expectedRecurringFrequencyInSeconds — l'intervalle de temps pendant lequel il faut attendre le prochain lot de logs
Avec ces paramètres, le moniteur de journaux s’attend à voir une ligne de journal correspondant au modèle d’expression régulière .*Train Epoch.* dans les 60 secondes suivant le début de la tâche d’entraînement. Après la première occurrence, le moniteur s’attend à voir des lignes de journal correspondantes toutes les 10 secondes. Si les premiers journaux n'apparaissent pas dans les 60 secondes ou si les journaux suivants n'apparaissent pas toutes les 10 secondes, l'agent HyperPod élastique considère le contenant comme étant coincé et coordonne avec l'opérateur de formation pour recommencer le travail.
runPolicy: jobMaxRetryCount: 10 cleanPodPolicy: "None" logMonitoringConfiguration: - name: "JobStartGracePeriod" # Sample log line: [default0]:2025-06-17 05:51:29,300 [INFO] __main__: Train Epoch: 5 [0/60000 (0%)] loss=0.8470 logPattern: ".*Train Epoch.*" expectedStartCutOffInSeconds: 60 - name: "JobHangingDetection" logPattern: ".*Train Epoch.*" expectedRecurringFrequencyInSeconds: 10 # if the next batch is not printed within 10 seconds
Pic de pertes d’entraînement
La configuration de surveillance suivante émet des journaux d’entraînement avec le modèle xxx training_loss_step xx. Elle utilise le paramètre metricEvaluationDataPoints, qui vous permet de spécifier un seuil de points de données avant que l’opérateur redémarre la tâche. Si la valeur de la perte d’entraînement est supérieure à 2.0, l’opérateur redémarre la tâche.
runPolicy: jobMaxRetryCount: 10 cleanPodPolicy: "None" logMonitoringConfiguration: - name: "LossSpikeDetection" logPattern: ".*training_loss_step (\\d+(?:\\.\\d+)?).*" # training_loss_step 5.0 metricThreshold: 2.0 operator: "gt" metricEvaluationDataPoints: 5 # if loss higher than threshold for 5 data points, restart the job
Faible TFLOPs détection
La configuration de surveillance suivante émet des journaux d’entraînement avec le modèle xx TFLOPs xx toutes les cinq secondes. S'il TFLOPs est inférieur à 100 pour 5 points de données, l'opérateur redémarre la tâche de formation.
runPolicy: jobMaxRetryCount: 10 cleanPodPolicy: "None" logMonitoringConfiguration: - name: "TFLOPs" logPattern: ".* (.+)TFLOPs.*" # Training model, speed: X TFLOPs... expectedRecurringFrequencyInSeconds: 5 metricThreshold: 100 # if Tflops is less than 100 for 5 data points, restart the job operator: "lt" metricEvaluationDataPoints: 5
Détection du journal des erreurs du script d'entraînement
La configuration de surveillance suivante détecte si le schéma spécifié dans logPattern est présent dans les journaux d'entraînement. Dès que l'opérateur de formation rencontre le schéma d'erreur, il le traite comme un défaut et redémarre le travail.
runPolicy: jobMaxRetryCount: 10 cleanPodPolicy: "None" logMonitoringConfiguration: - name: "GPU Error" logPattern: ".*RuntimeError.*out of memory.*" faultOnMatch: true