Skip to content

test(reward): add H20 MPS qualification harness and baseline - #482

Closed
Zcchill wants to merge 5 commits into
mainfrom
benchmark/mps-h20-baseline
Closed

Zcchill wants to merge 5 commits into
mainfrom
benchmark/mps-h20-baseline

Conversation

@Zcchill

@Zcchill Zcchill commented Sep 17, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • extend the existing reward-service load test with batch/concurrency sweeps,
    repetitions, score capture, and a compact JSON summary
  • treat missing, empty, and non-finite reward responses as request failures
  • add dedicated and shared H20 example configs under configs/

This is the benchmark/qualification slice of #463. It does not add production
MPS lifecycle or scheduling behavior. Generated result JSON is not committed.

H20 qualification

Fresh rerun on unirl-v4-8-gpus-gz-0920 (UniRL v4 image): NVIDIA H20 96 GB,
driver 535.247.01; Python 3.12.11; Ray 2.46.0; Torch 2.7.1; Transformers
4.56.0.dev0. Each mode ran CLIP and PickScore at batch sizes 1/4/8 and
concurrency 1/4/16 for 1,620 requests (7,020 items). Mean items/s is the
average of the 27 runs.

  • dedicated, two GPUs: 1,620/1,620 valid; 137.30 items/s
  • fractional Ray without MPS, one GPU: 1,620/1,620 valid; 82.48 items/s;
    +20.1% mean rewards/GPU-hour over dedicated
  • MPS at 100%, one GPU: 1,620/1,620 valid; 97.27 items/s; +17.9% mean raw
    throughput over fractional no-MPS and +41.7% mean rewards/GPU-hour over
    dedicated
  • consolidated control, one GPU: 1,620/1,620 valid; 143.73 items/s; +109.4%
    mean rewards/GPU-hour over dedicated
  • all 81 candidate run-level parity checks among dedicated / no-MPS / MPS
    passed at atol=1e-3; including consolidated, the maximum absolute score
    delta was 4.56e-4

Active-thread limit finding

CUDA_MPS_ACTIVE_THREAD_PERCENTAGE=50 produced non-finite FP16 CLIP scores on
this H20/driver stack, while PickScore FP16 and both scorers in FP32 remained
finite. FP16 CLIP and PickScore both passed at 100%. This report therefore
qualifies the tested recipe only at 100%.

Validation

  • fresh four-mode H20 rerun on unirl-v4-8-gpus-gz-0920: 6,480/6,480
    requests valid
  • PYTHONPATH=. python3 -m pytest tests/test_bench_concurrent.py -q (2 passed)
  • both H20 YAML files pass load_config
  • git diff --check

@github-actions github-actions Bot added the wip Draft / work in progress label Sep 17, 2026
@Zcchill Zcchill changed the title bench(reward): add H20 MPS qualification harness and baseline test(reward): add H20 MPS qualification harness and baseline Sep 18, 2026
@Zcchill
Zcchill force-pushed the benchmark/mps-h20-baseline branch from b4050f8 to 25a216e Compare September 18, 2026 18:17
@Zcchill
Zcchill force-pushed the benchmark/mps-h20-baseline branch from 25a216e to f6ab516 Compare September 19, 2026 19:22
Co-authored-by: Cursor <cursoragent@cursor.com>
@Zcchill
Zcchill force-pushed the benchmark/mps-h20-baseline branch from f6ab516 to 13846a8 Compare September 19, 2026 19:37
Zcchill and others added 3 commits September 22, 2026 15:40
Drop the extra benchmark docs tree and empty env stub. Point the
repro YAMLs at clip/pickscore requirements and leave numbers in the PR.

Co-authored-by: Cursor <cursoragent@cursor.com>
Keep NaN failures, score capture, and batch/repetition sweeps. Remove
environment probes, GPU sampling, and experiment-label flags.

Co-authored-by: Cursor <cursoragent@cursor.com>
NaN/score handling and optional batch-sweep/JSON wrap the existing isolated/sweep/else paths instead of replacing them.

Co-authored-by: Cursor <cursoragent@cursor.com>
@jyizheng

Copy link
Copy Markdown

Ran the checked-in recipe on one B300 (driver 580.105, torch 2.14+cu130, transformers 4.57.6), same sweep, 1620/1620 valid in every mode:

mode GPUs items/s rewards/GPU-h vs dedicated
dedicated 2 127.5
fractional, no MPS 1 122.2 (-4%) +92%
fractional, MPS 100% 1 124.9 (-2%) +96%

GPUs sit at 12% busy in the dedicated layout, so this panel is CPU/HTTP-bound here and colocation is nearly free; the H20 numbers are a GPU-bound regime. Worth stating which regime applies before quoting the multiplier.

Two things to flag before the next rerun:

  1. Both actors load PickScore_v1, so clip is the PickScore backbone with a different divisor, and the consolidated control is the expected ~2x from halving the work. Pointing clip at openai/clip-vit-large-patch14 would make it a real two-backbone panel.
  2. The fp16 CLIP NaN at active-thread 50% does not reproduce on B300: 32 combos (PickScore_v1 / CLIP-L-14 × fp16 / fp32 × off / 100 / 50 / 25), all finite, values identical to 5 decimals. It looks specific to the H20 / driver 535 / torch 2.7.1 stack rather than to MPS partitioning. Happy to share the probe script.

Also: the PR body still cites the consolidated arm, 81 parity checks and atol 1e-3, but that tooling and the report file were removed in the last two pushes.

Match the existing scripts/test_videoalign.py layout instead of introducing a tests/ directory that main does not have.

Co-authored-by: Cursor <cursoragent@cursor.com>
@Zcchill

Zcchill commented Sep 23, 2026

Copy link
Copy Markdown
Collaborator Author

Superseded by #492. The benchmark commits are already in #492's branch history; #492 is being retargeted to main so implementation and qualification can be reviewed together.

@Zcchill Zcchill closed this Sep 23, 2026
@github-actions github-actions Bot removed the wip Draft / work in progress label Sep 23, 2026
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.

2 participants