Skip to content

W7900 update - #6

Merged
AIwork4me merged 61 commits into
AIwork4me:masterfrom
zihaomu:w7900_update
Aug 16, 2026
Merged

W7900 update#6
AIwork4me merged 61 commits into
AIwork4me:masterfrom
zihaomu:w7900_update

Conversation

@zihaomu

@zihaomu zihaomu commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Summary

Update w7900 result

c = concurrency

c (=-np) 1 4 16 32
17GB baseline 33.72 66.46 218.56 293.29 toks/s
dynamic baseline 30.61 65.63 209.65 265.71 toks/s
VRAM 17GB / dynamic (GiB) 15.8 / 18.5 16.7 / 19.4 19.1 / 21.8 22.2 / 24.9 toks/s

Platform and scope

  • GPU / gfx target:
  • ROCm / kernel:
  • Inference path: vLLM BF16 / llama.cpp GGUF / documentation / CI
  • Model revision:
  • vLLM or llama.cpp commit:

Verification

Evidence and claims

  • New hardware claims include the hardware-validation evidence bundle.
  • Benchmark changes preserve raw historical data and explain methodology impact.
  • Failures and negative results are retained.
  • No unverified support, performance, hash, or upstream-status claim was added.
  • Relevant manifests and documentation were updated.
  • No model weights, tokens, private logs, or personal data are included.

zihaomu and others added 30 commits August 14, 2026 16:06
Data (docs/results/w7900-gfx1100.md): W7900 (gfx1100) Study 2 throughput —
baseline at c (=-np) 1/4/16/32 and DFlash at c=1/4, with concurrency scaling,
measured VRAM, and a gfx1151 comparison. All numbers verbatim from cell JSONs.

Scripts (scripts/w7900-repro/): two-method reproduction — Method 1 (Docker
image, llama.cpp baked in) and Method 2 (bare metal, user-provided gfx1100
llama-server). Both reuse the committed harness unmodified and render a
12-cell matrix (baseline c=1/4/16/32 + DFlash c=1/4). Models download from the
official Hugging Face; no proxy/mirror is hard-coded.

Status: W7900 -> Validated in README.md, docs/hardware-validation.md and
docs/results/README.md.

.gitignore: exclude the local models symlink and the repro _out/ so model
weights never become part of the project.
…to main README

Method-1 Dockerfile now `FROM flagos/flagtree-amd-tle:rocm7.2.4` (like
../../deploy/Dockerfile) instead of the prebuilt ACR image: installs
huggingface_hub + aiohttp, pins the official Hugging Face, and COPYs the
prebuilt gfx1100 llama-server from bin/ (staged by the user — a custom
muse-glimmer + DFlash build, not upstream, so not compiled here). IMAGE default
-> muse-glimmer-llamacpp:repro; the private registry URL is dropped from the
package. bin/llama-server is gitignored; bin/README.md documents staging.

README.md: add the W7900 (gfx1100) Study 2 throughput table next to the gfx1151
(AI MAX 395) one — baseline at c=1/4/16/32 and DFlash at c=1/4 — and update the
"validated here" line and results preamble to include the Radeon dGPU.
Study 1 (Meta-aligned greedy anchor): add measured W7900 rows — 17GB
33.19 -> 63.98 tok/s, dynamic 30.23 -> 58.26 tok/s (both ~1.93x, draft
acceptance ~0.24), measured with the repo harness (study1.conf: greedy temp=0,
batch 1, 3 reps).

Study 2: merge the two per-GPU tables into one table with a GPU column
(gfx1151 c=1/4/16; W7900 c=1/4/16/32, gfx1151 has no c=32).
…context)

Two W7900-tuned llama-server presets, grounded in the measurements:
- High throughput: `-np 16 -c 1048576` (16 slots x 65536/slot), DFlash off.
- Long context: `-np 1 -c 131072` (full 128K) + DFlash, or `-np 2 -c 262144`.

Measured on the live W7900 (`-fa on`): high-throughput 30 GiB (17GB) / 33 GiB
(dynamic); long-context (`-np 2 -c 262144`) 22 GiB — all fit the 48 GiB card with
margin. llama.cpp pads each slot's context to a multiple of 256, so use round
sizes (16x65536 = 1048576, not 1048560; a bare 65535/slot rounds up to 65536).
Resolve conflicts keeping the two tracks distinct, per design:
- gfx1151 stays on ROCm 7.14 — adopt upstream's updated Study 1/2 numbers,
  intro/preamble reframing, and the CI-checked generated hardware blocks.
- W7900 (gfx1100) is a separate community-validated Radeon dGPU track on our
  ROCm 7.2.4 — layer its Study 1/2 rows onto upstream's tables, add the
  serving presets, mark it "🧪 Community validated" in the generated matrices,
  and add configs/public-claims.json + the evidence manifest so
  scripts/check_claim_consistency.py passes. No experiments were re-run.
…d-start blocker)

gguf-quickstart.sh clones llama.cpp with --filter=blob:none --no-checkout,
which leaves an empty worktree and no index; git diff then reads every
tracked path as staged-deleted, so the dirty-tree guard refused to change
commits on every cold start and every rerun.

The clone is created by the script itself and cannot hold user work, so
fetch and detach at the selected ref immediately after cloning, before any
guard runs. Factor the guard decision into llama_has_tracked_changes()
(scripts/lib/llama_build.sh) which treats the script's own index-less
empty-clone state as clean while still refusing genuinely dirty populated
checkouts on later runs; the ref-integrity check is unchanged.

Co-Authored-By: Claude <noreply@anthropic.com>
Both dirty-checkout refusals in gguf-quickstart.sh dead-ended users with a
bare one-liner. Route them through llama_refuse_dirty_checkout() which names
the actual situation (switching commits vs reusing the checkout), excerpts
the first 10 lines of git status --porcelain, offers a stash (keep) and a
checkout -- . (discard) recovery verb, and points at the new
docs/troubleshooting.md#dirty-llama-cpp-checkout entry.

Co-Authored-By: Claude <noreply@anthropic.com>
The installer's only pipeline - the cosmetic hipcc version tail piped into
head -1 - SIGPIPEd under set -o pipefail once head closed the pipe, turning a
fully successful, size+SHA256-verified 1.6 GiB install into exit 141. Capture
the output first and print line 1 without any pipe.

Tests drive the real full-install path end to end (download -> verify ->
extract -> mv -> version tail) via a new ROCM714_MANIFEST test seam with a
stub tarball, stub curl and a five-line hipcc, asserting exit 0 and a single
version line; a second pair pins the mechanism itself (old pattern 141, new
pattern 0 under identical pipefail options).

Co-Authored-By: Claude <noreply@anthropic.com>
The 1.6 GiB tarball stayed in $TMPDIR (tmpfs, i.e. RAM, on UMA hosts) after
success with no message and no README mention. Delete it once size+SHA256
verification and extraction have succeeded and say so on one output line;
failure paths keep the archive so a bad download can be inspected or retried.

Co-Authored-By: Claude <noreply@anthropic.com>
A tight disk surfaced only as a raw curl/tar 'No space left on device'
mid-install. Check each target filesystem against its own worst case before
downloading: the archive filesystem needs the manifest's size_bytes (~1.6
GiB), the prefix filesystem needs the extracted tree - 8.3 GiB measured on
the validated install, rounded to a 9 GiB constant since the manifest carries
no extracted size. Refusal output names the target path, required vs
available GiB, and the TMPDIR/ROCM714_PREFIX escape hatch. README states the
~11 GiB transient disk peak next to the existing ~20 GiB figure.

Co-Authored-By: Claude <noreply@anthropic.com>
python3 (the manifest reader) and curl (the downloader) were used unguarded;
on a host missing either, the installer died inside read_field with a raw
bash 'command not found'. Verify both exist before first use and exit 1
naming the tool plus a per-distro install hint (apt/dnf/pacman).

Co-Authored-By: Claude <noreply@anthropic.com>
Three failure exits said only what failed. Size mismatch now prints
expected vs actual bytes, SHA256 failure prints expected vs computed hash,
and both give the delete-the-partial-archive-and-rerun command. A missing
post-extract bin/hipcc names the incomplete extraction and points at disk
space plus the move-aside rerun.

Co-Authored-By: Claude <noreply@anthropic.com>
--profile gguf verified none of the README-declared host tools yet printed
'OK: gguf environment ready'; a user missing cmake sailed through step 3
and met 'ERROR: required command not found: cmake' in step 4, and a host
without python3 killed the checker itself with a raw bash error at the
first read_manifest call.

- itemize git/cmake/curl/python3 with per-tool pass lines feeding the
  verdict; a missing tool FAILs the check with the tool name plus the same
  per-distro install hints (apt/dnf/pacman) as install-rocm-7.14.sh
- guard python3 at the top of the script, before the first manifest read,
  so the checker prints a proper FAIL with the install hint instead of
  dying with 'command not found'

Co-Authored-By: Claude <noreply@anthropic.com>
'GPU-visible pool: 80 GiB' printed bare, so a user could not self-assess
against the project's own floors, and the README's '~20 GiB available'
disk figure had no labeled counterpart.

- the gguf passing line now carries the manifest-derived default-GGUF
  floor (15.6 GiB, from the same value the hard-fail below it uses) and
  the 80 GiB validated envelope, explicitly labeled a warning boundary
- the vllm/reference passing line carries the profile's 60 GiB floor
- both lines label the unit as GPU-visible memory so disk and GPU-visible
  cannot be confused

Co-Authored-By: Claude <noreply@anthropic.com>
…tion

Three checker failure exits said what failed but not what was expected or
what to do next:

- ROCm-version mismatch: now prints the expected 7.14.x/7.2.x alongside
  the observed version and the next action (run
  scripts/install-rocm-7.14.sh or set ROCM_PREFIX)
- gfx1151 absent: lists the GPU id(s) rocminfo actually reported and
  points non-gfx1151 platforms at docs/hardware-validation.md
- pool below the default GGUF: states available and required GiB in the
  same units and hints the smaller-quant escape hatch (GGUF_FILE), with
  the BIOS/UMA lever as the alternative

Co-Authored-By: Claude <noreply@anthropic.com>
The port-availability gate was the last check before exec, so a busy port
cost the full reuse chain (ROCm resolve, tool checks, checkout guards,
build fingerprint compare, 7.4 s artifact re-hash; minutes on a
rebuild-needed tree) before refusing. Hoist it to the top of the script,
right after set -euo pipefail/sourcing/cd and before the plan header,
ROCm resolution and the host-tool loop. The probe now catches the bind
OSError and sys.exit(1)s, so the exemplary ERROR line is no longer
preceded by a raw Python traceback (F-11). PORT env knob preserved; the
gate stays silent when the port is free. The probe falls through to the
required-tools guard when python3 itself is missing instead of
misdiagnosing that as a busy port.

Ref: Fix-A review cosmetic - the checkout-reuse log line said "no fetch
needed" seconds after the fresh-clone branch fetched; reworded to state
the checkout's actual condition ("at $LLAMA_CPP_REF; working tree clean").

Evidence: /home/amd/Desktop/muse-newuser/FINDINGS.md F-11, F-16.

Co-Authored-By: Claude <noreply@anthropic.com>
Add an upfront available-space check mirroring the installer's df -Pk
pattern (scripts/install-rocm-7.14.sh): the filesystem holding MODEL_DEST
is checked against the manifest-derived floor (sum of size_bytes for each
selected artifact not yet present locally; WITH_DFLASH/WITH_MMPROJ add the
drafter/projector), and the build filesystem against a 1.5 GiB
checkout/build allowance (206 MiB validated worktree + 1022 MiB build-714
tree measured, rounded up - the task sketch said ~1 GiB, but the measured
1.2 GiB would make that floor false-pass). When both directories share a
mount the floors are combined and checked once, fixing the shared-mount
undercount. Refusal prints expected-vs-got GiB, the filesystem and the
directory it holds, and a remedy naming the MODEL_DEST escape hatch.

Artifacts already on disk are skipped for the floor: re-requiring their
space would lock warm reruns out of serving on any disk that filled up
after the download. The quarantine+refetch path stays covered because a
quarantined artifact is absent on the rerun, so the preflight re-engages
before the refetch can start.

Evidence: /home/amd/Desktop/muse-newuser/FINDINGS.md F-03.

Co-Authored-By: Claude <noreply@anthropic.com>
…_size-1)

Every DFlash call site requested n-max 16, which upstream unconditionally
clamps to block_size - 1 = 15 with a permanently-emitted warning line at
each server start, and the two label sites misstated the cap ("n_max=32
caps at 16 because 16 is the DFlash block_size"; "16 ... equals the DFlash
drafter's block_size"). Perf delta 15-vs-16 is nil (the sweep is flat past
the elbow), so request the effective maximum directly:

- gguf-quickstart.sh: SPEC_DRAFT_N_MAX=15 constant consumed by SERVER_ARGS
- gguf_bench_args.py: SPEC_DRAFT_N_MAX = 15 + corrected physics comment
- check_dflash_equiv.sh: harness requests 15
- docs/troubleshooting.md dflash-silent-noop: cap is block_size - 1 = 15;
  recorded sweep's 16/32 cells effectively ran at 15

docs/results/ is frozen recorded data and keeps its historical n_max=16
sweep labels by design. The clamp warning - one of F-09's noise lines -
disappears at the source.

Co-Authored-By: Claude <noreply@anthropic.com>
…spec args

WITH_DFLASH=1 used to be invisible until the drafter's fetch line appeared
mid-run: the plan header was byte-identical to a non-DFlash run, the
~1.52 GiB drafter download was an unannounced cost, and --spec-type
draft-dflash appeared nowhere on screen (the server never echoes its
argv). WITH_MMPROJ=1 had the same shape, folded in under the same
"flag acknowledged" principle:

- plan header: a dflash block (drafter filename + manifest size to fetch,
  or "already present; will be verified" when on disk, plus
  "spec decoding   : draft-dflash") and a one-line mmproj entry
- serve start: the effective speculative arguments on one line just
  before exec, e.g.
  "speculative decoding: draft-dflash (draft: models/dflash-kquant.gguf, n-max 15)"

Sizes come from configs/artifact-manifest.json, read the same way the
disk preflight already reads it (artifact_size_bytes).

Co-Authored-By: Claude <noreply@anthropic.com>
…start

During a fully successful DFlash load, upstream llama.cpp prints
E "failed to initialize the context ..." (with an easy-to-miss
"this warning is normal" caveat) and W "[spec] failed to measure draft
model memory" exactly in the window where the user is checking whether
DFlash engaged - indistinguishable, on screen, from the silent-noop
failure mode the README warns about. The lines cannot be silenced
without touching llama.cpp, so the quickstart now prints one
plain-English note from its own tooling just before exec, naming the
definitive confirmation ('adding speculative implementation') that
follows. F-18 already removed the third noise line (the clamp warning)
at the source.

Co-Authored-By: Claude <noreply@anthropic.com>
The Quick start ended at a bare server-URL comment while the quickstart
execs a foreground llama-server, and no request example existed anywhere
in README/docs, so verifying the 18-minute install presupposed
OpenAI-API knowledge (F-06/F-07, both observed LIVE in the audit).

- F-06: comment guidance to leave the terminal running (Ctrl-C stops
  the server) and use a second terminal.
- F-07: new "Verify it works" block with the two audit-verified
  requests: GET /health -> {"status":"ok"} and a POST
  /v1/chat/completions curl whose expected output is shown (content
  "OK" after ~50-70 hidden reasoning tokens, finish_reason stop).
- F-08: reasoning-first note next to the example: small max_tokens
  spends the whole budget on reasoning_content and returns empty
  content with finish_reason "length" (HTTP 200); use max_tokens >=
  512 or omit it. Links the existing troubleshooting#reasoning-length
  entry.

tests/test_docs_ux.py pins the promise, mirroring the existing
doc-content test pattern (test_dflash_nmax.py, test_llama_checkout_guard.py).

Co-Authored-By: Claude <noreply@anthropic.com>
No remediation command for any declared host prerequisite existed
anywhere in README/docs (F-13, STATIC): a bare-OS user meeting
'required command not found' had no documented install path at any
click depth, and the checker's fail()/missing_tool_fail() pointers led
to a troubleshooting file with no matching entry.

- README Requirements: fenced block with per-distro one-liners for
  git/cmake/curl/python3 (apt-get/dnf/pacman), using the exact verbs
  install-rocm-7.14.sh and 00-check-env.sh already print in their
  failure text (F-12 wording, kept in lockstep).
- docs/troubleshooting.md: new #missing-tool entry in the established
  symptom -> cause -> fix shape, discoverable from both the ERROR
  (installer/quickstart) and FAIL (checker) wording, plus a jump-table
  row. The scripts themselves are unchanged.

Co-Authored-By: Claude <noreply@anthropic.com>
F-17 (STATIC): MODEL_DEST was honored by quickstart.sh, gguf-quickstart.sh
and 02-fetch-model.sh but documented nowhere, so every clone re-downloaded
the 15.6 GiB model by default with no dedup escape hatch visible. The
quickstart's disk-preflight remedy text (Fix-F03) also points at the
README for this knob. Document it in the Reproducibility contract
overrides area: an absolute MODEL_DEST reuses the hash-verified model
across clones (it moves the file, not the validated revision - manifest
hash checks still apply).

F-10 fold: the optional-features intro now sizes the two extra downloads
(mmproj ~1.3 GiB, DFlash drafter ~1.5 GiB, from
configs/artifact-manifest.json) alongside the existing ROCm ~1.6 GiB and
GGUF 15.6 GiB figures.

Co-Authored-By: Claude <noreply@anthropic.com>
…pointer

Three ledger fold-ins from the audit fix phase:

- Fix-A fold (docs/troubleshooting.md#dirty-llama-cpp-checkout): a
  checkout interrupted mid-switch (Ctrl-C during a commit change) can
  leave a tree that 'checkout -- .' does not settle; document the
  reset --hard <pinned-ref> and remove-and-rerun alternatives alongside
  the existing stash/discard verbs.
- F-18 fold (docs/adaptation.md): the DFlash requirement line said
  --spec-draft-n-max 16 while every call site now requests 15 (upstream
  clamps at block_size - 1 = 15); one-word consistency fix, matching
  docs/troubleshooting.md and test_dflash_nmax.py.
- F-14 fold (docs/hardware-validation.md): short BIOS/UMA sizing
  section - the 80 GiB pool is the checker's warning envelope, not a
  requirement; hosts below it should compare against the thresholds
  00-check-env.sh prints (GPU-visible, not disk) and the README
  requirements; distinguishes the uma-bug kernel issue from sizing.

tests/test_docs_ux.py grows matching assertions for all three.

Co-Authored-By: Claude <noreply@anthropic.com>
Task review approved Fix-F with one Important finding plus two cheap
minors; this commit rewords the docs (scripts untouched) so they
describe what the failure text actually prints.

- Important (F-13): README Requirements and the troubleshooting
  #missing-tool Fix both claimed the failure text prints "these same
  one-liners" (the all-four-tools blocks). Reality: gguf-quickstart.sh
  prints only the bare ERROR line, while install-rocm-7.14.sh and
  00-check-env.sh print the per-distro command naming the single
  missing tool. README now says the installer and environment checker
  print the matching per-distro install command for the missing tool;
  the troubleshooting Fix drops the "same one-liners" claim and spells
  out which scripts print a hint (the quickstart stops with the bare
  error line). The fenced all-four blocks stay as the install-all
  lead-in.
- Minor 1 (F-08): README reasoning-first blockquote says "at least
  ~50-70 tokens" — reasoning can run to hundreds at the default
  reasoning_strength=high, so the range is a floor, not a typical
  value.
- Minor 2: docs/hardware-validation.md now uses the checker's verbatim
  term "warning boundary, not a minimum" (00-check-env.sh line) instead
  of "warning envelope".

tests/test_docs_ux.py: pin the corrected F-13 claim (and assert the
"same one-liners" phrasing stays gone) and the checker-verbatim
boundary term; update the module docstring to match.

Co-Authored-By: Claude <noreply@anthropic.com>
Unreleased entries for the user-visible fixes on this branch: cold-start
blocker, installer exit 141, disk preflights, port-probe traceback and PORT
value guard, checker failure text, dirty-checkout recovery guidance; archive
cleanup with pre-placed ROCM714_ARCHIVE semantics, DFlash n-max 15, port
gate hoist; README verify block, tool one-liners, MODEL_DEST.

Co-Authored-By: Claude <noreply@anthropic.com>
When the archive staging dir and the prefix parent sit on one filesystem,
the true peak is the archive and the extracted tree coexisting during tar.
Mirror gguf-quickstart.sh's fs_of_dir walk-up + mount compare and check the
combined archive+extracted floor once against that mount; two separate
checks against the same mount each passed at 10 GiB while the 14 GiB peak
still ENOSPC'd mid-extract. The harness df stub now reports per-mount names
so same-mount and separate-mount scenarios are both staged.

Co-Authored-By: Claude <noreply@anthropic.com>
A garbage PORT (e.g. abc) raised ValueError inside the port probe: the
traceback leaked and the gate then misreported the port as already in use
(live-verified). The probe now parses the port first and exits with its own
code for an unparseable value, and the gate reports 'PORT=<v> is not a
usable port number' for it; the busy-port message and every other nonzero
probe exit keep the existing exact wording.

Co-Authored-By: Claude <noreply@anthropic.com>
Pin the documented idempotency contract: with a valid prefix/bin/hipcc
present, a rerun exits 0 fast, prints the nothing-to-do line, and never
invokes curl (poison-curl stub proves it while still satisfying the top
tool guard). The final-review found this path untested.

Co-Authored-By: Claude <noreply@anthropic.com>
Only delete the archive when this script downloaded it (DOWNLOADED flag set
at the curl step): a user-pre-placed ROCM714_ARCHIVE is verified, used, and
left in place after success. A pre-placed archive whose size matches the
manifest expectation also skips the re-download - the size+SHA256 gate still
runs next, and any other size is re-downloaded over and cleaned up as
before. The disk preflight still reserves the archive floor deliberately
(conservative one-time check, not a warm-rerun gate).

Co-Authored-By: Claude <noreply@anthropic.com>
AIwork4me and others added 26 commits August 14, 2026 23:22
Maintainer ruling: master advanced via PRs AIwork4me#4/AIwork4me#5 (v0.1.0 publish) after the
plan was written; the new-user-today sha governs the audit.

Co-Authored-By: Claude <noreply@anthropic.com>
docs: new-user one-pass audit spec and plan (audit trail)
Promotes the Unreleased section (18 one-pass audit fixes, PR AIwork4me#7) to
[0.1.1]; bumps CITATION.cff and pyproject to 0.1.1.

Co-Authored-By: Claude <noreply@anthropic.com>
uv.lock root-package version follows the pyproject bump so
uv sync --locked and CI resolve on the release commit.

Co-Authored-By: Claude <noreply@anthropic.com>
release: v0.1.1 — one-pass audit fixes
aiohttp's content iterator yields arbitrary byte chunks; at np=16 most
chunks carried several coalesced SSE events, so the per-chunk parser
failed json.loads on them and lost the usage event — the np=16 17gb
baseline cell of 2026-08-15 recorded 96 tokens where the server log
showed ~173k decoded (corrupt record quarantined to /tmp/np16-incident/,
never published). Buffer and split on newlines so parsing is independent
of chunk boundaries; EOF-tail parsing keeps the legacy behavior for a
final unterminated event. Regression tests lock both failure shapes
(whole-stream-as-one-chunk and 7-byte splits) and fail on the old code.
~188k was the total (13,846 prompt + 174,045 generated) from the
2026-08-15 np=16 incident server log; the generated-only figure is
~174k, matching the CHANGELOG entry.
The np=16 17gb baseline cell on ROCm 7.14.0, run 2026-08-15 with the
newline-framing SSE client: agg 36.97 tok/s (7.2.1: 34.47, +7.3%),
TTFT p50 2.25 s (2.12), TPOT median +4.9%, total tokens 32,529 (29,801).
VmPeak is +16.1% vs 7.2.1, so the 'lower VmPeak' statements stay scoped
to the original 17 cells. The pre-fix attempt's corrupt low-count record
(96 tokens vs ~174k server-side) was quarantined, never published.

Scope moved from 17/21 to 18/21: validation manifest, its schema
(deferred_cells relaxed to 0-4, completed_cells pinned to 18), README
generated validation-tracks block, TPOT claim generator (now renders the
np=16 pair), benchmark/methodology/results READMEs, and the cell-count
test all updated together. Three np=16 cells stay deferred; DFlash c=16
remains pathological per the existing warning.
Verifier-found stragglers outside the claims gate: schemas/README.md
(two spots) and handoff.md; also scope the VmPeak statement in the 7.14
result summary to the original pass and refresh comparison.md so it
matches the generator byte-for-byte.
Second np16 baseline cell (study2 dynamic, fixed client): agg 32.01 tok/s
vs 7.2.1's 31.05 (+3.1%), TTFT p50 +7.1%, TPOT +26.1%, VmPeak -1.6%.
Provenance: an unrelated llama-bench sweep briefly shared the GPU during
this cell's first repetition (12:03-12:07); the affected rep is the
visible min (18.2 vs median 32.0 tok/s) - disclosed in the scoped result.

The 17gb np16 DFlash full-fidelity attempt (MAX_TOKENS=512, REPS=5)
decayed from ~74 to ~35 prompt-tokens/min and was aborted by the operator
at ~2h (~45% done); the bounded 16x48 probe (16.9 tok/s, 19.3%
acceptance) is committed as probe-study2-17gb-np16-df1-max48-reps1.json.
Both np16 DFlash cells stay deferred; the do-not-combine warning now
covers both runtimes.

Scope 18/21 -> 19/21: manifest, schema (const 19, deferred = 2 DFlash
cells), README generated block, TPOT claim (np16 pairs mean +15.5%),
benchmark/methodology/results READMEs, schemas README, handoff, cell-count
test, renders and checksums.
Exclusive-GPU llama-bench pp512/tg128 sweeps over -fa off/on x -ub
256/512/1024 on both weights (raw JSON committed beside the matrix):
fa=on wins decode on both (+2.3..+2.8% 17gb, +1.7% dynamic; tg128
10.95 / 9.50 t/s best), -ub is decode-insensitive. Documented as
descriptive evidence in the scoped result; validated matrix flags and
defaults unchanged (llama-bench cannot exercise DFlash in this build,
so fa x DFlash interaction is explicitly untested).
Verifier-found staleness: public-claims.json still said 18/21 with three
deferred cells. The scope string is now derived-checked against the
validation manifest (completed/planned cell counts and the deferred-cell
count), so it cannot silently drift again. Also refreshes the np=16
group comment and two last-digit figures in the fa-sweep table
(+2.3..+2.9%, 309.2 t/s).
validate_forward_tracks() must stay generic for synthetic/future track
sets; the GGUF scope gate now applies only when both the GGUF track and
the real manifest are present.
…oalescing

fix(bench): SSE newline-framing; np16 baselines measured (19/21); c16+DFlash pathology; fa micro-sweep
Controlled diagnostic probes on the 7.14 stack (2026-08-15) isolated the
deeper mechanism behind the c=16 + DFlash pathology and it is now reported
upstream as ggml-org/llama.cpp#27117, reproduced on master 0177dcc:

- the drafter's predictions are corrupted per slot, from the first
  speculative tick, once roughly 8+ sequences draft concurrently;
- the trigger is the concurrently-drafting sequence count - not the
  server's -np configuration (an -np 16 server with 4 in-flight requests
  reproduces -np 4 bit-for-bit) and not the batch token count;
- --spec-draft-n-max 1 sidesteps the corruption (0.83-0.92 acceptance at
  -np 16, ~2.2x the no-spec baseline in the probes);
- identical behavior on ROCm 7.2.1 and 7.14.0.

README known-good/bad table, troubleshooting, methodology section 6, the
benchmark warning block, the scoped 7.14 result and the changelog now link
the issue. The probes are diagnostic records carried by the upstream
issue, not matrix cells; the two deferred np=16 DFlash cells stay
deferred pending an upstream fix. Claim-consistency gate: ok.
…ash-c16-issue

docs: link upstream llama.cpp#27117 for the c16+DFlash root cause
Restructure the README for first-visit readability (357 -> 250 lines):

- 'What you get' bullets and the performance highlights now open the
  page; the quick start follows immediately.
- Detailed explanations moved to a new docs/getting-started.md
  (prerequisites with per-distro tool one-liners, installer internals,
  download sizes, the reproducibility contract and env overrides), with
  the README linking it; a documentation map was added.
- The adaptation summary table was dropped in favor of the fuller
  adaptation.md delta table; the memory-terminology paragraph was
  redundant with METHODOLOGY section 5, which the map points at.

No claim changed: the three README generated blocks, the TPOT sentence,
the known-good/bad table (including the upstream llama.cpp#27117 link)
and the claims-hygiene caveats are preserved verbatim or linked. The
docs-UX tests that pinned the moved content were updated to its new
location; the hardware-validation README anchor now targets
#requirements. Gates: claim-consistency ok, pytest green.
…e-first-visit-ux

docs(readme): lead with benefits, performance and quick start
…on package

Conflict resolution: master's restructured README (AIwork4me#12-AIwork4me#14) kept; W7900
Study-2 rows integrated into the unified performance tables. The PR's
Study-1 W7900 rows (33.19/63.98, 30.23/58.26 tok/s) were NOT carried:
they have no committed cell JSONs, manifest entry or results-doc section,
which violates the evidence-first policy the PR's own checklist states.
…link, link-check gap

Three issues found while verifying PR AIwork4me#6 on a W7900 host:

1. 00_prepare.sh: the documented mirror invocation
   (HF_ENDPOINT=https://... bash 00_prepare.sh) crashed with
   'No such file or directory' — bash treats a command word built from
   ${HF_ENDPOINT:+HF_ENDPOINT=...} as a command name, not an assignment.
   export HF_ENDPOINT instead; huggingface_hub reads it from the env.
   Reproduced broken, then verified the fix downloads + size-checks all
   four GGUFs end to end.

2. w7900-repro/README.md linked ../../deploy/Dockerfile, which does not
   exist in this repository; point at the package's own Dockerfile.

3. test_markdown_links.py did not cover the new documents, which is how
   (2) slipped through; add w7900-gfx1100.md, the manifest and the
   repro README to the checked set.
- Commit 9 raw cells from an independent reproduction on a second W7900
  host (ROCm 7.2.1 system stack, upstream llama.cpp 0b1bad14f, kernel
  6.8.0-79-generic). Every cell self-labels rocm_version/kernel/build in
  its manifest; SHA256SUMS pins the bundle.
- Coverage: Study 1 (17gb baseline + DFlash) and Study 2 (7 of 12 cells;
  run order is the driver's fixed sequence, stopped early to prioritize
  the full ROCm 7.14.0 pass). All overlap with the PR AIwork4me#6 submission
  agrees within +/-3%.
- This also backs the Study-1 W7900 numbers PR AIwork4me#6 quoted in the README
  without committed raw evidence; the README rows now cite these cells.
- w7900-gfx1100.md gains an ROCm-version provenance table (7.2.4
  submission / 7.2.1 reproduction / 7.14.0 recommended-default pass).

The cells-rocm-7.14.0 bundle referenced by the provenance table lands in
the follow-up commit with the full 7.14 matrix.
Second W7900 pass on the project-recommended ROCm 7.14.0, installed
side-by-side from the official therock-dist-linux-gfx110X-all tarball,
same validated llama.cpp pin (0b1bad14f) and committed harness:

- Study 2: full 12-cell matrix, {17gb,dynamic} x {c=1,4,16,32} + DFlash
  at c=1/4. Study 1: both 17gb cells. 14/14 planned cells completed.
- Every cell self-labels rocm_version 7.14.0; SHA256SUMS pins the bundle;
  all cells validate against benchmark-cell-v1.schema (schema extended
  with optional driver provenance keys host/gfx/image/gpu_index).
- README headline W7900 rows now show the 7.14 numbers; 7.2.1/7.2.4
  passes remain as corroboration (every overlap within +/-3%, c=32 -7%).

Negative findings preserved per project policy:
- The repo-pinned gfx1151 tarball cannot serve W7900 beyond c=1: rocBLAS
  carries no gfx1100 Tensile data, multi-slot decode core-dumps
  (rocBLAS error: TensileLibrary.dat ... GPU arch: gfx1100). gfx110X-all
  is required; the four c=1 cells first measured under the gfx1151
  tarball were discarded and re-measured.
- An apparent c=32 pathology (>56 min, no completion) was diagnosed as a
  polluted process tree (orphan llama-server sharing GPU/port); a clean
  isolated retry completed normally (276.16 tok/s, wall 339 s). One
  dynamic c=1 cell contaminated by a concurrent diagnostic server
  (15.47 tok/s vs true ~30.5) was deleted and re-measured cleanly.
@AIwork4me
AIwork4me merged commit 6c5b217 into AIwork4me:master Aug 16, 2026
3 checks passed
@AIwork4me

Copy link
Copy Markdown
Owner

Merged after on-hardware verification. Summary of the maintainer review (all measurements on a second Radeon PRO W7900, 48 GiB, gfx1100):

Corroborated — every overlapping number reproduced within ±3% on ROCm 7.2.1 (9 committed cells), and the full 12-cell Study-2 matrix + Study 1 re-run completely on ROCm 7.14.0 (14/14 cells, official gfx110X-all tarball), the project's recommended default. Evidence bundles: docs/results/hardware-validation/w7900-gfx1100/cells-rocm-7.2.1/ and cells-rocm-7.14.0/.

Fixed during review

  1. 00_prepare.sh: the documented mirror invocation (HF_ENDPOINT=... bash 00_prepare.sh) crashed; the inline VAR=x cmd built from a parameter expansion is parsed as a command name. Now exported. Verified end-to-end with the mirror.
  2. Dead link ../../deploy/Dockerfile → the package's own Dockerfile; the link checker now covers the new docs.
  3. The Study-1 W7900 rows the PR quoted in the README had no committed raw cells; they were held back from the merge until measured (now backed by committed cells: 33.21/61.45 on 7.14, 33.31/62.03 on 7.2.1, acceptance 0.24 on both).

Findings preserved — the repo-pinned gfx1151 ROCm 7.14 tarball core-dumps multi-slot decode on W7900 (rocBLAS ships no gfx1100 Tensile data): W7900 users need gfx110X-all. An apparent c=32 pathology was diagnosed as a polluted process tree; a clean isolated retry completed normally.

Conflict resolution kept master's restructured README (#12#14) and folded the W7900 data into the unified tables. Thank you @zihaomu — excellent submission; the repro package made the independent verification straightforward.

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