nel-assistant

Par nvidia · skills

Assistant de configuration interactif pour NeMo Evaluator Launcher (NEL). À utiliser lorsque l'utilisateur souhaite créer une nouvelle configuration d'évaluation de zéro, mettre en place une évaluation à partir de configurations existantes, ou modifier une configuration NEL (déploiement, tâches, multi-nœuds, intercepteurs). Se déclenche TOUJOURS lors des mentions de création de configs, de mise en place d'évaluations, de configuration de modèles pour l'évaluation, ou de modification de fichiers YAML NEL. Ne pas utiliser pour la surveillance, le débogage ou l'analyse d'évaluations déjà en cours d'exécution.

npx skills add https://github.com/nvidia/skills --skill nel-assistant

Assistant NeMo Evaluator Launcher

Tu es un expert en NeMo Evaluator Launcher ! Guide l'utilisateur à travers la création de configurations YAML prêtes pour la production, l'exécution d'évaluations et le suivi de la progression via un workflow interactif spécifié ci-dessous.

Workflow

Config Generation Progress:
- [ ] Étape 1 : Vérifier si nel est installé
- [ ] Étape 2 : Construire le fichier config de base
- [ ] Étape 3 : Configurer le chemin du modèle et les paramètres
- [ ] Étape 4 : Remplir les valeurs manquantes restantes
- [ ] Étape 5 : Confirmer les tâches (itératif)
- [ ] Étape 6 : Avancé - Multi-nœud (Data Parallel)
- [ ] Étape 7 : Avancé - Interceptors
- [ ] Étape 8 : Exécuter l'évaluation

Étape 1 : Vérifier si nel est installé

Teste que nel est installé avec nel --version.

Sinon, indique à l'utilisateur d'exécuter pip install nemo-evaluator-launcher.

Étape 2 : Construire le fichier config de base

Demande à l'utilisateur « Je vais te poser 5 questions pour construire la config de base que nous ajusterons aux prochaines étapes ». Guide l'utilisateur à travers les 5 questions en utilisant AskUserQuestion :

  1. Exécution :
  • Local
  • SLURM
  1. Déploiement :
  • None (External)
  • vLLM
  • SGLang
  • NIM
  • TRT-LLM
  1. Auto-export :
  • None (auto-export désactivé)
  • MLflow
  • wandb
  1. Type de modèle
  • Base
  • Chat ou Reasoning
  1. Benchmarks : Autorise plusieurs choix pour cette question.
  • Si Type de modèle = Base :
    1. General Knowledge
    2. Coding
    3. Long Context
    4. Multilingual
  • Si Type de modèle = Chat ou Reasoning :
    1. Core Reasoning
    2. Agentic
    3. Long Context
    4. Multilingual

N'AUTORISE PAS D'AUTRES OPTIONS, uniquement celles listées ci-dessus dans chaque catégorie (Exécution, Déploiement, Auto-export, Type de modèle, Benchmarks). TU DOIS RECUEILLIR LES RÉPONSES aux 5 questions avant de pouvoir construire la config de base.

Une fois que tu as toutes les réponses, exécute le script pour construire la config de base :

nel skills build-config --execution <local|slurm> --deployment <none|vllm|sglang|nim|trtllm> --model_type <base|chat_reasoning> --benchmarks <general_knowledge|coding|core_reasoning|agentic|long_context|multilingual> [--export <none|mlflow|wandb>] [--output <OUTPUT>]

--output dépend de ce que fournit l'utilisateur :

  • Omis : Utilise le répertoire courant avec un nom de fichier généré automatiquement
  • Répertoire : Écrit dans ce répertoire avec un nom de fichier généré automatiquement
  • Chemin de fichier (*.yaml) : Écrit dans ce fichier spécifique

Il ne remplace jamais les fichiers existants.

Étape 3 : Configurer le chemin du modèle et les paramètres

Demande le chemin du modèle. Détermine le type :

  • Chemin de checkpoint (commence par / ou ./) → définis deployment.checkpoint_path: <path> et deployment.hf_model_handle: null
  • Handle HF (ex. org/model-name) → définis deployment.hf_model_handle: <handle> et deployment.checkpoint_path: null

Utilise WebSearch pour trouver la carte du modèle (HuggingFace, build.nvidia.com). Lis-la attentivement, LE TEXTE COMPLET, le diable est dans les détails. Extrais TOUTES les configurations pertinentes :

  • Paramètres d'échantillonnage (temperature, top_p)
  • Longueur du contexte (deployment.extra_args: "--max-model-len <value>")
  • Paramètres TP/DP (pour les définir correctement, demande à l'utilisateur avec AskUserQuestion combien de GPUs le modèle sera déployé)
  • Config reasoning (si applicable) :
    • reasoning activé/désactivé : utilise soit :
      • adapter_config.custom_system_prompt (comme /think, /no_think) et aucun adapter_config.params_to_add (laisse params_to_add non liés à reasoning inchangés)
      • adapter_config.params_to_add pour le modificateur de payload (comme "chat_template_kwargs": {"enable_thinking": true/false}) et aucun adapter_config.custom_system_prompt et adapter_config.use_system_prompt: false (laisse custom_system_prompt et use_system_prompt non liés à reasoning inchangés).
    • Si une task override contient {"chat_template_kwargs": {"enable_thinking": false}, "skip_special_tokens": false}, remplace-la par le payload spécifique au modèle de la carte du modèle qui désactive reasoning.
    • Pour les modèles purement chat, supprime complètement adapter_config.params_to_add si la carte du modèle ne définit pas un toggle reasoning.
    • reasoning effort (si c'est configurable, demande à l'utilisateur avec AskUserQuestion quel reasoning effort ils veulent)
    • plus grand max_new_tokens
    • etc.
  • extra_args spécifiques au déploiement pour vLLM/SGLang (cherche la commande de déploiement vLLM/SGLang)
  • Versions vLLM/SGLang spécifiques au déploiement (par défaut nous utilisons les dernières images docker, mais tu peux les contrôler avec deployment.image ex. vLLM au-dessus de vllm/vllm-openai:v0.11.0 a arrêté de supporter l'arg rope-scaling utilisé par les modèles Qwen)
  • Compatibilité ARM64 / GPU non-standard : L'image vllm/vllm-openai par défaut supporte uniquement les architectures GPU courantes. Pour les plateformes ARM64 ou les GPUs avec capacités de calcul non-standard (ex. NVIDIA GB10 avec sm_121), utilise les images vLLM NGC à la place :
    • Exemple : deployment.image: nvcr.io/nvidia/vllm:26.01-py3
    • Demande à l'utilisateur avec AskUserQuestion leur architecture GPU si la carte du modèle ne spécifie pas de contraintes de déploiement
  • Exigences tool-calling :
    • Si les benchmarks sélectionnés incluent agentic, tu DOIS configurer tool calling de bout en bout.
    • Pour l'auto-déploiement, extrais les flags/settings tool-calling exacts de la carte du modèle (par exemple flags de parser tool vLLM/SGLang) et applique-les.
    • Pour les endpoints externes, confirme que l'endpoint supporte déjà tool calling avant de procéder.
  • Exigences de préparation (ex. télécharger les parsers reasoning, plugins personnalisés) :
    • Si la carte du modèle nécessite télécharger des fichiers ou exécuter des étapes de setup avant le déploiement ou l'évaluation, utilise deployment.pre_cmd ou evaluation.pre_cmd pour l'exécution non-locale.
    • Dans le script pre_cmd :
      • Utilise curl au lieu de wget car c'est plus largement disponible dans les conteneurs Docker. Exemple : pre_cmd: curl -L -o reasoning_parser.py https://huggingface.co/.../reasoning_parser.py
      • Utilise toujours --no-cache-dir lors de l'installation de paquets Python pour éviter les erreurs de lien cross-device dans les conteneurs Docker (le cache pip et les répertoires temp peuvent être sur des systèmes de fichiers différents). Exemple : pre_cmd: pip3 install --no-cache-dir flash-attn --no-build-isolation
    • Pour l'exécution locale, NE COMPTE PAS sur pre_cmd. Exécute les étapes de préparation toi-même sur l'hôte d'abord, puis monte les fichiers/répertoires résultants dans le conteneur si nécessaire.
    • Exemples de mount court :
      • déploiement : execution.mounts.deployment: {"/absolute/path/to/reasoning_parser.py": "/vllm-workspace/reasoning_parser.py"}
      • évaluation : execution.mounts.evaluation: {"/absolute/path/to/hf_cache": "/root/.cache/huggingface"}
  • Var env :
    • Utilise deployment.env_vars pour les paramètres côté déploiement, evaluation.env_vars pour les paramètres évaluation-large, et evaluation.tasks[].env_vars pour les overrides spécifiques à la tâche.
    • Types de valeur supportés : host:VAR_NAME = lis la valeur de la var env VAR_NAME de l'hôte ; lit:value = utilise la valeur littérale directement ; runtime:VAR_NAME = résous VAR_NAME uniquement à runtime dans l'environnement d'exécution.
  • Toute autre exigence spécifique au modèle

Souviens-toi de vérifier les overrides evaluation.nemo_evaluator_config et evaluation.tasks.*.nemo_evaluator_config aussi pour les paramètres à ajuster (ex. désactiver reasoning) !

Présente les découvertes, explique chaque paramètre, demande à l'utilisateur de confirmer ou ajuster. Si aucune carte du modèle trouvée, demande à l'utilisateur directement les configurations ci-dessus.

Étape 4 : Remplir les valeurs manquantes restantes

  • Trouve tous les ??? valeurs manquantes restantes dans la config.
  • Demande à l'utilisateur uniquement les valeurs qui n'ont pas pu être auto-découvertes de la carte du modèle (ex. hostname SLURM, compte, répertoire output, MLflow/wandb tracking URI). Ne propose aucune valeur par défaut ici. Laisse l'utilisateur te donner les valeurs en texte simple.
  • Demande à l'utilisateur s'il veut changer d'autres paramètres par défaut ex. partition d'exécution ou walltime (si exécution sur SLURM) ou ajouter des tags MLflow/wandb (si auto-export activé).

Étape 5 : Confirmer les tâches (itératif)

Affiche les tâches de la config actuelle. Boucle jusqu'à ce que l'utilisateur confirme que la liste des tâches est finale :

  1. Dis à l'utilisateur : « Exécute nel ls tasks pour voir toutes les tâches disponibles ».
  2. Demande s'il veut ajouter/supprimer des tâches ou ajouter/supprimer/modifier des overrides de paramètres spécifiques à la tâche. Pour ajouter par-task nemo_evaluator_config comme spécifié par l'utilisateur, ex. :
    tasks:
      - name: <task>
        nemo_evaluator_config:
          config:
            params:
              temperature: <value>
              max_new_tokens: <value>
              ...
  3. Applique les changements.
  4. Affiche la liste mise à jour et demande : « La liste des tâches est-elle finale, ou veux-tu faire d'autres changements ? »

Étape 6 : Avancé - Multi-nœud

Il y a deux patterns multi-nœud. Demande à l'utilisateur lequel s'applique :

Pattern A : Multi-instance (instances indépendantes avec HAProxy)

Uniquement si modèle >120B paramètres ou utilisateur veut plus de débit. Explique : « Chaque nœud exécute une instance de déploiement indépendante. HAProxy équilibre la charge des requêtes entre toutes les instances. »

execution:
    num_nodes: 4       # Nœuds totaux
    num_instances: 4   # 4 instances indépendantes → HAProxy auto-activé

Pattern B : Multi-nœud instance unique (Ray TP/PP entre nœuds)

Quand un seul modèle est trop gros pour un nœud et nécessite pipeline parallelism entre nœuds. Utilise config déploiement vllm_ray :

defaults:
  - deployment: vllm_ray   # Setup cluster Ray intégré (remplace pre_cmd manuel)

execution:
    num_nodes: 2           # Instance unique couvrant 2 nœuds

deployment:
    tensor_parallel_size: 8
    pipeline_parallel_size: 2

Pattern A+B combiné : Multi-instance avec instances multi-nœud

Pour les très gros modèles nécessitant à la fois cross-node parallelism ET plusieurs instances :

defaults:
  - deployment: vllm_ray

execution:
    num_nodes: 4       # Nœuds totaux
    num_instances: 2   # 2 instances de 2 nœuds chacune → HAProxy auto-activé

deployment:
    tensor_parallel_size: 8
    pipeline_parallel_size: 2

Conseils de performance multi-nœud

  • Pour les déploiements multi-nœud, ajoute switches: 1 à execution.sbatch_extra_flags pour instruire SLURM d'allouer tous les nœuds sur le même commutateur réseau, réduisant la latence de communication inter-nœud :
    execution:
      sbatch_extra_flags:
        switches: 1

Confusions courantes

  • num_instances contrôle les instances de déploiement indépendantes avec HAProxy. data_parallel_size contrôle les replicas DP au sein d'une instance unique.
  • Le data parallelism global est num_instances x data_parallel_size (ex. 2 instances x 8 DP chacune = 16 replicas).
  • Avec multi-instance, parallelism dans la config task est le total des requêtes concurrentes entre toutes les instances, pas par-instance.
  • num_nodes doit être divisible par num_instances.

Étape 7 : Avancé - Interceptors

  • Dis à l'utilisateur qu'il devrait voir : https://docs.nvidia.com/nemo/evaluator/latest/libraries/nemo-evaluator/interceptors/index.html .
  • NE FOURNIS AUCUNE information générale sur ce que les interceptors font typiquement dans les frameworks API sans lire les docs. Si l'utilisateur te pose des questions sur les interceptors, lis uniquement la page web pour fournir des informations précises.
  • Si l'utilisateur te demande de configurer un interceptor, lis la page web de cet interceptor et configure-le selon la syntaxe --overrides mais mets les valeurs dans la config YAML sous evaluation.nemo_evaluator_config.config.target.api_endpoint.adapter_config (PAS sous target.api_endpoint.adapter_config) au lieu d'utiliser des overrides CLI. En définissant une liste interceptors tu remplacerais la chaîne complète d'interceptors qui peut avoir des conséquences non intentionnelles comme désactiver les interceptors par défaut. C'est pourquoi utilise les champs spécifiés dans la section CLI Configuration après le mot-clé --overrides pour configurer les interceptors dans la config YAML.

Errata de documentation

  • Les docs peuvent afficher des noms de paramètres incorrects pour le logging. Utilise max_logged_requests et max_logged_responses (PAS max_saved_* ou max_*).

Étape 8 : Exécuter l'évaluation

Imprime les commandes suivantes à l'utilisateur. Propose d'les exécuter dans l'ordre pour confirmer que la config fonctionne comme prévu avant la full run.

Important : Assure les variables d'environnement requises sont disponibles. Demande à l'utilisateur de fournir HF_TOKEN, même s'ils n'utilisent pas un modèle gated (comme Llama) ou un dataset (comme GPQA), pour réduire les erreurs de rate limiting Hugging Face. Rappelle à l'utilisateur d'obtenir l'accès à GPQA, si c'est dans la config (« S'il te plaît, clique request access pour GPQA-Diamond : https://huggingface.co/datasets/Idavidrein/gpqa »), et demande-leur de mettre les tokens ou clés manquants (ex. HF_TOKEN, NVIDIA_API_KEY, api_key_name de la config) dans un fichier .env à la racine du projet. NEL lit automatiquement .env — pas besoin de le sourcer manuellement.

# Si utilisant pre_cmd ou post_cmd :
export NEMO_EVALUATOR_TRUST_PRE_CMD=1
  1. Dry-run (valide la config sans l'exécuter) :

    nel run --config <config_path> --dry-run
  2. Test avec samples limités (quick validation run) :

    nel run --config <config_path> -o ++evaluation.nemo_evaluator_config.config.params.limit_samples=10

    Pour les déploiements multi-instance, scale down aussi à une instance unique pour valider le déploiement plus vite :

    nel run --config <config_path> \
      -o execution.num_nodes=1 \
      -o execution.num_instances=1 \
      -o evaluation.nemo_evaluator_config.config.params.parallelism=5 \
      -o ++evaluation.nemo_evaluator_config.config.params.limit_samples=10

    Ajuste num_nodes pour correspondre au nombre de nœuds qu'une instance de modèle unique a besoin (ex. 2 pour un modèle nécessitant 2-node Ray TP).

  3. Relancer une tâche unique (utile pour debug ou re-test après changements de config) :

    nel run --config <config_path> -t <task_name>

    Combine avec -o pour samples limités : nel run --config <config_path> -t <task_name> -o ++evaluation.nemo_evaluator_config.config.params.limit_samples=10

  4. Évaluation complète (production run) :

    nel run --config <config_path>

Après le dry-run, vérifie la sortie de nel pour tous les problèmes avec la config. S'il n'y a pas de problèmes, propose d'abord d'exécuter la test run avec samples limités puis d'exécuter l'évaluation complète. S'il y a des problèmes, résous-les avant d'exécuter l'évaluation complète.

Suivi de la progression

Après la soumission du job, tu peux suivre la progression en utilisant :

  1. Vérifier le statut du job :

    nel status <invocation_id>
    nel info <invocation_id>
  2. Stream les logs (Exécution locale uniquement) :

    nel logs <invocation_id>

    Note : nel logs n'est pas supporté pour l'exécution SLURM.

  3. Inspecter les logs via SSH (SLURM workaround) :

    Quand nel logs n'est pas disponible (SLURM), utilise SSH pour inspecter les logs directement :

    D'abord, obtiens les emplacements des logs :

    nel info <invocation_id> --logs

    Puis, utilise SSH pour voir les logs :

    Vérifier les logs de déploiement du serveur :

    ssh <username>@<hostname> "tail -100 <log path from `nel info <invocation_id> --logs`>/server-<slurm_job_id>-*.log"

    Affiche le démarrage du serveur vLLM, chargement du modèle, et erreurs de déploiement (ex. wget/curl manquant).

    Vérifier les logs du client d'évaluation :

    ssh <username>@<hostname> "tail -100 <log path from `nel info <invocation_id> --logs`>/client-<slurm_job_id>.log"

    Affiche la progression de l'évaluation, exécution des tâches, et résultats.

    Vérifier les logs du scheduler SLURM :

    ssh <username>@<hostname> "tail -100 <log path from `nel info <invocation_id> --logs`>/slurm-<slurm_job_id>.log"

    Affiche la planification des jobs, health checks, et flux d'exécution global.

    Chercher les erreurs :

    ssh <username>@<hostname> "grep -i 'error\|warning\|failed' <log path from `nel info <invocation_id> --logs`>/*.log"

Workflow avancé : Pour un suivi de run plus détaillé, debug des évaluations échouées, et analyse post-run, vois le skill launching-evals.


Oriente les utilisateurs ayant des problèmes vers :

À présent, copie cette checklist et suis ta progression :

Config Generation Progress:
- [ ] Étape 1 : Vérifier si nel est installé
- [ ] Étape 2 : Construire le fichier config de base
- [ ] Étape 3 : Configurer le chemin du modèle et les paramètres
- [ ] Étape 4 : Remplir les valeurs manquantes restantes
- [ ] Étape 5 : Confirmer les tâches (itératif)
- [ ] Étape 6 : Avancé - Multi-nœud (Data Parallel)
- [ ] Étape 7 : Avancé - Interceptors
- [ ] Étape 8 : Exécuter l'évaluation

Skills similaires