Repository navigation
QVAC-27853 feat(benchmarks): Jetson and Strix lanes, Speech Bench hub with task pages, machine dashboards - #411
Conversation
Build only the cmake targets of the selected families (plus whisper-cli), so a host that skips the MOSS families never compiles moss-cli; fall back to Unix Makefiles where ninja is missing (qvac-dev-strix-1); add EVICT_PAGE_CACHE, which drops the model files from the page cache before every family on boards whose CUDA allocations fail while the cache is full (Jetson Orin), via a new evict subcommand of prepare-derived.py; document the Jetson settings. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Review StatusCurrent Status: ❌ PENDING Pending reviews: Needs 1 Management or Team Lead, and 1 more from Management, Team Lead, or Member. |
The weekly results move from one HTML page to one Dashboard artifact per task (ASR, TTS with cloning, Music) behind a landing page, following the fabric-llm engine bench: every dashboard shows a card per machine and backend with the newest result of each model, the campaign comparison against other engines coloured per engine, the week-over-week line per lane, and the run log, with every number readable in the Sources panel. - build-dashboard-data.py turns the stored summaries and comparisons.json into the files the dashboards attach (latest, weekly, campaign, runs) with speeds, GiB, short labels, the family order and a current flag - dashboard/index.html is the page every task dashboard runs; the task, machines, backends and engines come from the data - build-landing.py writes the landing page from the summaries and the links in dashboards.json; build-artifact.py stays as the offline report - fetch-registry.js discards a stale .part left by a stopped download, and downloads beside it when the file belongs to another user - the speech-bench skill and the README describe the publish procedure over the dashboards; tests for the data builder, the landing page and the partial-download handling Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
CMAKE_PREFIX_PATH in config.env is passed to the ggml and engine configures and is part of the build signature. The Jetson has no Vulkan SDK and no root, so its Vulkan backend stopped at find_package of SPIRV-Headers; the headers are installed under the bench home instead and the key points the build at them. The skill's machine table gains the Jetson and the second Strix Halo. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The weekly results follow the Speech Bench report the team approved: a hub that lists, per task, every machine with a link into its dashboard, and one Dashboard artifact per machine with an overview, a tab per task with a speed chart per model, backend and input, a week-over-week line per backend, and a runs and coverage tab. - build-dashboard-data.py writes per host the six files a dashboard reads (runs, history, coverage, engines, machine, commentary) and hub.json; weekly rows carry short variant labels, campaign rows sit in their own charts with one QVAC row each, and a competitor without a ratio (OOM) is a failed row instead of borrowing QVAC's time - the commentary gives each dashboard a summary of the week: the fastest cell per task, the campaign ratios, failed cells, moves over 5% against the last full run, coverage and pins - dashboard/ holds the page every machine dashboard runs, adapted from the approved report's dashboard script, and the hub's stylesheet; engines.json lists the engines and dashboards.json the links - build-landing.py renders the hub from hub.json - the skill, the README and the tests follow the new layout, and the suite syntax-checks the dashboard script Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
qvac-dev-strix-0 and qvac-dev-strix-1 are the same hardware, and the results showed both as "Strix Halo" and "Strix Halo (1)". The weekly set keeps qvac-dev-strix-1, which has the complete run, under the plain name "Strix Halo"; the campaign's Strix Halo rows go with it, and strix-0 is no longer a dashboard, a hub entry or a collected host. The skill and the README say which box it is and that strix-0 is retired. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The approved report opens a task page per machine and task from the hub: one section per model with a speed chart per backend and input, a details panel per chart (exact values, precision per row, the competitor-over-QVAC time ratio, notes and sources) and what was not measured there. task_views.py renders the same pages from each machine's runs.json and coverage.json, and build-landing.py embeds them in the hub as views reached at the hub's link plus #<machine>-<task>, so they need no artifact of their own and share the hub's audience. Campaign competitor rows no longer carry QVAC's quantization as their precision, and two campaign notes in comparisons.json that were cut at 400 characters are complete again. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…he weekly matrix Thirteen new families: Parakeet Realtime EOU 120M, upstream Whisper small through whisper-cli, the ASR models on the 160.6 s multi-speaker ABCBA clip (no reference transcript, so no WER), Chatterbox Turbo, Chatterbox Multilingual and CosyVoice3 cloning the JFK clip, Parler-TTS mini and Indic Parler-TTS. A family names its own input in "scenario" so the report keeps every input in its own chart, and a provision entry may link a file under another name (CosyVoice3 requires voice.gguf even when cloning). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… pages import-report.py turns the saved task pages of a comparison report into report-rows.json (rows in the shape of runs.json, comparison set "report", plus its not-measured lists as coverage cells). build-dashboard-data.py reads that file next to the summaries folder, the task pages and the machine dashboards show the report charts between the weekly and the campaign ones, never mixed, and the report's QVAC-only timings stay a list. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
GustavoA1604
left a comment
There was a problem hiding this comment.
[medium] scripts/benchmarks/desktop-weekly/build-dashboard-data.py — line 170 (if row.get("task") == "TTS cloning":)
This labels cosyvoice3-clone as including model load and reference encoding, although its native benchmark excludes both. The dashboard and task pages therefore misrepresent the measured latency. Apply TIMING_CLONING only to time-wrapped cloning, and add a native-cloning test.
[medium] scripts/benchmarks/desktop-weekly/build-dashboard-data.py — line 636 (by_host = group_by_host(summaries))
Retaining historical summaries as documented leaves both qvac-dev-strix-0 and qvac-dev-strix-1 in the hub, producing an extra obsolete machine and three task pages despite the intended single Strix Halo. Filter the retired host from current views or explicitly consolidate its history. Add a test containing both host names.
…t of the hub TIMING_CLONING (process incl. load and reference encoding) now applies only to time-wrapped cloning families; the native CosyVoice3 bench keeps the inference-only scope. Summaries of a retired host (qvac-dev-strix-0) are skipped so the hub shows one Strix Halo even when its old summaries are still stored. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Both review findings are addressed in a4e6d98:
🤖 Addressed by Claude Code |
Families may name another engine (engine, platform, backends): weekly.sh
skips a family on the other platforms, the driver skips the other
backends and resolves an absolute or ${BENCH_HOME} binary, and the
dashboard builder puts the rows in the chart of the QVAC family with the
same model, input and timing scope. parakeet-mlx and mlx-whisper run on
the Mac Studio Metal backend through mlx-bench.py (pinned Hugging Face
snapshots, model loaded once, soundfile decoding outside the timed
region, the driver's bench JSON).
build-highlights.py renders the charts listed in highlights.json as one
page of cards (QVAC against the other engines of each chart) for blog
posts and updates; a card without another engine is left out and named.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…c Studio mlx-bench.py gains the mlx-audio engines: Nemotron 3.5 ASR Streaming 0.6B decoded offline with the model loaded once (native bench JSON), and Chatterbox Turbo synthesized once into the driver's WAV with the conversion's built-in voice at a fixed seed (time-wrapped family), both announcing the Metal backend to the driver. Three families, the engine entry, the highlights cards and the docs follow. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Both findings are addressed in a4e6d98 (branch head is now 46f10f0, which keeps the fixes). [medium] scripts/benchmarks/desktop-weekly/build-dashboard-data.py — line 170 (if row.get(“task”) == “TTS cloning”:) Fixed: timing_of applies the “fresh process incl. load and reference encoding” scope only when the cloning family is time-wrapped; native cloning (cosyvoice3-clone) keeps the “inference only” scope of its bench. Test test_only_time_wrapped_cloning_includes_load_and_reference_encoding covers both families. No published page needed a rebuild yet: the Mac and Linux hosts have no CosyVoice weekly rows until Sunday. [medium] scripts/benchmarks/desktop-weekly/build-dashboard-data.py — line 636 (by_host = group_by_host(summaries)) Fixed: RETIRED_HOSTS = ("qvac-dev-strix-0",) and current_summary_paths drop the retired host’s summaries at load time, so the hub shows one Strix Halo (strix-1) and three task pages for it; the strix-0 files stay in the history folder for the record. Test test_retired_hosts_are_left_out_of_the_summaries loads both host names and asserts only strix-1 survives. README and the skill document the constant. |
|
/review |
…verage gaps mlx-bench.py's TTS engine is now generic (any mlx-audio text-to-speech model, with reference audio resampled to the model's rate and per-family generate options) and gains a music engine for MiniMax Music3. Audio8 synthesis and JFK cloning, MOSS-TTS v1.5 and MiniMax Music3 join the Mac Studio families; the MLX conversions live once under models/mlx/, shared by the families of one model. engines.json entries may declare not_measured gaps per host; the mlx-audio entry lists the models no MLX engine can run on the Mac, and the dashboard builder turns them into coverage cells. Coverage gaps are now per stored (backend, family) cell across the stored runs instead of the newest run's family list, which mislabelled partial manual runs. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…e Mac Studio fluidaudio-bench/ is a Swift package that drives FluidInference/FluidAudio (pinned by commit) the way the native QVAC benches run: Core ML models loaded once, the clip transcribed in process after warm-ups, the driver's bench JSON written. Four families run its Parakeet TDT 0.6B v3 and Parakeet Unified English 0.6B conversions with the encoder on the ANE, in the Metal lane of the Mac Studio beside the QVAC rows; the engine entry lists what FluidAudio cannot cover (streaming-only Nemotron and EOU, no Whisper, no matrix TTS model). install.sh records the scheduler's pid itself instead of racing the scheduler for it, which made the shell suite's fallback check flaky. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Four -coreml twin families (Parakeet TDT, Unified, EOU, Nemotron on the
JFK clip) run the engine's Core ML encoder sidecar on the Apple Neural
Engine through the driver's existing comparison: the sidecar is exported
once from the GGUF with the Python named by COREML_PYTHON, the bench runs
with --require-coreml and again forced to ggml, and the row keeps the
forced-ggml time. Darwin engine builds now enable PARAKEET_COREML, which
is part of the build signature. The summarizer carries the encoder
backend and the baseline time into the rows.
minimax-music3-q8_0 renders the 30 s instrumental request with
mm3-replay from a GGUF pair prepared by prepare-minimax.py elsewhere and
placed in the store by hand (provision kind "prepared"); the driver gains
the ${SCRATCH_DIR} placeholder for benches that write into a directory.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…on highlights The Parakeet EOU bench writes a token's raw control byte into its transcript on the long clip, which jq refuses; the driver now strips the bytes JSON forbids in strings before it parses a native bench file. The highlights page draws every QVAC variant of a chart (Metal beside the Core ML encoder) with the other engines, and the Mac Studio gets the JFK Parakeet card. The MiniMax texts no longer say the row stands alone. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The Parakeet EOU bench writes raw tabs and control bytes into its transcript on the long clip; stripping single byte ranges left jq still refusing the file, so the driver now re-serializes a native bench file with Python's tolerant JSON loader before anything parses it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
GustavoA1604
left a comment
There was a problem hiding this comment.
[medium] scripts/benchmarks/desktop-weekly/lib.sh — line 483 (if family_runs_on_backend "$1" "$2"; then)
Metal-only families are skipped on CPU, but summarize.collect_rows() still creates every backend × family pair. On a Mac running cpu,metal, those skipped cells become not-run failures and mark an otherwise successful run partial. Apply the same backend filter when collecting summary rows, and add a mixed-backend regression test.
[medium] scripts/benchmarks/desktop-weekly/build-dashboard-data.py — line 267 ("group": f"{host}|{row['backend']}|{model}|{task}|{scenario}|weekly")
Include timing_class in this grouping key. On Mac Studio Metal, whisper-small includes startup and model loading, while mlx-whisper times inference after loading. Their matching keys put them into one chart and produce a misleading comparison ratio. The ABCBA pair has the same issue. Add tests confirming these timing scopes stay separate.
…on the Mac Studio Adds the sidecar provision kind to fetch-models.sh (exported once from the GGUF with the engine's exporter under COREML_PYTHON), builds the Darwin engine with TTS_CPP_COREML, lets the driver compare Core ML against the forced-ggml baseline for families without a reference transcript, and adds the ABCBA Core ML twins plus the Supertonic 3 and Audio8 Core ML families. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…by timing scope summarize.collect_rows now applies the same backend filter as the runner, so a Metal-only family no longer shows up as a not-run cell on CPU and marks the run partial. The weekly chart group key carries the timing class, so a fresh-process QVAC row (whisper-cli) and an in-process competitor row (mlx-whisper) are never drawn in one chart with a ratio. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… into QVAC-27853/jetson-strix-lanes
Both addressed in d6b1dd7. lib.sh:483 / summarize rows. collect_rows() now applies the same backend filter as the runner (family_runs_on_backend), so a Metal-only family is no longer an expected cell on CPU. Regression test test_a_metal_only_family_is_not_expected_on_the_other_backends runs a cpu,metal matrix and checks the counts come out 3 expected, 2 ok, 1 failed with only the real CPU gap in the problem list. build-dashboard-data.py:267 / grouping key. The weekly group key now carries timing_class, so whisper-small (fresh process, whisper-cli) and mlx-whisper (in-process, inference only) land in separate groups and the dashboard draws no ratio between them; same for the ABCBA pair. Test test_rows_of_different_timing_scopes_never_share_a_chart covers both pairs. The README row for mlx-whisper already stated they stay in their own charts; now the code does it too. |
|
/review |
…ins; pins know sidecar entries The engine takes the ggml path for any input longer than an EOU or Nemotron sidecar, so the ABCBA twins export their encoders at the clip's 16060 mel frames. collect-pins.sh now names prepared and sidecar provision entries instead of failing jq on them; its test checks the collector stays silent. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Overview
Follow-up to #410 in three parts.
Jetson Orin Nano (
qvac-dev-linux-arm64) lane, and the Strix Halo moves toqvac-dev-strix-1lib.shbuilds only the cmake targets of the selected families (pluswhisper-cli), so a host whoseSKIP_FAMILIESremoves the MOSS families never compilesmoss-cli.qvac-dev-strix-1has none).EVICT_PAGE_CACHE=1drops the model files from the page cache before every family, through a newevictsubcommand ofprepare-derived.py(posix_fadviseDONTNEED); the Jetson's CUDA allocations fail while the page cache is full.CMAKE_PREFIX_PATHinconfig.envis passed to the ggml and engine configures and is part of the build signature: the Jetson has no Vulkan SDK and no root, so SPIRV-Headers and Vulkan-Headers live under the bench home.qvac-dev-strix-1replacesqvac-dev-strix-0(the same hardware) as the one Strix Halo of the weekly set, under the plain name "Strix Halo"; the campaign's Strix Halo rows go with it.config.example.envand the skill's machine table document the Jetson and the Strix Halo.Speech Bench hub with task pages and per-machine dashboards, in the layout of the approved Speech Bench report
build-landing.pyrenders it fromhub.json.task_views.pyrenders them from each machine'sruns.jsonandcoverage.json, withdashboard/task.css;build-landing.pyembeds all of them in the hub as views reached at the hub's link plus#<machine>-<task>(for example#dgx-spark-tts), so they need no artifact of their own and are visible to everyone who can open the hub.dashboard/index.html,app.js,app.css, adapted from the approved report's dashboard script): an overview (status, a summary of the week, quality flags, which models ran on which backend, gaps, engines, rules), a tab per task with one section per model (a speed chart per backend and input; weekly charts hold QVAC's variants, campaign charts hold QVAC and transcribe.cpp, audio.cpp, LocalAI parakeet.cpp or acestep.cpp in engine colors, with details, time ratios and sources), a week-over-week line per backend, and a runs and coverage tab.build-dashboard-data.pywrites per host the six files a dashboard reads (runs,history,coverage,engines,machine,commentary) andhub.json. Campaign rows keep their own build and date and never share a chart with weekly rows; a competitor without a ratio (OOM in the campaign) is a failed row, and a competitor row records its precision as not recorded instead of QVAC's quantization. Two campaign notes incomparisons.jsonthat were cut at 400 characters are complete again.engines.jsonlists the engines,dashboards.jsonthe links.fetch-registry.jsdiscards a stale.partleft by a stopped download, and downloads beside it when that file belongs to another user (the shared store is sticky).Additional information
test-desktop-weekly.shcovers the selected-family target list, the generator fallback, the evict subcommand, the cmake prefixes in the build signature, the partial-download handling, the data builder, the hub and the task pages (27 checks pass; it also syntax-checks the dashboard script).🤖 Generated with Claude Code
Requirements