test(evidence): Pixel 6a TTFT/prefill/thermal/4b-tier rows for #11734 — Refs #11734 - #11912
Conversation
Captures the four adb-measurable rows of #11734 on real Pixel 6a hardware (policy build 35f61d1, eliza-1-2b Q4 via the bionic Vulkan host), leaving only battery/power-meter + iOS rows genuinely lab-gated: - TTFT distribution: 12 identical-length turns — p50 54.3 s / p90 57.7 s (warm-only p50 54.3 / p90 54.5; 3/12 transparent post-release reloads at 57.3-58.8 s). Client TTFT == full-turn latency: the fast path emits the whole reply as one SSE chunk and the native stream decodes the full 256-token buffer per turn regardless of maxTokens. - Isolated prefill: 8-rung exact-token ladder regressed on the device-logged in-lock window — marginal ~5.1 tok/s, batch-quantized by ELIZA_LLM_N_BATCH=128 (flat <=127 tok, +~23 s per extra batch); effective decode <= 7.9 tok/s. Cross-check llama-bench pp128 3.88 / pp512 8.86 / tg128 6.78 tok/s. The historical "4.8 warm decode" is a combined-window rate. - Thermal timeline: 91.4 min at 15 s cadence — Thermal Status 0 throughout (no OS throttling), peak skin 42.9 C / TPU 68 C; battery fell 76->70% while USB-powered (bounds, does not replace, the power-meter row). - eliza-1-4b tier: the predicted finding — lowmemorykiller kills the foreground app DURING the 2.95 GB Q4_K_M load (ApplicationExitInfo reason=3 LOW_MEMORY, RSS 3.4 GB, GL mtrack 3.22 GB, MemAvailable 1670->206 MB in 22 s). The pressure-release policy cannot fire mid-load; minRamGb: 6 is confirmed real on this 5.59 GB device. 2b restored and verified afterward. Also documented: the shipped device-tier eliza-1 GGUFs (2b/4b "-256k") are Qwen3.5-architecture, not Gemma-4 (only the 8 GB "-128k" artifacts carry the cutover), and an autonomous background agent job can hold the resident-model lock longer than its own period, starving chat turns. budgets.json measuredBaselines + BASELINE.md updated (non-gating; gate budgets stay null pending multi-run stability). Refs #11734 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Your trial has ended. Reactivate Greptile to resume code reviews.
|
Important Review skippedAuto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
Claude encountered an error —— View job I'll analyze this and get back to you. |
What
Captures the four adb-measurable benchmark rows of #11734 on the physical Pixel 6a (serial 27051JEGR10034, policy build
35f61d1f— the same install the #11908 acceptance soak passed on), eliza-1-2b Q4 through the in-process bionic Vulkan host, driven overadb forward tcp:31337. The issue parked these rows as hardware-lab-gated; only battery/power draw (tethered = charging; discharge unmeasurable) and iOS genuinely are.Full methodology + raw data:
.github/issue-evidence/11734-pixel6a-adb-rows/(per-turn JSONL, session logcat, thermal TSV, memory timelines, analyzers). Non-gatingmeasuredBaselinesinpackages/benchmarks/mobile-resource/budgets.json+BASELINE.mdupdated; gatingdeviceClassesbudgets staynullper the multi-run-stability rule.The four rows
1. TTFT distribution (was: single warm run)
12 identical-length turns: p50 54.3 s / p90 57.7 s (min 52.9, max 58.8). Warm-only p50 54.3 / p90 54.5; 3/12 turns were transparent post-memory-pressure-release reloads (57.3–58.8 s) — deliberately included, that's what this RAM class delivers. Client-side overhead vs the native window is only ~136 ms. Client TTFT = full-turn latency on this build: the fast path emits the entire reply as one SSE chunk because the bionic
stream_nextdecodes its full 256-token buffer in a single native call (maxTokens=20never engages; every ~9-token reply pays a ~46 s 256-token decode).2. Isolated prefill tok/s (was: combined-decode only)
8-rung exact-token prompt ladder (92→219 Qwen3.5 tokens), regressing the device-logged in-lock work window (queue- and load-immune; verified against an unqueued turn's wall to 30 ms):
W = 32.4 s + 0.1945 s/tok × P(r² 0.78) → marginal prefill ≈ 5.1 tok/s, effective decode ≤ 7.9 tok/s. Prefill is batch-quantized (ELIZA_LLM_N_BATCH=128): flat ≤127 prompt tokens (~53.7 s, decode-dominated), then ~+23 s per extra 128-token batch. Independent cross-check on the identical GGUF + Vulkan lib family with the app stopped: llama-bench pp128 3.88 / pp512 8.86 / tg128 6.78 tok/s. The historical "4.8 tok/s warm decode" baseline is a combined-window rate, now documented as such.3. Thermal timeline (was: point snapshot)
91.4 min continuous session, 15 s cadence, 363 samples (
dumpsys thermalserviceHAL + battery;/sys/class/thermalis permission-blocked on this user build). Thermal Status stayed 0 the whole session — the OS throttling ladder never engaged under sustained ~55 s/turn inference from a cool start. Peaks: skin_therm1 42.9 °C, VIRTUAL-SKIN 38.1 °C, charger_skin 47.9 °C, TPU 68 °C, battery 29.2 °C. Bonus bound for the battery row: level fell 76%→70% while USB-powered (sustained inference outdraws the adb supply), then recharged.4. eliza-1-4b tier (was: not captured) — the kill IS the measurement
Staged the published device-class 4b (
bundles/4b/text/eliza-1-4b-256k.gguf, 2.95 GB Q4_K_M, sha256-verified), switched registry+assignments, relaunched, drove one turn with 5 s memory sampling. Result, exactly as the E2B-4.9GB finding predicted: lowmemorykiller killed the foreground app during the load —ApplicationExitInfo reason=3 (LOW_MEMORY), rss=3.4GB, importance=100; GL mtrack 3.22 GB / PSS 3.51 GB at the last sample; MemAvailable 1670→206 MB in 22 s; kill 24 s after boot; Android auto-restart would retry the load (kill loop). The #11760 release policy cannot fire mid-load (the load holds the resident lock). The catalog'sminRamGb: 6floor for this tier is confirmed real on this 5.59 GB device. The 2b was restored and verified with a real turn; the device ends in its original state.Additional findings (documented in the evidence README + budgets findings)
eliza-1-2b-q4.ggufreportsgeneral.architecture=qwen35(baseQwen/Qwen3.5-2B-Base); same for the published 2b/4b-256k/-64kartifacts — only the 8 GB-128kfiles carry the Gemma-4 cutover. The fast path's Gemma-format template tags are plain text to this model, so decode always fills the 256-token native buffer.maxTokens=8192) takes longer than its own period at device prefill speed, so it self-queues and holds the resident-model lock indefinitely, starving chat turns — this poisoned two sweep attempts (kept in evidence) and forced the per-rung relaunch methodology.Still genuinely lab-gated (issue stays open for these)
deviceClassesbudgets, and the workflow-lane gate flip.Refs #11734
🤖 Generated with Claude Code