eagle3-triage

Par nvidia · model-optimizer

Triez un run de pipeline EAGLE3 défaillant. Identifie l'étape qui a échoué (synthèse de données, dump d'états cachés, entraînement ou benchmark), diagnostique la cause racine à partir des logs et suggère des correctifs. À utiliser quand l'utilisateur signale un échec de pipeline EAGLE3 ou demande pourquoi une étape spécifique a échoué. Aide également à déboguer les problèmes de support de nouveaux modèles.

npx skills add https://github.com/nvidia/model-optimizer --skill eagle3-triage

Triage du pipeline EAGLE3

Diagnostiquez les défaillances du pipeline offline EAGLE3 en 4 étapes. Cette compétence parcourt chaque étape, identifie le point de défaillance et fournit des corrections actionnables.

Aperçu du pipeline

Étape Script Objectif Zone de défaillance courante
task_0 common/vllm/query.sh Synthèse de données via serveur vLLM Démarrage du serveur, chargement du modèle, OOM
task_1 common/eagle3/dump_offline_data_vllm.sh (ou _hf.sh / .sh) Décharger les états cachés Sélection du backend, OOM, architecture non supportée
task_2 common/eagle3/train_eagle.sh Entraîner la tête de brouillon EAGLE3 Dépendances, crash d'entraînement, export
task_3 common/specdec_bench/quick_check.sh Benchmark du taux d'acceptation Démarrage du moteur, chargement du modèle de brouillon

Étape 0 — Localiser l'expérience

Demandez à l'utilisateur l'un des éléments suivants :

  • Répertoire d'expérience (par ex., le --job-dir passé à launch.py ou slurm.py)
  • Le nom du modèle / YAML qu'il a exécuté

Trouvez les expériences récentes sous le répertoire de tâche :

ls -td experiments/cicd/cicd_* | head -10
# ou selon où --job-dir était pointé

Chaque répertoire d'expérience contient un sous-répertoire par tâche (task_0 à task3), chacun avec un fichier journal dont le nom varie selon le mode de lancement (Slurm : `sbatch.out, Docker local :.log`).

Étape 1 — Récupérer les journaux de la tâche défaillante

Trouvez les fichiers journaux généralement et lisez la fin de chacun — les erreurs apparaissent à la fin :

find experiments/<exp_id>/ -type f \( -name '*.out' -o -name '*.log' \) | sort | while read -r f; do
  echo "=== $f ==="; tail -200 "$f"; echo
done

Cherchez la première tâche avec un code de sortie non nul ou un message d'erreur.

Étape 2 — Diagnostiquer par étape

Défaillances de task_0 (Synthèse de données)

Fonctionnement : Lance un serveur vLLM compatible OpenAI, sonde /health jusqu'à ce qu'il soit prêt, puis exécute query.py pour générer des paires prompt/réponse synthétiques. La sortie va à /scratchspace/data/.

Motif d'erreur Cause racine Correction
Le serveur ne devient jamais sain (bloque au contrôle de santé) Modèle trop volumineux pour les GPUs alloués, ou crash du démarrage de vLLM Vérifiez la taille du poids BF16 par rapport à la mémoire GPU totale allouée ; augmentez TP et/ou les nœuds.
CUDA out of memory pendant le chargement du modèle Mémoire GPU insuffisante Réduisez --max-model-len ou augmentez --tensor-parallel-size
Erreur trust_remote_code Le modèle nécessite du code personnalisé mais le flag n'est pas défini Ajoutez --trust-remote-code avant le séparateur -- dans les args de task_0
Erreur vocab / tokenizer Cache du tokenizer manquant (par ex., GPT-OSS-20B a besoin de TIKTOKEN_RS_CACHE_DIR) Définissez TIKTOKEN_RS_CACHE_DIR vers un chemin de cache pré-rempli dans l'environnement
Architecture non supportée La version de vLLM ne supporte pas ce modèle Essayez un conteneur vLLM plus récent (vllm/vllm-openai:latest)
CANCELLED ... DUE TO TIME LIMIT Limite de temps mur Slurm trop courte Augmentez --time Slurm. Note : les dépendances afterany laissent task_1 démarrer quand même.
/scratchspace/data/ vide query.py a tourné mais n'a produit aucune sortie Vérifiez que le chemin --data existe et contient des prompts. Vérifiez les journaux de query.py.

Défaillances de task_1 (Décharge d'état caché)

Fonctionnement : Charge le modèle cible et exécute une passe avant sur chaque conversation, enregistrant les états cachés sous forme de fichiers .pt dans /scratchspace/offline_hidden_states/.

Trois backends sont disponibles :

Backend Script Quand l'utiliser
vLLM dump_offline_data_vllm.sh Large couverture de modèles ; utilise l'extracteur d'état caché natif de vLLM
HF dump_offline_data_hf.sh VLMs, modèles avec code personnalisé, attention SWA ; utilise device_map="auto"
TRT-LLM dump_offline_data.sh Modèles purement textuels avec support TRT-LLM ; nécessite les args --tp/--moe-ep
Motif d'erreur Cause racine Correction
No such file or directory: dump_offline_data_vllm.sh Chemin de script incorrect dans le YAML Utilisez le chemin correct sous common/eagle3/
FileNotFoundError: /scratchspace/data task_0 a échoué ou n'a produit aucune sortie Réexécutez task_0 d'abord, ou pointez --input-data vers des données existantes
CUDA out of memory Modèle trop volumineux Basculez vers _hf.sh (device_map="auto") ou augmentez TP
RuntimeError / architecture non supportée Modèle non supporté par le backend TRT-LLM Basculez vers dump_offline_data_hf.sh ou dump_offline_data_vllm.sh
NCCL timeout / NCCL error Défaillance de communication multi-nœud Réessayez. Réduisez EP.
Aucun fichier .pt dans le répertoire de sortie Script a tourné mais l'extraction n'a rien produit Vérifiez --max-seq-len et le format des données d'entrée
pyxis: child terminated with signal 15 SIGTERM — probablement OOM Augmentez TP ou changez de backends

Défaillances de task_2 (Entraînement)

Fonctionnement : Installe les exigences, exécute launch_train.sh (Accelerate + FSDP) avec la config de modelopt_recipes/general/speculative_decoding/eagle3.yaml, puis exporte via export_hf_checkpoint.py. Sortie : /scratchspace/eagle3/ et /scratchspace/export/.

Motif d'erreur Cause racine Correction
FileNotFoundError: /scratchspace/offline_hidden_states task_1 a échoué ou n'a produit aucune sortie Réexécutez task_1 d'abord
CUDA out of memory pendant l'entraînement Taille de batch trop grande Réduisez training.train_bs ou training.training_seq_len
KeyError / AttributeError lors du chargement du modèle Architecture de modèle non reconnue par EAGLE3 Le modèle peut nécessiter des changements de code dans modelopt pour cette architecture
Loss est NaN ou diverge LR trop élevé ou problème de qualité des données Réduisez training.lr. Vérifiez les données d'état caché.
export_hf_checkpoint.py échoue L'entraînement a produit un checkpoint incomplet Vérifiez /scratchspace/eagle3/ pour model.safetensors

Défaillances de task_3 (Benchmark)

Fonctionnement : Lance vLLM avec le modèle cible + brouillon, exécute les benchmarks du taux d'acceptation et du débit. Sortie : fichiers JSON.

Motif d'erreur Cause racine Correction
FileNotFoundError: /scratchspace/export task_2 a échoué ou l'étape d'export a échoué Réexécutez task_2. Vérifiez la sortie d'export.
Erreur trust_remote_code au benchmark Le modèle le nécessite mais quick_check.sh ne transmet pas le flag Passez --trust-remote-code dans les args de task_3
Le serveur échoue avec le modèle de brouillon Config du modèle de brouillon incompatible avec le moteur Vérifiez eagle_config.json et la version du moteur
AR en dessous du seuil / code de sortie 1 Qualité du modèle de brouillon trop faible Plus d'epochs, de données, ou ajustement d'hyperparamètres
CUDA out of memory Cible + brouillon dépasse la mémoire GPU Augmentez TP
EAGLE3 vLLM non supporté Version vLLM trop ancienne Utilisez un conteneur vLLM plus récent

Étape 3 — Vérifier les problèmes spécifiques au nouveau modèle

Si l'utilisateur ajoute le support d'un nouveau modèle, vérifiez aussi :

  1. Le modèle est-il un VLM ? → Utilisez dump_offline_data_hf.sh (chemin texte uniquement, aucun encodeur de vision invoqué)
  2. Le modèle utilise-t-il l'attention à fenêtre glissante (SWA) ? → Le backend TRT-LLM ne fonctionnera pas ; utilisez HF ou vLLM
  3. Le modèle a-t-il besoin de trust_remote_code ? → Ajoutez aux args de task_0 ET aux args de task_3
  4. Le modèle est-il MoE ? → Vérifiez que eagle_config.json intermediate_size correspond au moe_intermediate_size du modèle
  5. L'architecture du modèle est-elle reconnue par l'entraînement EAGLE3 ? → peut nécessiter des changements de code dans modelopt/torch/speculative/
  6. Tokenizer personnalisé ? → Peut nécessiter des variables d'environnement supplémentaires (par ex., TIKTOKEN_RS_CACHE_DIR)

Étape 4 — Suggérer une correction et les prochaines étapes

Après le diagnostic, fournissez :

  1. Cause racine — résumé d'une ligne
  2. Correction — changement de config spécifique, édition de code ou commande à exécuter
  3. Comment réexécuter — ignorez les étapes antérieures réussies en pointant vers les artifacts scratchspace existants

Pour ignorer task_0 et task_1 et réexécuter à partir de task_2 :

uv run launch.py --yaml examples/<Org>/<Model>/hf_offline_eagle3.yaml \
    pipeline.task_0.skip=true \
    pipeline.task_1.skip=true \
    --yes

Pour exécuter uniquement task_1 en standalone (en utilisant les données task_0 existantes) :

uv run launch.py --yaml examples/<Org>/<Model>/hf_offline_eagle3.yaml \
    pipeline.task_0.skip=true \
    pipeline.task_2.skip=true \
    pipeline.task_3.skip=true \
    --yes

Si la correction nécessite des changements de code dans ModelOpt (par ex., supporter une nouvelle architecture de modèle), notez qu'une PR séparée dans le repo modelopt est nécessaire.

Étape 5 — Enregistrer le motif de défaillance

Si vous rencontrez un motif de défaillance non vus auparavant, capturez-le dans le tracker de triage interne de l'équipe — le symptôme, la cause racine et la correction — afin que le prochain ingénieur déboguant le même problème en bénéficie.

Skills similaires