Skip to content

Modularity-eval support: pipeline-parallel GPU planning, namespaced dataset ids, launcher runtime hooks - #558

Merged
AkshitaB merged 10 commits into
mainfrom
akshitab/modularity-evals
Nov 12, 2026
Merged

AkshitaB merged 10 commits into
mainfrom
akshitab/modularity-evals

Conversation

@AkshitaB

Copy link
Copy Markdown
Collaborator

Summary

Everything the scaling-ladders modularity evals (ladders/olmoe3/workloads/evals/modularity_full) need from olmo-eval, on top of current main. It replaces the pins to ryanyxw/ladder-evals and akshitab/ladder-eval-runtime-fixes; Jackson's long-context task commits on those branches are not needed here and are left out.

  • Namespaced dataset ids for GSM8K, CSQA, PIQA, SocialIQA, WinoGrande and HumanEval (openai/gsm8k, tau/commonsense_qa, …). With current huggingface_hub, load_dataset("gsm8k", "main") fails from an empty cache ("Repository id must be 'namespace/name'"); it only works where an older cache already holds the dataset. The namespaced ids load with the same row counts. The data source is part of a task's identity, so the recorded hashes of the tasks reading these datasets change (task_hashes.json regenerated with --update-task-hashes; 60 entries).
  • Pipeline parallelism: an instance spans tensor_parallel_size × pipeline_parallel_size GPUs, in the GPU planner and in the Beaker GPU request, and each inference worker gives its engine tensor_parallel_size = GPUs / pipeline_parallel_size (it used the worker's GPU count, so a 4-GPU pipeline-parallel worker asked for TP 4 too). Needed to run a model larger than one GPU with provider.kwargs.pipeline_parallel_size (the OLMoE3 vLLM plugin supports PP, not TP).
  • Beaker launcher runtime hooks (Ryan's): OLMO_EVAL_RUNTIME_TORCH_EXTRA_PACKAGES installs torchvision/torchaudio builds with a runtime Torch override (cu130 on B300), and OLMO_EVAL_RUNTIME_POST_INSTALL_CMD runs a snippet after all installs.
  • Provider package index: with OLMO_EVAL_RUNTIME_TORCH_INDEX_URL set, provider packages resolve build dependencies from PyPI with the Torch index as an extra index, not as their only one.

Test plan

  • pytest tests --ignore=tests/integration: 5289 passed, 8 failed; the same 8 fail on main (test_sandbox_manager_capacity, test_check_file_sizes).
  • Each renamed dataset id loads from an empty HF cache with the expected row count.
  • End to end through scaling-ladders' modularity evals on Beaker: a 4-GPU pipeline-parallel worker gets GPUs [0, 1, 2, 3] with TP 1 / PP 4 (small hero on H100s, 24/24 items).
  • scaling-ladders' modularity tasks (5 GSM8K variants, 34 MMLU-by-category tasks) format byte-identical requests and sampling parameters on this branch and on the previous pin.

🤖 Generated with Claude Code

@AkshitaB
AkshitaB requested a review from a team as a code owner November 11, 2026 07:12

@gregorybchris gregorybchris left a comment

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.

Approved, with the two inline findings below to address and resolve before merging. Review validation: 191 focused tests passed; auxiliary GPU allocation was checked with mocked server startup. Lint reports three added long lines, and formatting needs correction. No real-model run was performed.

Comment thread src/olmo_eval/inference/gpu_planner.py Resolved
Comment thread src/olmo_eval/evals/tasks/gsm8k.py Resolved
@AkshitaB
AkshitaB force-pushed the akshitab/modularity-evals branch from 85fd598 to 52726c0 Compare November 12, 2026 20:04
Akshita Bhagia and others added 10 commits November 12, 2026 13:04
…the runtime Torch index as an extra index

With OLMO_EVAL_RUNTIME_TORCH_INDEX_URL set, provider packages (e.g. a vLLM plugin from git) got the Torch
index as their only extra index, so their build dependencies resolved from it. Keep PyPI as the index and the
Torch index as an extra one.

(cherry picked from the launcher part of commit f952402)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…hvision/torchaudio builds alongside the runtime torch override (needed for cu130 on B300)

(cherry picked from commit 0454c66)
…e install command

The extra-packages loop added in 0454c66 never ran because the variable was not in
install_env_keys, so cu130 code jobs still hit the torchvision 0.26 vs 0.25 conflict.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UM8JNSHVcWs1Ja8n3bNvzx
(cherry picked from commit 8eb693a)
…pet after all package installs

Per-package installs can leave split dependency packages at mixed versions (nvidia-cutlass-dsl 4.8.1
libs next to a 4.5.3 pin); a post-install step lets the caller re-pin them consistently.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UM8JNSHVcWs1Ja8n3bNvzx
(cherry picked from commit a04b3ba)
…arallel_size GPUs

The planner and the Beaker GPU request counted only tensor_parallel_size, so a pipeline-parallel provider
(provider.kwargs.pipeline_parallel_size) got one stage's worth of GPUs. Count TP x PP for the main provider
and for auxiliary providers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…IQA, WinoGrande and HumanEval

With current huggingface_hub, the legacy un-namespaced ids no longer resolve from an empty cache
(load_dataset("gsm8k", "main") raises "Repository id must be 'namespace/name'"); they only worked
where an older cache already held them. The namespaced ids (openai/gsm8k, tau/commonsense_qa,
ybisk/piqa, allenai/social_i_qa, allenai/winogrande, openai/openai_humaneval) load from an empty
cache with the same row counts.

The data source is part of a task's identity, so the recorded task hashes of the tasks that read
these datasets change (tests/evals/tasks/task_hashes.json, regenerated with --update-task-hashes).

(dataset part of commit f952402)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…by pipeline_parallel_size

The worker set tensor_parallel_size to its GPU count, so a pipeline-parallel instance (4 GPUs,
pipeline_parallel_size 4) asked for tensor parallel 4 as well.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…x pipeline_parallel_size GPUs

The planner reserved TP x PP GPUs per auxiliary instance, but InferenceManager.start() handed each
server only TP of them, and VLLMServerProcess took its tensor_parallel_size from len(gpu_ids). Two
judge instances with TP 2 and PP 2 got GPUs [0, 1] and [2, 3] and could not start. The manager now
gives each instance gpus_per_instance() GPUs, and VLLMServerProcess divides its GPUs by
pipeline_parallel_size (tensor_parallel_for, moved to gpu_planner next to gpus_per_instance).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@AkshitaB
AkshitaB force-pushed the akshitab/modularity-evals branch from 52726c0 to b126d85 Compare November 12, 2026 21:11
@AkshitaB
AkshitaB enabled auto-merge November 12, 2026 21:24
@AkshitaB
AkshitaB added this pull request to the merge queue Nov 12, 2026
Merged via the queue into main with commit 0483438 Nov 12, 2026
8 checks passed
@AkshitaB
AkshitaB deleted the akshitab/modularity-evals branch November 12, 2026 21:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants