FastVideo Performance Dashboard
Local FastAPI + React dashboard for records stored in the Hugging Face performance tracking dataset.
Data Source
The dashboard reads the same normalized JSON records used by
fastvideo/tests/performance/compare_baseline.py.
Defaults:
HF_REPO_ID=FastVideo/performance-trackingPERFORMANCE_TRACKING_ROOT=/tmp/fastvideo-perf-dashboard
Records can include source metadata and rolling-baseline policy context:
run_source:pr,local,scheduled_main, orunknownbaseline_eligible: only successful scheduled-main records should be true- Buildkite metadata such as branch, PR number, build URL, build ID, and job ID
regression_thresholds: per-metric rolling-baseline percent and absolute floors used for recomputed status context
Dashboard/API metric payloads expose threshold_exceeded for raw threshold
crossings; regressed remains the gated CI-failure signal.
Set one of HF_API_KEY, HUGGINGFACE_HUB_TOKEN, or HF_TOKEN if the
configured dataset repo requires authenticated access:
export HF_TOKEN=hf_...
If Hugging Face returns 401 Unauthorized, confirm that HF_REPO_ID points to
the dataset repo you expect and that your token has access to it.
Development
Run the API:
python -m fastvideo.performance_dashboard --host 127.0.0.1 --port 8000 --reload
Run the React dev server:
cd performance_dashboard/frontend
npm install
npm run dev
Open http://127.0.0.1:5173. Vite proxies /api/* to the FastAPI server on
port 8000.
Single-Port Mode For ngrok
Build the frontend:
cd performance_dashboard/frontend
npm install
npm run build
Serve API and built frontend from one FastAPI process:
python -m fastvideo.performance_dashboard --host 0.0.0.0 --port 8000
Expose it:
ngrok http 8000
The ngrok URL will serve the dashboard UI and all /api/performance/*
endpoints from the same local port.
Dashboard Behavior
The dashboard supports model, GPU, source, and day-window filters.
Trend charts show metric-specific axes and exact point details on hover/focus:
- metric value and unit
- timestamp
- commit SHA
- run source
- stored status
- baseline eligibility
- PR number, branch, and Buildkite URL when present
The latest status table uses the stored JSON success value. Recomputed
baseline context applies each metric's percent and absolute regression floors
and does not override stored status.
API
GET /api/performance/healthPOST /api/performance/refreshGET /api/performance/summary?days=90&run_source=prGET /api/performance/trends?days=90&run_source=scheduled_mainGET /api/performance/records?days=90&run_source=local
V2 records use the same comparison cohort as CI: workload_id, variant_id,
benchmark_version, recipe_fingerprint, hardware_profile_id, and
software_profile_id. model_id and gpu_type remain display/filter
metadata, so renaming either does not split history. Legacy records still group
by (model_id, gpu_type). Dashboard baselines use the latest five previous
successful, baseline-eligible records in each group. Summary and trend filters
match the latest display metadata after grouping, while the raw records endpoint
continues to filter individual records.