launching-evals
par nvidia
Run, monitor, analyze, and debug LLM evaluations via nemo-evaluator-launcher. Covers running evaluations, checking status and live progress, debugging failed…
npx skills add https://github.com/nvidia/model-optimizer --skill launching-evalsNeMo Evaluator Skill
Quick Reference
nemo-evaluator-launcher CLI
# Run evaluation
uv run nemo-evaluator-launcher run --config <path.yaml>
uv run nemo-evaluator-launcher run --config <path.yaml> -t <a_single_task_to_be_run_by_name>
uv run nemo-evaluator-launcher run --config <path.yaml> -t <task_name_1> -t <task_name_2> ...
uv run nemo-evaluator-launcher run --config <path.yaml> -o evaluation.nemo_evaluator_config.config.params.limit_samples=10 ...
# Preview the resolved config and the sbatch script without running the evaluation
uv run nemo-evaluator-launcher run --config <path.yaml> --dry-run
# Check status (--json for machine-readable output)
uv run nemo-evaluator-launcher status <invocation_id> --json
# Get evaluation run info (output paths, slurm job IDs, cluster hostname, etc.)
uv run nemo-evaluator-launcher info <invocation_id>
# Copy just the logs (quick — good for debugging)
uv run nemo-evaluator-launcher info <invocation_id> --copy-logs ./evaluation-results/
# For artifacts: use `nel info` to discover paths. If remote, SSH to explore and rsync what you need.
# If local, just read directly from the paths shown by `nel info`.
# ssh <user>@<hostname> "ls <artifacts_path>/"
# rsync -avzP <user>@<hostname>:<artifacts_path>/{results.yml,eval_factory_metrics.json,config.yml} ./evaluation-results/<invocation_id>.<job_index>/artifacts/
# Resume a failed/interrupted run (re-sbatches existing run.sub in the original run directory)
uv run nemo-evaluator-launcher resume <invocation_id>
# List past runs
uv run nemo-evaluator-launcher ls runs --since 1d
# List available evaluation tasks (by default, only shows tasks from the latest released containers)
uv run nemo-evaluator-launcher ls tasks
uv run nemo-evaluator-launcher ls tasks --from_container nvcr.io/nvidia/eval-factory/simple-evals:26.03
Workflow
The complete evaluation workflow is divided into the following steps you should follow IN ORDER.
- Create or modify a config using the
nel-assistantskill. If the user provides a past run, use itsconfig.ymlartifact as a starting point. - Run the evaluation. See
references/run-evaluation.mdwhen executing this step. - Monitor progress (MANDATORY after every
nel run): poll status repeatedly until SUCCESS/FAILED. Seereferences/check-progress.md. - Post-run actions (when terminal state reached):
- When the evaluation status is
SUCCESS, analyze the results. Seereferences/analyze-results.mdwhen executing this step. - When the evaluation status is
FAILED, debug the failed run. Seereferences/debug-failed-runs.mdwhen executing this step.
- When the evaluation status is
Key Facts
- Benchmark-specific info learned during launching/analyzing evals should be added to
references/benchmarks/ - PPP = Slurm account / project portfolio code (the
accountfield in cluster_config.yaml). When the user says "change PPP to X", update the account value (e.g.,<old_account>→<new_account>). - Slurm job pairs: NEL (nemo-evaluator-launcher) submits paired Slurm jobs — a RUNNING job + a PENDING restart job (for when the 4h walltime expires). Never cancel the pending restart jobs — they are expected and necessary.
- HF cache requirement: For configs with
HF_HUB_OFFLINE=1, models must be pre-downloaded to the HF cache on each cluster before launching. Before running a model on a new cluster, always ask the user if the model is already cached there. If not, on the cluster login node:python3 -m venv hf_cli && source hf_cli/bin/activate && pip install huggingface_hubthenHF_HOME=<your_hf_cache_path> hf download <model>(on lustre-style HPC clusters this is typically under/lustre/.../<group>/users/<username>/cache/huggingface). Without this, vLLM will fail withLocalEntryNotFoundError. data_parallel_sizeis per node:dp_size=1withnum_nodes=8means 8 model instances total (one per node), load-balanced by haproxy. Do NOT interpretdp_sizeas the global replica count.payload_modifierinterceptor: Theparams_to_removelist (e.g.[max_tokens, max_completion_tokens]) strips those fields from the outgoing payload, intentionally lifting output length limits so reasoning models can think as long as they need.- Auto-export git workaround: The export container (
python:3.12-slim) lacksgit. When installing the launcher from a git URL, setauto_export.launcher_install_cmdto install git first (e.g.,apt-get update -qq && apt-get install -qq -y git && pip install "nemo-evaluator-launcher[all] @ git+...#subdirectory=packages/nemo-evaluator-launcher"). - Do NOT use
nemo-evaluator-launcher export --dest local— it only writes a summary JSON (processed_results.json), it does NOT copy actual logs or artifacts despite accepting--copy_logsand--copy-artifactsflags.nel info --copy-artifactsworks but copies everything (very slow for large benchmarks). Preferred approach: usenel infoto discover paths — if local, read directly; if remote, SSH to explore and rsync only what you need. Note thatnel infoprints standard artifacts but benchmarks produce additional artifacts in subdirs — explore to find them.