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-dirpassé àlaunch.pyouslurm.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 :
- Le modèle est-il un VLM ? → Utilisez
dump_offline_data_hf.sh(chemin texte uniquement, aucun encodeur de vision invoqué) - Le modèle utilise-t-il l'attention à fenêtre glissante (SWA) ? → Le backend TRT-LLM ne fonctionnera pas ; utilisez HF ou vLLM
- Le modèle a-t-il besoin de
trust_remote_code? → Ajoutez aux args de task_0 ET aux args de task_3 - Le modèle est-il MoE ? → Vérifiez que
eagle_config.jsonintermediate_sizecorrespond aumoe_intermediate_sizedu modèle - L'architecture du modèle est-elle reconnue par l'entraînement EAGLE3 ? → peut nécessiter des changements de code dans
modelopt/torch/speculative/ - 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 :
- Cause racine — résumé d'une ligne
- Correction — changement de config spécifique, édition de code ou commande à exécuter
- 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.