Files
helexa/bench
rob thijssen d04f4ad704
All checks were successful
build-prerelease / Resolve version stamps + change detection (push) Successful in 31s
build-prerelease / Build neuron-blackwell (push) Has been skipped
build-prerelease / Build neuron-ampere (push) Has been skipped
build-prerelease / Build neuron-ada (push) Has been skipped
build-prerelease / Package helexa-neuron-ada RPM (push) Has been skipped
build-prerelease / Package helexa-neuron-ampere RPM (push) Has been skipped
build-prerelease / Package helexa-neuron-blackwell RPM (push) Has been skipped
build-prerelease / Build cortex binary (push) Has been skipped
build-prerelease / Package cortex RPM (push) Has been skipped
build-prerelease / Build helexa-bench binary (push) Successful in 2m34s
build-prerelease / Lint (fmt + clippy) (push) Successful in 2m54s
build-prerelease / Package helexa-bench RPM (push) Successful in 1m15s
build-prerelease / Test (push) Successful in 5m11s
build-prerelease / Publish to rpm.lair.cafe (unstable) (push) Successful in 56s
feat(bench): show GPUs as the resource name instead of hostnames
Public visitors don't know the hostnames, so surface each host's GPU(s)
as the resource name across the UI.

- store: gpu_label() turns the stored gpus_json into a compact label
  ("2× RTX 5090", "RTX 4090"); add `gpu` to ReportRow + RunRow and
  `host_gpus`/`model_gpus` maps to /api/dimensions (from each one's
  latest run). render_json gains gpu too.
- UI: Overview + Runs show a "GPU" column (gpu, fallback host); Runs'
  filter is now GPU-labelled (still filters by host underneath); Trends
  shows a "Measured on <gpu>" line for the selected model.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-14 16:29:13 +03:00
..

helexa bench UI

A Vite + React (SWC, TypeScript) app that visualises the fleet benchmark data collected by helexa-bench. It reads the read-only JSON API the bench daemon serves (crates/helexa-bench/src/api.rs, default :13132 on bob).

Stack: React Router, react-bootstrap, Recharts.

Pages

  • Overview — latest median results per (host, model, scenario) cell.
  • Trends — decode-tok/s and TTFT plotted across neuron build SHAs as releases roll out (the headline view). Pick host / model / scenario.
  • Runs — filterable raw-run explorer.

Develop

cd bench
npm install
npm run dev      # http://localhost:5173

vite.config.ts proxies /apihttp://bob.hanzalova.internal:13132, so the dev server talks to the live bench API with no CORS fuss. Point the proxy elsewhere (or run a local helexa-bench serve) to develop against other data.

Production hosting

Public at https://bench.helexa.ai — nginx on the gateway (hanzalova.internal) serves the static dist/ and reverse-proxies /api to the bench API on bob over WireGuard, so the SPA is same-origin (no CORS) and the internal API stays off the public internet.

  • npm run build is run with no VITE_API_BASE (the app calls /api/... on its own origin; nginx proxies it to bob).
  • .gitea/workflows/deploy.yml (deploy-bench-ui) builds and rsyncs dist/ to /var/www/bench.helexa.ai on every deploy.
  • The nginx vhost (asset/nginx/bench.helexa.ai.conf) and the Let's Encrypt cert are one-time host setup in script/infra-setup.sh.

To host elsewhere instead, build with VITE_API_BASE=<bob-api-origin> and serve the static dist/.