翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
トレーニング演算子を使用したジョブの実行
kubectl を使用してジョブを実行するには、job.yaml を作成してジョブ仕様を指定し、 kubectl apply -f job.yaml
を実行してジョブを送信する必要があります。この YAML ファイルでは、 logMonitoringConfiguration
引数でカスタム設定を指定して、分散トレーニングジョブからのログ出力を分析して問題を検出して復旧する自動モニタリングルールを定義できます。
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
ログモニタリングオプションを使用する場合は、トレーニングログを に出力していることを確認してくださいsys.stdout
。HyperPod エラスティックエージェントは、 に保存されている sys.stdout のトレーニングログをモニタリングします/tmp/hyperpod/
。次のコマンドを使用して、トレーニングログを出力できます。
logging.basicConfig(format="%(asctime)s [%(levelname)s] %(name)s: %(message)s", level=logging.INFO, stream=sys.stdout)
次の表は、考えられるすべてのログモニタリング設定を示しています。
パラメータ | 使用方法 |
---|---|
jobMaxRetryCount | プロセスレベルでの再起動の最大数。 |
restartPolicy: numRestartBeforeFullJobRestart | オペレーターがジョブレベルで再起動するまでのプロセスレベルでの再起動の最大数。 |
restartPolicy: evalPeriodSeconds | 再起動制限を秒単位で評価する期間 |
restartPolicy: maxFullJobRestarts | ジョブが失敗するまでのフルジョブの再起動の最大数。 |
cleanPodPolicy | オペレータがクリーンアップするポッドを指定します。使用できる値は、All 、OnlyComplete 、および ですNone 。 |
logMonitoringConfiguration | スロージョブとハングジョブの検出に関するログモニタリングルール |
expectedRecurringFrequencyInSeconds | ルールが HANGING と評価されるまでの 2 つの連続した LogPattern 一致の時間間隔。指定しない場合、連続する LogPattern 一致の間に時間制約はありません。 |
expectedStartCutOffInSeconds | ルールが HANGING に評価されるまでの最初の LogPattern 一致までの時間。指定しない場合、最初の LogPattern 一致の時間制約は存在しません。 |
logPattern | ルールがアクティブなときにルールが適用されるログ行を識別する正規表現 |
metricEvaluationDataPoints | ジョブを SLOW としてマークする前に、ルールが SLOW に評価する必要がある連続回数。指定されなかった場合、デフォルト値は 1 です。 |
metricThreshold | キャプチャグループを持つ LogPattern によって抽出された値のしきい値。指定しない場合、メトリクス評価は実行されません。 |
オペレーター | モニタリング設定に適用する不等式。使用できる値は、gt 、gteq 、、lt lteq 、および ですeq 。 |
stopPattern | ルールを非アクティブ化するログ行を識別するための定期的な説明。指定しない場合、ルールは常にアクティブになります。 |
トレーニングの耐障害性を高めるには、予備のノード設定の詳細を指定します。ジョブが失敗した場合、オペレーターは Kueue と連携して、事前に予約されたノードを使用してジョブの実行を続行します。スペアノード設定には Kueue が必要なため、スペアノードを持つジョブを送信しようとしても Kueue がインストールされていない場合、ジョブは失敗します。次の例は、予備のノード設定を含むサンプルjob.yaml
ファイルです。
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"
モニタリング
Amazon SageMaker HyperPod は Amazon Managed Grafana および Amazon Managed Service for Prometheus とオブザーバビリティと統合されているため、メトリクスを収集してこれらのオブザーバビリティツールにフィードするようにモニタリングを設定できます。
または、マネージドオブザーバビリティなしで Amazon Managed Service for Prometheus を通じてメトリクスをスクレイプすることもできます。これを行うには、 でジョブを実行するときに、モニタリングするメトリクスを job.yaml
ファイルに含めますkubectl
。
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: hyperpod-training-operator namespace: aws-hyperpod spec: ...... endpoints: - port: 8081 path: /metrics interval: 15s
以下は、トレーニングオペレーターが Amazon Managed Service for Prometheus にフィードしてトレーニングジョブをモニタリングできるイベントです。
イベント | 説明 |
---|---|
hyperpod_training_operator_jobs_created_total | トレーニングオペレーターが実行したジョブの合計数 |
hyperpod_training_operator_jobs_restart_latency | 現在のジョブの再起動レイテンシー |
hyperpod_training_operator_jobs_fault_detection_latency | 障害検出のレイテンシー |
hyperpod_training_operator_jobs_deleted_total | 削除されたジョブの合計数 |
hyperpod_training_operator_jobs_successful_total | 完了したジョブの合計数 |
hyperpod_training_operator_jobs_failed_total | 失敗したジョブの合計数 |
hyperpod_training_operator_jobs_restarted_total | 自動再起動されたジョブの合計数 |
サンプル docker 設定
以下は、 hyperpod run
コマンドで実行できるサンプル docker ファイルです。
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}
サンプルログモニタリング設定
ジョブのハング検出
ハングジョブを検出するには、次の設定を使用します。次のパラメータを使用します。
-
expectedStartCutOffInSeconds – モニターが最初のログを予期するまで待機する時間
-
expectedRecurringFrequencyInSeconds – ログの次のバッチを待機する時間間隔
これらの設定では、ログモニターはトレーニングジョブの開始から 60 秒.*Train Epoch.*
以内に正規表現パターンに一致するログ行が表示されることを期待します。最初の表示後、モニタは 10 秒ごとに一致するログ行を表示することを期待します。最初のログが 60 秒以内に表示されない場合、または後続のログが 10 秒ごとに表示されない場合、HyperPod エラスティックエージェントはコンテナをスタックとして扱い、トレーニングオペレーターと連携してジョブを再開します。
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
トレーニング損失の急増
次のモニタリング設定は、パターン を使用してトレーニングログを出力しますxxx training_loss_step xx
。パラメータ を使用します。これによりmetricEvaluationDataPoints
、オペレータがジョブを再起動する前にデータポイントのしきい値を指定できます。トレーニング損失値が 2.0 を超える場合、オペレーターはジョブを再起動します。
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
低 TFLOPs検出
次のモニタリング設定は、 パターンのトレーニングログを 5 秒xx TFLOPs xx
ごとに出力します。5 つのデータポイントで TFLOPsが 100 未満の場合、オペレーターはトレーニングジョブを再起動します。
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