Repository navigation
Add imo_proofbench benchmark and imo_proofbench_judge resource server - #1230
Merged
bxyu-nvidia merged 3 commits intoMay 8, 2026
Merged
bxyu-nvidia merged 3 commits into
bxyu-nvidia merged 3 commits into
Conversation
Migrates the IMO ProofBench benchmark (60 IMO-style proof problems from
google-deepmind/superhuman/imobench/proofbench.csv, pinned to commit
c1ee02e0) from NeMo Skills into Gym. Verification mirrors Skills'
MathEvaluator.eval_single + LLMMathJudgeTask byte-for-byte: boxed-content
extraction (search_boxed), sympy-based symbolic equivalence (math_equal
via math_verify + latex2sympy2_extended), prefill_judgement literal-match
shortcut, and a strong LLM judge (Gemini-2.5-Pro by default) using the
IMO 0-7 rubric prompt byte-identical to
nemo_skills/prompt/config/judge/imo_proofbench.yaml. Headline metric
any_correct = symbolic_correct OR judge_correct matches Skills'
MathMetrics.
Includes:
- benchmarks/imo_proofbench/: data preparation, model prompt template,
README. prepare.py downloads the pinned proofbench.csv and writes
60 rows to data/imo_proofbench_benchmark.jsonl.
- resources_servers/imo_proofbench_judge/: full LLM-judge verifier with:
* search_boxed (rightmost \boxed{...} brace-balanced extraction,
mirroring nemo_skills.evaluation.math_grader.search_boxed)
* parse_judgement_verdict with Skills' 3-format priority
(Judgement: Yes/No -> \boxed{Correct/Incorrect} ->
<points>N out of 7</points> with N >= PASS_THRESHOLD)
* math_equal (MCQ short-circuit, latex2sympy2_extended normalisation,
math_verify symbolic fallback) so symbolic_correct is computed
independently of the LLM judge, matching Skills'
MathEvaluator.eval_single
* verify() flow: extracts boxed; if symbolic-correct, synthesises
"Reasoning: The two answers are identical. Judgement: Yes" and
skips the judge; on no extraction, synthesises "Reasoning: No
answer was provided. Judgement: No"; otherwise calls Gemini with
the boxed content as {predicted_answer} and parses with the
3-format priority
* compute_metrics() exposes pass@k/{any,symbolic,judge}_correct
plus per-category and per-level subset breakdowns
* 76 unit tests, 98% coverage
* data/example.jsonl (5 rows), example_metrics.json, and
example_rollouts.jsonl (5 sample rollouts)
* Default-null judge_base_url/judge_api_key/judge_model_name keys at
config end so ng_prepare_benchmark resolves OmegaConf interpolations
without needing a judge endpoint
Skills parity validated end-to-end on
nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-BF16 (60 problems x 16 seeds
= 960 rollouts/side):
pass@1/symbolic_correct Skills 6.35% Gym 6.25% delta -0.10 pp
pass@1/any_correct Skills 6.46% Gym 6.25% delta -0.21 pp
pass@1/judge_correct Skills 1.25% Gym 1.46% delta +0.21 pp
pass@16/any_correct Skills 16.67% Gym 13.33% delta -3.34 pp
Distinct problems with prefill hits Skills 9 Gym 8
Same model, same vLLM container (nemo-skills-vllm-audio-eval-v1, vLLM
0.18.1), same chat template (90 input tokens), same sampling params,
same judge prompt. The model produces near-identical boxed answers in
both pipelines; once Gym's verifier runs the same math_equal Skills
does, the headline metric is identical to within sampling noise.
Residual delta is consistent with vLLM's known non-determinism at
TP > 1 across batching / topology, plus finite-sample noise on a
60-problem benchmark.
Headline READMEs and the judge endpoint references point at
integrate.api.nvidia.com (NVIDIA's public Gemini gateway) and
generativelanguage.googleapis.com (Google's direct public API).
Signed-off-by: gwarmstrong <gwarmstrong@users.noreply.github.com>
…mo-proofbench Signed-off-by: gwarmstrong <gwarmstrong@users.noreply.github.com> # Conflicts: # README.md
…mo-proofbench-fixmerge Signed-off-by: gwarmstrong <gwarmstrong@users.noreply.github.com> # Conflicts: # README.md
bxyu-nvidia
approved these changes
May 8, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Add imo_proofbench benchmark and imo_proofbench_judge resource server
Summary
Migrates the IMO ProofBench benchmark from
NeMo Skills into Gym. Verification is a strong LLM judge
plus sympy-based symbolic equivalence, mirroring
Skills'
eval_type=mathchained withprompt_config=judge/imo_proofbench.The new
imo_proofbench_judgeresource server vendors Skills' boxed-extraction (
search_boxed), the 3-format judgement parser(
is_correct_judgement), theprefill_judgementliteral-matchshortcut, and
math_equal(sympy viamath_verify+latex2sympy2_extended) — so the headlineany_correct = symbolic_correct OR judge_correctmatches Skills.Includes
benchmarks/imo_proofbench/— benchmark configuration, datapreparation, and the model prompt template.
config.yaml— registersimo_proofbench_judge_simple_agent,points at the prepared JSONL, declares a Gemini judge model server
via
judge_base_url/judge_api_key/judge_model_name.prepare.py— pullsimobench/proofbench.csvresources_servers/imo_proofbench_judge/— Skills-parity verifier.app.py— vendors:search_boxed(rightmost\boxed{…}brace-balanced extraction,mirroring
nemo_skills.evaluation.math_grader.search_boxed)parse_judgement_verdictwith Skills' 3-format priority(
Judgement: Yes/No→\boxed{Correct/Incorrect}→<points>N out of 7</points>withpoints >= PASS_THRESHOLD)parse_pointsfor the score-band metricsmath_equal(MCQ short-circuit,latex2sympy2_extendednormalization,
math_verifysymbolic fallback) so Gym'ssymbolic_correctis computed independently of the LLM judge,matching Skills'
MathEvaluator.eval_singlestepverify()— extracts boxed, runsmath_equalfirst; ifsymbolic-correct, synthesises
Reasoning: The two answers are identical.\nJudgement: Yesand skips the judge; on noextraction, synthesises
Reasoning: No answer was provided.\n Judgement: No; otherwise calls Gemini with the boxed contentfilling
{predicted_answer}and parses with the 3-formatpriority.
_score_fnexposesany_correct,symbolic_correct,judge_correct, andjudge_score_{0,1,6,7}forcompute_pass_majority_metrics;compute_metricsaddscategory/levelsubset breakdowns.Skills-parity validation
End-to-end parity numbers
Final 16-seed run on
nvidia/NVIDIA-Nemotron-3-Super-120B-A12B-BF16(960 rollouts per pipeline):
any_correctsymbolic_correctjudge_correctany_correctThe model produces near-identical boxed answers in both pipelines —
once the verifier runs the same
math_equalSkills does, the headlinemetric is identical to within sampling noise.