Résilience
Docs stables : @docs/training/resiliency.md, @docs/training/checkpointing.md Carte : @skills/resiliency/card.yaml
Activation
Tolérance aux pannes (Slurm uniquement)
Option 1 : plugin NeMo Run (recommandé)
from megatron.bridge.recipes.run_plugins import FaultTolerancePlugin
import nemo_run as run
task = run.Script(...)
run_plugins = [
FaultTolerancePlugin(
enable_ft_package=True,
calc_ft_timeouts=True,
num_in_job_restarts=3,
num_job_retries_on_failure=2,
initial_rank_heartbeat_timeout=1800,
rank_heartbeat_timeout=300,
)
]
run.run(task, plugins=run_plugins, executor=executor)
| Paramètre du plugin | Défaut | Description |
|---|---|---|
num_in_job_restarts |
3 | Redémarrages max dans le même job |
num_job_retries_on_failure |
2 | Lancements de nouveaux jobs max en cas d'échec |
initial_rank_heartbeat_timeout |
1800 | Timeout du premier heartbeat (secondes) |
rank_heartbeat_timeout |
300 | Timeout du heartbeat ultérieur (secondes) |
Option 2 : config directe + ft_launcher
from megatron.bridge.training.config import FaultToleranceConfig
cfg.ft = FaultToleranceConfig(
enable_ft_package=True,
calc_ft_timeouts=True,
simulate_fault=False,
simulated_fault_type="random",
)
Lancer avec ft_launcher (pas torchrun) :
export GROUP_RANK=0 # requis pour non-Slurm
ft_launcher \
--rdzv_backend=c10d --rdzv_endpoint=${MASTER_ADDR}:${MASTER_PORT} \
--nnodes=${NUM_NODES} --nproc-per-node=${NUM_GPUS_PER_NODE} \
--ft-rank_section_timeouts=setup:600,step:180,checkpointing:420 \
--ft-rank_out_of_section_timeout=300 \
your_training_script.py
| Paramètre de config | Défaut | Description |
|---|---|---|
enable_ft_package |
False | Activer la tolérance aux pannes |
calc_ft_timeouts |
False | Calculer automatiquement les timeouts optimaux |
simulate_fault |
False | Activer la simulation de panne pour les tests |
simulated_fault_type |
"random" |
"rank_hung", "rank_killed", ou "random" |
simulated_fault_rank |
None | Rang spécifique à défaillir (aléatoire si None) |
simulated_fault_base_delay |
0 | Délai avant simulation de panne |
La surveillance des timeouts par section couvre la configuration, les étapes d'entraînement, les checkpoints et le temps hors-section indépendamment. Les timeouts sont sauvegardés dans ft_state.json pour les exécutions ultérieures quand calc_ft_timeouts=True.
Détection des traînards NVRx
from megatron.bridge.training.config import NVRxStragglerDetectionConfig
cfg.nvrx_straggler = NVRxStragglerDetectionConfig(
enabled=True,
report_time_interval=300.0,
calc_relative_gpu_perf=True,
calc_individual_gpu_perf=True,
num_gpu_perf_scores_to_print=5,
gpu_relative_perf_threshold=0.7,
gpu_individual_perf_threshold=0.7,
stop_if_detected=False,
enable_logging=True,
)
| Paramètre | Défaut | Description |
|---|---|---|
enabled |
False | Activer la détection des traînards |
report_time_interval |
300.0 | Secondes entre les vérifications des traînards |
calc_relative_gpu_perf |
True | Comparer les rangs entre eux |
calc_individual_gpu_perf |
True | Suivre la dégradation par rang dans le temps |
gpu_relative_perf_threshold |
0.7 | Seuil de performance relative (0-1) |
gpu_individual_perf_threshold |
0.7 | Seuil de performance individuelle (0-1) |
stop_if_detected |
False | Arrêter l'entraînement en cas de traînard |
num_gpu_perf_scores_to_print |
5 | Nombre de meilleurs/pires scores à afficher |
profiling_interval |
1 | Intervalle de profilage pour le détecteur |
Préemption
Plugin (Slurm)
from megatron.bridge.recipes.run_plugins import PreemptionPlugin
plugins = [
PreemptionPlugin(
preempt_time=60,
enable_exit_handler=True,
enable_exit_handler_for_data_loader=False,
)
]
| Paramètre du plugin | Défaut | Description |
|---|---|---|
preempt_time |
60 | Secondes avant la limite du job pour envoyer le signal |
enable_exit_handler |
True | Activer le gestionnaire de signal dans l'entraînement |
enable_exit_handler_for_data_loader |
False | Activer pour les workers du dataloader |
Config directe
import signal
cfg.train.exit_signal_handler = True
cfg.train.exit_signal = signal.SIGTERM
cfg.train.exit_signal_handler_for_dataloader = False
Machine d'état de ré-exécution (expérimentale)
from megatron.bridge.training.config import RerunStateMachineConfig
cfg.rerun_state_machine = RerunStateMachineConfig(
rerun_mode="validate_results",
check_for_nan_in_loss=True,
check_for_spiky_loss=False,
spiky_loss_factor=10.0,
)
| Paramètre | Défaut | Description |
|---|---|---|
rerun_mode |
"disabled" |
"disabled", "validate_results", "report_determinism_stats" |
check_for_nan_in_loss |
True | Vérifier les NaN dans la perte |
check_for_spiky_loss |
False | Vérifier les pics de perte inattendue |
spiky_loss_factor |
10.0 | Perte signalée si > facteur * max observé (augmenter pour les gros modèles) |
Codes de sortie : 16 = reprendre pour désambiguïser, 17 = validation échouée.
Redémarrage en-processus (expérimental)
from megatron.bridge.training.config import InProcessRestartConfig
cfg.inprocess_restart = InProcessRestartConfig(
enabled=True,
granularity="node",
soft_timeout=60.0,
hard_timeout=90.0,
)
| Paramètre | Défaut | Description |
|---|---|---|
enabled |
False | Activer le redémarrage en-processus |
active_world_size |
None | Rangs exécutant la workload (les autres sont des réserves passives) |
granularity |
"node" |
Granularité du redémarrage "node" ou "rank" |
max_iterations |
None | Tentatives de redémarrage max (None = illimité) |
soft_timeout |
60.0 | Détecter les blocages libérant le GIL (secondes) |
hard_timeout |
90.0 | Terminer de force les rangs bloqués (secondes) |
heartbeat_interval |
30.0 | Intervalle heartbeat (secondes) |
heartbeat_timeout |
60.0 | Timeout du heartbeat manquant (secondes) |
barrier_timeout |
120.0 | Timeout de la barrière distribuée (secondes) |
completion_timeout |
120.0 | Timeout de barrière de complétion (secondes) |
empty_cuda_cache |
True | Vider le cache CUDA pendant le redémarrage |
max_rank_faults |
None | Défaillances de rang max avant arrêt |
monitor_process_logdir |
None | Répertoire pour les logs du moniteur |
Variables d'environnement requises :
export TORCH_CPP_LOG_LEVEL=error
export TORCH_NCCL_RETHROW_CUDA_ERRORS=0
export NCCL_NVLS_ENABLE=0
Le timeout du watchdog NCCL de PyTorch doit dépasser hard_timeout. L'exécuteur Slurm de NeMo-Run n'est pas supporté ; lancer directement avec srun --kill-on-bad-exit=0.
Sauvegarde asynchrone du checkpoint
cfg.checkpoint.async_save = True
cfg.checkpoint.ckpt_format = "torch_dist"
Checkpointing local (NVRx)
cfg.checkpoint.non_persistent_local_ckpt_dir = "/local/scratch/ckpt"
cfg.checkpoint.non_persistent_local_ckpt_algo = "fully_parallel"
Ancres de code
Tolérance aux pannes
- Config :
src/megatron/bridge/training/config.py—FaultToleranceConfig - Runtime :
src/megatron/bridge/training/fault_tolerance.py - Plugin :
src/megatron/bridge/recipes/run_plugins.py—FaultTolerancePlugin - Plugin perf :
scripts/performance/resiliency_plugins.py - Tests :
tests/unit_tests/training/test_fault_tolerance.py - Exemple :
examples/resiliency/fault_tolerance/
Détection des traînards
- Config :
src/megatron/bridge/training/config.py—NVRxStragglerDetectionConfig - Runtime :
src/megatron/bridge/training/nvrx_straggler.py - Boucle d'entraînement :
src/megatron/bridge/training/train.py—check_nvrx_straggler_detection - Tests :
tests/unit_tests/training/test_nvrx_straggler.py,tests/functional_tests/training/test_nvrx_straggler.py - Exemple :
examples/resiliency/straggler_detection/
Redémarrage en-processus
- Config :
src/megatron/bridge/training/config.py—InProcessRestartConfig - Runtime :
src/megatron/bridge/training/inprocess_restart.py - Point d'entrée :
src/megatron/bridge/training/pretrain.py—maybe_wrap_for_inprocess_restart - Tests :
tests/unit_tests/training/test_inprocess_restart.py,tests/functional_tests/training/test_inprocess_restart.py
Préemption
- Plugin :
src/megatron/bridge/recipes/run_plugins.py—PreemptionPlugin - Gestionnaire de signal :
src/megatron/bridge/training/utils/sig_utils.py - Tests :
tests/unit_tests/recipes/test_run_plugins.py
Machine d'état de ré-exécution
- Config :
src/megatron/bridge/training/config.py—RerunStateMachineConfig - Init :
src/megatron/bridge/training/initialize.py—init_rerun_state
Checkpointing
- Sauvegarde asynchrone :
src/megatron/bridge/training/checkpointing.py—schedule_async_save - Ckpt local :
src/megatron/bridge/training/checkpointing.py—LocalCheckpointManager - Tests :
tests/functional_tests/training/test_local_checkpointing.py
Pièges
-
ft_launcher, pas torchrun :
FaultToleranceConfigdirecte nécessiteft_launcher. Utilisertorchrundésactive silencieusement la FT. Pour non-Slurm, définirGROUP_RANK=0. -
Sauvegarde asynchrone nécessite torch_dist :
async_save=Truefonctionne uniquement avecckpt_format="torch_dist". Les autres formats échouent silencieusement ou génèrent une erreur. -
IPR + NeMo-Run : Le redémarrage en-processus n'est pas compatible avec NeMo-Run ou les plugins de préemption Slurm. Nécessite des versions spécifiques de PyTorch/NCCL et des variables d'env.
-
NVRx vs détecteur hérité : Deux détecteurs existent. Utiliser NVRx (
nvrx_straggler) ; ne pas activer les deux. -
Défaut stop_if_detected : NVRx enregistre mais n'arrête pas l'entraînement par défaut. Définir
stop_if_detected=Truepour l'arrêt automatique. -
Watchdog NCCL vs hard_timeout : Pour IPR, le timeout du watchdog NCCL doit dépasser
hard_timeoutou PyTorch tue le processus avant la récupération. -
Machine d'état de ré-exécution est alpha : Utiliser
check_for_nan_in_loss=Truepour la détection NaN, mais ne pas dépendre complètement des workflows de ré-exécution pour l'instant.
Vérification
Tolérance aux pannes
./examples/resiliency/fault_tolerance/run_fault_tolerance.sh
./examples/resiliency/fault_tolerance/run_fault_tolerance.sh --simulate-fault
Chercher les lignes de log [FaultTolerance] / [RankMonitorServer] avec les timeouts de section. Une panne simulée devrait déclencher un redémarrage depuis le checkpoint.
Détection des traînards
uv run python -m torch.distributed.run --nproc_per_node=2 \
examples/resiliency/straggler_detection/straggler_detection_example.py
Chercher les rapports GPU relative performance et GPU individual performance avec les scores par rang.
Checkpoint asynchrone
Chercher Scheduling async checkpoint save dans les logs. Les itérations d'entraînement doivent continuer pendant que les fichiers de checkpoint sont écrits.
Redémarrage en-processus
pytest tests/functional_tests/training/test_inprocess_restart.py -v
Nécessite des versions compatibles de PyTorch/NCCL.