Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion plugins/modelopt/skills/evaluation/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,9 @@ GDPVal:
unsandboxed. Verify with `gdpval-sif.sh --check`. `.env` needs `HF_TOKEN`, `INFERENCE_API_KEY`, `TAVILY_API_KEY`,
`INFERENCE_JUDGE_URL`, `GDPVAL_SIF_DIR`, and `NEMO_EVALUATOR_TRUST_PRE_CMD=1` (the
config has a `pre_cmd`). Thinking mode is mandatory (non-thinking loses ~86%).
4. Dry-run → launch. **`limit_samples` is inert on the gym path** (the gym runs all
4. Run both dry-run and launch through `"$SKILL_DIR/scripts/nel-gdpval.sh"`; it pins
the required 0.2.6 launcher and avoids older launchers' unset
`NEL_INVOCATION_ID` failure. **`limit_samples` is inert on the gym path** (the gym runs all
220 tasks regardless), so there is no cheap canary: watch the real run's first
~20–30 min for the SIF-sandbox line and judge auth, and cancel if wrong. See the
recipe's Canary section.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,8 @@ evaluation:
# deliverables are NOT auto-uploaded — they stay on disk for inspection.
# Drop "_cache" if you WANT them uploaded as artifacts.
PERSIST_DELIVERABLES_DIR: lit:/results/gdpval/deliverables_cache
# Requires launcher 0.2.6 via $SKILL_DIR/scripts/nel-gdpval.sh. That launcher
# assigns this stable ID before the runtime re-export (including across resumes).
NEL_INVOCATION_ID: runtime:NEL_INVOCATION_ID
# Installs apptainer + squashfuse into the eval container (needs
# NEMO_EVALUATOR_TRUST_PRE_CMD=1 in the launching shell). See references/gym-gdpval.md.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ in the suite — **220 tasks**, `num_repeats=1`, 4 judge trials per rollout.
It runs on the **0.2.6 `nel` launcher** as a `nemo_gym` task (NOT nel-next), so
Steps 1–9 apply — but with the branch differences below.

Run it through `"$SKILL_DIR/scripts/nel-gdpval.sh"`, which pins the launcher to
0.2.6. Do not use an unversioned `nel` from PATH: older launchers fail before client
startup when the config forwards `NEL_INVOCATION_ID`. The shared reference explains
the failure signature and dry-run check.

## What makes GDPVal different (not a normal `aa/` task)

- **Standalone** — one gym eval per config. Never add GDPVal to a multi-task
Expand Down
18 changes: 17 additions & 1 deletion plugins/modelopt/skills/evaluation/references/gym-gdpval.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,22 @@ run **inline in the eval container** (`install_on_the_fly`) via `ng_prepare_benc
is `recipes/examples/gym_gdpval/` and the per-task pointer is
`recipes/tasks/aa_gym/gdpval.md`.

Always invoke GDPVal through the pinned wrapper, even if `nel` is already on PATH:

```bash
"$SKILL_DIR/scripts/nel-gdpval.sh" --version # must report nemo_evaluator_launcher: 0.2.6
"$SKILL_DIR/scripts/nel-gdpval.sh" run --config <gdpval-config.yaml> --dry-run
"$SKILL_DIR/scripts/nel-gdpval.sh" run --config <gdpval-config.yaml>
```

This is a correctness requirement, not only a dependency pin. Launcher 0.2.6 writes
the generated `NEL_INVOCATION_ID` into `run.sub` before environment-variable
re-exports. Older launchers can emit `export NEL_INVOCATION_ID="${NEL_INVOCATION_ID}"`
without first assigning it, then exit with `NEL_INVOCATION_ID: unbound variable`
under `set -u` before the evaluation client starts. In a dry-run, verify that a
literal assignment appears before the re-export; do not substitute `SLURM_JOB_ID`,
because it changes across the benchmark's walltime-resume chain.

## Where each piece runs

| Component | Where |
Expand Down Expand Up @@ -184,7 +200,7 @@ mount source, and `raise ValueError` listing the missing ones **before** any
| `GDPVAL_REF_FILES_DIR` | lit:/gdpval_ref_files | shared-FS ref-file staging (node-local /tmp breaks multi-node Ray) |
| `PERSIST_DELIVERABLES_DIR` | lit | where deliverables persist (see MLflow note) |
| `GDPVAL_MAX_TURNS` | lit (optional) | Stirrup turn cap (default 100; golden uses 250) |
| `NEL_INVOCATION_ID` | runtime | run id |
| `NEL_INVOCATION_ID` | runtime | stable run id assigned by launcher 0.2.6; do not use `SLURM_JOB_ID` |

`INFERENCE_JUDGE_URL` is the judge host — config (from `.env`), substituted as the
literal `<INFERENCE_JUDGE_URL>` placeholder in `gdpval_judge.base_url`, **not**
Expand Down
37 changes: 37 additions & 0 deletions plugins/modelopt/skills/evaluation/scripts/nel-gdpval.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
#!/usr/bin/env bash
# SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# GDPVal requires launcher 0.2.6. In particular, 0.2.6 assigns the generated
# NEL_INVOCATION_ID in run.sub before evaluation.env_vars re-exports it. Older
# launchers can instead fail under `set -u` before the evaluation client starts.
set -euo pipefail

NEL_GDPVAL_SPEC="${NEL_GDPVAL_SPEC:-nemo-evaluator-launcher[all]==0.2.6}"

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bot comment.

The wrapper and docs promise that GDPVal is pinned to 0.2.6 for correctness, but this ambient-env override silently defeats that guarantee. In particular, set -a; source .env is part of the documented run flow, so a stale NEL_GDPVAL_SPEC can select exactly the older launcher that produces the unbound-variable failure. Unlike the documented escape hatch in nel-next.sh, there does not seem to be a valid compatibility path here because the generated-script behavior specifically requires 0.2.6. Please hard-code the spec (ideally readonly), or reject anything that is not the exact required release. Please also cover this with a shell test using a stub uvx, including a conflicting ambient value, since the exact pin is the core behavior of this fix.


case "${1:-}" in
-h|--help)
echo "usage: nel-gdpval.sh <nel arguments>"
echo " nel-gdpval.sh --version"
exit 0
;;
esac

command -v uvx >/dev/null 2>&1 || {
echo "ERROR: 'uvx' is required to run the pinned GDPVal launcher" >&2
exit 1
}

exec uvx --python 3.10 --from "$NEL_GDPVAL_SPEC" nel "$@"