Skip to content

bench(rocmfpx): exploratory bench results + tooling fixes#1072

Merged
thinmintdev merged 4 commits into
mainfrom
claude/llamacpp-strix-halo-flags-cyzyo8
Jul 5, 2026
Merged

bench(rocmfpx): exploratory bench results + tooling fixes#1072
thinmintdev merged 4 commits into
mainfrom
claude/llamacpp-strix-halo-flags-cyzyo8

Conversation

@thinmintdev

Copy link
Copy Markdown
Contributor

Lands the on-box ROCmFPX exploratory bench results and fixes the two server_ab.py bugs the bench exposed. Combines the box session's branch (bench/rocmfpx-explore-2026-07-05) with the tooling corrections so the blockers and their fixes land together.

Bench results (docs)

  • handoffs/rocmfpx-bench-results-2026-07-05.md — results appendix. Headline: the 35B-A3B MoE on Vulkan decodes ~2.6× faster and prefills ~3× faster than the dense 27B on ROCm (3B active vs 27B dense; decode is bandwidth-bound). Production numbers: 27B ~29 t/s / 57% accept (real task); 35B ~76 t/s / 74% accept. Seeds already match the vendor cards — the only real levers are HIP env (now shipped) and an optional 27B draft-KV tweak.
  • handoffs/rocmfpx-bench-handoff-next-2026-07-05.md — next-session handoff (model-selection research grounded in the decode ≈ bandwidth ÷ (active_params × bytes/weight) ground-truth).
  • The matrix did NOT fully complete — runner blockers (below) prevented most sweeps. Documented honestly rather than papered over; the findings + card-canonical config + the quant/bandwidth insight are the deliverables.

Tooling fixes (server_ab.py) — address blockers the results doc raises

  • Blocker chore: gitignore .hal0ai/ dev runtime + commit uv.lock #1 — per-request speculative.* ignored at 7aa484a. --mode mtp now relaunches per (n_max, p_min) via [server].extra_args (restores after), instead of the silently-ignored per-request JSON. --per-request retained as an opt-in for a future runner build that honors it.
  • Blocker test(e2e): rewrite update γ spec for Wave-3 RestartBanner #5 — early-EOS mismeasurement. _completion now sends ignore_eos=True for throughput cells (the 35B's strict Froggeric template otherwise stops after ~1 token → meaningless decode t/s); off for the reuse trace.

SUMMARY display

  • generate_results_json.py now ingests server-ab/*.json and renders a Tier B/C section (decode t/s · draft accept % · concurrency aggregate/per-stream/TTFT) — previously it showed only Tier-A llama-bench and could display none of this bench's output. Adds short model names + a quant column. (Plus a ruff UP017 datetime.UTC fixup for CI.)

Runbook corrections

  • Finding 0.6 (restart-free MTP sweep) marked DISPROVEN on this build; depth axis 128k → ≤24k (128k is OOM-infeasible for 27B+MTP here; slots ctx-bounded to 40960); Tier B guidance notes relaunch-every-≤4-cells (runner leaks GPU memory across MTP requests).

Not in this PR (box-side, not version-controlled)

The live-slot config (venv SEED_PROFILES image override, /etc/hal0/slots/*.toml HIP env + context_size 40960, the saber-fpx profile) stays on the box with the backups noted in the results handoff.

🤖 Generated with Claude Code

https://claude.ai/code/session_01Ky49xV79kYjmiYMp4uzHMw


Generated by Claude Code

thinmintdev and others added 4 commits July 5, 2026 05:42
…lts/handoff

- generate_results_json.py: ingest server-ab/*.json into a Tier B/C SUMMARY
  section (decode t/s, draft acceptance %, concurrency aggregate/per-stream/TTFT);
  Tier-A table gets short model names + a quant column. Previously SUMMARY could
  not display any server_ab (MTP/concurrency) output.
- handoffs: ROCmFPX exploratory-bench results + next-session handoff. Records the
  runner blockers (per-request MTP override ignored, cumulative GPU mem leak/OOM,
  stale Tier-A seam), production decode numbers (27B ~29 / 35B ~76 t/s), the
  draft-KV experiment, the 140-t/s quant explanation (bandwidth-bound), and a
  model/quant-per-slot + stack-layout research task.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The on-box bench pass disproved two premises this tooling shipped on
(rocmfpx-bench-results-2026-07-05.md, blockers #1 and #5):

- Per-request speculative.* is SILENTLY IGNORED by the ROCmFPX runner at
  7aa484a — every --mode mtp cell read the launch-time config (n_max=1 and
  n_max=4 returned identical draft_n/accepted). --mode mtp now RELAUNCHES per
  (n_max,p_min) via [server].extra_args (restores after); --per-request opts
  back into the dead path only for a future build that honors it.
- Early-EOS mismeasurement: a strict chat template (the 35B's Froggeric) emits
  EOS after ~1 token on a raw /completion prompt, collapsing predicted_n to 1
  and making decode t/s meaningless. _completion now sends ignore_eos=True for
  throughput cells (off for the reuse trace, which only reads prompt timings).

Also correct the runbook: finding 0.6 (restart-free sweep) marked DISPROVEN;
depth axis 128k -> <=24k (128k is OOM-infeasible for 27B+MTP here, slots are
ctx-bounded to 40960); §4 delta 1 updated. profile-matrix Tier B guidance
notes relaunch-every-<=4-cells (runner leaks GPU mem across MTP requests).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ky49xV79kYjmiYMp4uzHMw
…' into claude/llamacpp-strix-halo-flags-cyzyo8
@thinmintdev thinmintdev marked this pull request as ready for review July 5, 2026 10:08
@thinmintdev thinmintdev merged commit 3b2bcc3 into main Jul 5, 2026
3 checks passed
thinmintdev added a commit that referenced this pull request Jul 5, 2026
* release: prep v0.9.1 — bump version + CHANGELOG

- pyproject 0.9.0 → 0.9.1.
- CHANGELOG: promote [Unreleased] → [0.9.1] documenting the merges since v0.9.0
  (ROCmFPX runner quant-detect/#1068, seed profiles/#1069, quantize skill/#1071,
  bench tooling/#1072, updater prepare/commit + signed notes/#1075, seed cleanup
  + auto-fallback/#1076, release-notes producer/#1078, continuous batching).
  Uses ### Highlights / ### Migrations subsections so `hal0 update` renders the
  seed-cleanup auto-fallback as a callout (dogfooding #1078). Fresh empty
  [Unreleased] restored.

Not the tag itself — reviewed separately, then tag v0.9.1 triggers release.yml.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* profiles: normalise seed intent labels to structural tags

Drop served-model names and filler from seed 'intent' labels (e.g.
'VKFPX · ROCmFPX MoEQuality 35B-A3B · Vulkan0 + MTP' → 'VULKFPX · MOE · MTP';
'ROCm · basic GPU LLM' → 'ROCm'). Structural runner/arch/feature tags only.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* profiles: add vkfpx-dense seed (VULKFPX · DENSE · MTP, Vulkan0)

Completes the FPX lane×arch matrix — Vulkan0 lane for dense ROCmFP4, for
prefill-bound workloads (Vulkan wins ~+24% PP); complements the decode-optimal
ROCm0 rocmfpx-rocm. mtp=True (runner-capability gate; params stay on the model).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
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