The niri example binds move to Mod+Shift+M (toggle), Mod+Shift+S (start) and Mod+Shift+X (stop), free in stock niri and in Dank Material Shell's binds. inject-probe reuses the injector's niri guard, so it no longer reports the portal on niri. Fixes #45 Fixes #46
4.2 KiB
4.2 KiB
Installed-build performance baseline protocol (ticket #19)
Locked measurement protocol for the Voculinux port's deferred performance numbers. The numbers themselves are recorded as evidence on the ticket, never here: until measured they are protocol, not results.
Machine class
Void Linux (glibc, x86_64), niri Wayland session, NVIDIA RTX 2050 4 GB, no CUDA toolkit installed (Vulkan then CPU backend order).
Prerequisites
- Installed build from
install.sh(venv or system install), default whisper.cpp engine, debug logging available (--debug). - Ladder models on disk with pinned checksums verified against
src/vocalinux/utils/model_checksums.txt:large-v3-turbo-q8_0(default rung),large-v3-turbo-q5_0(first fallback),smallandsmall.en(floor, by language). - Isolated XDG directories so the pass never touches a live install:
point
XDG_CONFIG_HOME,XDG_DATA_HOME,XDG_STATE_HOMEat scratch roots and link the verified models under<data>/voculinux/models/. - Seed
config.jsonfrom the app's ownDEFAULT_CONFIG: enginewhisper_cpp, the rung under test, keep-alive enabled with the minimum 60 s timeout,first_runfalse, update checks off.
The three metrics
All commands are scripts/measure_perf_baseline.py subcommands run
with the installed build's interpreter.
- Idle tray memory, both states. Start with
--debug --start-minimized, sample RSS withsample-rss --pid, and read VRAM withnvidia-smi. Loaded state is right after startup; the unloaded state follows the keep-alive timeout (watch the log forreason=idle_keepalive). RSS does not reflect the unload (freed native pages stay mapped); VRAM-used is the state signal. - Wake latency, toggle to capture start. Drive starts over D-Bus
(
busctl --user call com.voculinux.Voculinux /com/voculinux/Voculinux com.voculinux.Voculinux Toggle; the--toggleclient also works but spawns the full app stack). Parse repeated runs withparse-log --log: eachToggle requested in state IDLEpairs with the nextOpened capture stream. Report steady-state spread separately from the first-capture cost (model reload after an idle unload lands on the first toggle). - Transcription real-time factor, fixed sample. Regenerate the
sample with
make-sample --out scripts/perf_baseline_sample.wav --seed 19(30 s speech-like babble, 16 kHz mono 16-bit, committed next to the script so reruns are bit-identical), thentranscribe --model-file … --backend vulkan|cpu --wav … --runs 3. Report the first (cold: shader/pipeline build, one-time) run separately from warm runs. CUDA is measured only where a complete toolkit exists; otherwise its absence is recorded, not worked around.
Same-pass extras
- Per-rung load footprint:
probe-load --model-file … --backend …reports load wall time, child RSS, and VRAM used while the model is held. Free versus total memory is distinguished vianvidia-smibefore/during/after. CPU loads touch no VRAM; their RSS is the footprint. - Injection latency:
inject-proberecords the RemoteDesktop version-probe result and timing, then a session-establishment attempt (fast failure versus hang matters more than the version answer), plus the resolved first rung and a no-emissionwtype ""spawn cost as a lower bound. On niri the portal probe is skipped, as the injector skips it, and the report says so withportal_skip_reason: "niri"andportal_available: false. End-to-end key-to-screen latency is deliberately not taken here: emitting keystrokes into a live desktop from a background run would disturb the session. It belongs to the hardware checklist with a dedicated target window. - Thresholds for the model ladder: derive free-memory cutoffs from the maximum observed per-rung footprint (transcribe peak, not just load) plus explicit headroom for the compositor and other GPU clients, and record the derivation next to the numbers.
Report
render_markdown_report (and the JSON the subcommands print) carries
the protocol version, full host facts, and observed numbers only.
tests/test_perf_baseline_protocol.py covers the parsing, statistics,
threshold-derivation, and sample-determinism helpers offline.