トレーニングオペレーターを使用してジョブを実行する - Amazon SageMaker AI

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

トレーニングオペレーターを使用してジョブを実行する

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 Elastic Agent は、/tmp/hyperpod/ に保存されている sys.stdout のトレーニングログをモニタリングします。次のコマンドを使用して、トレーニングログを出力できます。

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 オペレータがクリーンアップするポッドを指定します。許容される値は、AllOnlyCompleteNone です。
logMonitoringConfiguration 遅いジョブやハングしたジョブを検出するためのログモニタリングルール
expectedRecurringFrequencyInSeconds ルールが HANGING と評価されるまでの 2 つの LogPattern 一致の時間間隔。指定しない場合、連続する LogPattern 一致の間に時間制約はありません。
expectedStartCutOffInSeconds ルールが HANGING と評価される場合の最初の LogPattern 一致までの時間。指定しない場合、最初の LogPattern 一致に時間制約はありません。
logPattern ルールがアクティブな場合にルールが適用されるログ行を識別する正規表現
metricEvaluationDataPoints ジョブを SLOW としてマークする前に、ルールが SLOW に評価する必要がある連続回数。指定されなかった場合、デフォルト値は 1 です。
metricThreshold キャプチャグループを持つ LogPattern によって抽出された値のしきい値。指定しない場合、メトリクス評価は実行されません。
オペレーター モニタリング設定に適用する不等式。許容される値は、gtgteqltlteqeq です。
stopPattern ルールを非アクティブ化するログ行を識別するための定期的な説明。指定しない場合、ルールは常にアクティブになります。
faultOnMatch LogPattern の一致がジョブ障害をすぐにトリガーするかどうかを示します。true の場合、他のルールパラメータに関係なく、LogPattern が一致するとすぐにジョブは障害としてマークされます。false または指定しない場合、ルールは他のパラメータに基づいて SLOW または HANGING に評価されます。

トレーニングの耐障害性を向上するには、予備のノード設定の詳細を指定します。ジョブが失敗した場合、オペレーターは 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 を介してメトリクスをスクレイプすることもできます。これを行うには、kubectl でジョブを実行する際に、モニタリングするメトリクスを job.yaml ファイルに含めます。

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 にフィードしてトレーニングジョブをモニタリングできるイベントです。

[Event] (イベント) 説明
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 Elastic Agent はコンテナをスタックとして扱い、トレーニングオペレーターと連携してジョブを再開します。

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

低 TFLOP 検出

次のモニタリング設定は、パターン xx TFLOPs xx を使用して、5 秒ごとにトレーニングログを出力します。5 つのデータポイントで TFLOP が 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

トレーニングスクリプトのエラーログ検出

次のモニタリング設定は、 で指定されたパターンlogPatternがトレーニングログに存在するかどうかを検出します。トレーニングオペレーターがエラーパターンに遭遇するとすぐに、トレーニングオペレーターはそれを障害として扱い、ジョブを再起動します。

runPolicy: jobMaxRetryCount: 10 cleanPodPolicy: "None" logMonitoringConfiguration: - name: "GPU Error" logPattern: ".*RuntimeError.*out of memory.*" faultOnMatch: true