Skip to content

eval: integrated ε-sweep — single-node + cluster (accuracy·latency·freshness·resources) - #507

Closed
zzylol wants to merge 20 commits into
mainfrom
eval/integrated-epsilon-sweep
Closed

zzylol wants to merge 20 commits into
mainfrom
eval/integrated-epsilon-sweep

Conversation

@zzylol

@zzylol zzylol commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

End-to-end integrated evaluation of coordinated ε-floor sampling, measuring all four metric classes together on one stack, swept over ε (p = 1/(1+ε²·rate)): query accuracy, query latency, data freshness (emit→queryable), and per-component resources (CPU/mem/bandwidth) — plus warm/cold two-tier routing.

Phase-1 — single-node (datasets_eval/google_cluster/e2e/)

epsilon_e2e_sweep.py + INTEGRATED_SWEEP_RESULTS.md. google-cluster-2019 cpu_rate (pooled). Accuracy flat ~0.85–0.87 across p, latency ~2.5 ms, CPU 0.10→0.08 with sampling, wire ~40× below raw, RSS bounded. (Freshness is degenerate single-node — compressed replay seals windows instantly → measured on the cluster instead.)

Phase-2 — 8-node cluster (deploy/mvp-multinode/)

PHASE2_INTEGRATED_RESULTS.md + epsilon_cluster_sweep.sh (freshness/resources/latency) + epsilon_accuracy_sweep.sh (accuracy) + aggregate_phase2_sweep.py. Threaded -warm-sample-p and trace-replay (OTELAPP_TRACE_MOUNT/OTELAPP_TRACE_ARGS) through run_demo.sh producers so the same google_cluster trace flows through the distributed warm+cold stack with admission sampling applied.

Results, swept over ε 0→0.056 (p 1.0→0.05):

  • accuracy ~90% p99, robust to p (cluster DDSketch ~1–8% err, far better calibrated than single-node)
  • latency flat ~1.1 ms p50 / ~4 ms p99
  • freshness warm ~1.0 s / archive ~0.66 s — real wall-clock, independent of p
  • per-component warm sketch backend = 2% CPU / 117 MiB for 5000+ sketches; cost lives at the edge + cold archiver; thanos/minio idle until queried
  • cold tier present for archive / non-sketchable queries

Headline: on real hardware, coordinated ε-floor sampling buys ~40× volume reduction while accuracy, latency, freshness, and backend cost all stay essentially invariant to the sampling rate — the point of the unified law.

Honest caveats documented in each results doc (single-node accuracy ~13% calibration vs Fig 3; freshness/edge-CPU/NIC per-arm scatter is short-soak + multi-series-probe noise, not a p-trend).

🤖 Generated with Claude Code

zzylol and others added 4 commits June 18, 2026 07:19
…/wire in one run

Extends pareto_sweep.py: per arm also measures query latency (perf_counter p50/p99),
data freshness (emit→queryable poll from producer end), and per-process RSS, on top
of the existing accuracy + cpu + wire. Sweeps the admission p (= the ε-floor the
autonomous coordinator sets) and reports the implied ε. Phase-1 single-node table +
honest caveats (accuracy ~13% calibration; freshness ~19ms is a compressed-replay
artifact — real freshness/per-component/cold-tier = Phase-2 cluster). See
INTEGRATED_SWEEP_RESULTS.md.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…onent + cold-tier

Thread -warm-sample-p through run_demo.sh producers (default 1.0, backward-compat).
Add epsilon_cluster_sweep.sh: per admission p bring up the warm+cold asap stack
(wall-clock paced) and capture per-tier freshness, per-container CPU/mem, per-node
NIC bandwidth, and warm query latency. Baseline p=1.0 result in
PHASE2_INTEGRATED_RESULTS.md: real freshness warm ~1.0s/archive ~0.66s (the column
single-node returned None for), and the per-component split (warm sketch backend =
2% CPU / 117MiB for 5000+ sketches; cost at edge + cold archiver).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… invariant to p

5-arm cluster sweep (p 1.0→0.05). Clean result: query latency (~1.1ms p50) and
warm sketch-backend cost (~1% CPU / 68MiB) are FLAT across the full sampling range
— the ε-floor keeps one sketch per series so the serving path is p-independent.
Freshness/edge-CPU/NIC show no systematic p-trend (expected: window-seal latency
and producer-side work are independent of admission sampling); per-arm scatter is
short-soak + multi-series probe noise, baseline run is the reliable freshness point.
Adds aggregate_phase2_sweep.py.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…99, robust to ε

Thread trace-replay (OTELAPP_TRACE_MOUNT/OTELAPP_TRACE_ARGS) through run_demo.sh
producers so the real google-cluster-2019 cpu_rate trace flows through the distributed
stack with -warm-sample-p admission sampling applied. epsilon_accuracy_sweep.sh sweeps
p and queries the warm DDSketch via quantile_over_time(q,metric[5m]) (the correct form;
histogram_quantile routes to thanos). accuracy=1-|sketch-GT|/GT vs exact offline GT
(p99=0.043274). Result: p99 accuracy ~90% flat across p 1.0->0.05 (ε 0->0.056) — sampling
is accuracy-robust; cluster DDSketch ~1-8% err vs single-node's 13% (better-calibrated
window). Completes the integrated table: accuracy+latency+freshness+per-component, one stack.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@zzylol zzylol changed the title eval: integrated ε-sweep harness (accuracy+latency+freshness+cpu/rss/wire) eval: integrated ε-sweep — single-node + cluster (accuracy·latency·freshness·resources) Jun 18, 2026
zzylol and others added 16 commits June 18, 2026 10:08
Cold query explicitly tested (not inferred): count_over_time[10m] -> thanos_query ->
24957/25395 archived samples; timestamp-consistency via window-scaling (1m/2m empty
matching the 2m+1m archive lag, 5m=16.7k, 10m=25k), cross-producer agreement ~3%,
value distribution matches GT (warm p99 0.042-0.049 vs 0.0433, archived values in
trace domain). Honest limit recorded: cold values confirmed indirectly (value funcs
route to warm frontend). gorilla-merger: RestartCount=0 OOMKilled=false, 21MiB/32GiB,
no OOM; MinIO S3 upload not observed completing in-window.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Earlier total_objs=0 was a pre-compaction-cycle reading, not a gap. Watching across
the 5m compactor cycle: 'shipper uploaded blocks uploaded=1' to bucket=asap-gorilla-tsdb,
MinIO holds a real TSDB block (chunks/index/meta.json, erasure-coded). Cold tier durable.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Lets run_demo producers run as coordinated CDM edges (-coordinator-url / -monitor-config-url
/ -monitor-key) via env, alongside the existing OTELAPP_WARM_SAMPLE_P / OTELAPP_TRACE_ARGS
knobs. Used to validate the autonomous /plan/auto → coordinator → ε-floor-p loop end-to-end.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
… fix retired √(f/rate) ref

Consolidated comparative-rigor plan: 5 claims + Pareto + autonomous-allocation + ablations,
each crossed with real datasets (Google-cluster-2019 staged, DEBS-2022 downloading, 3rd gap)
and real baselines (raw+codec, Prometheus/Thanos/VM, NitroSketch/OmniSketch, Cormode-CDM,
ASAP ablations). Priority gaps: real baselines, statistical rigor (trials+CI), all-6-family
accuracy, DEBS e2e, autonomous-alloc quality vs oracle, scale. Also corrected the headline's
stale per-key sampling law to the unified whole-sketch ε-floor.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…g not engaged, KLL/CMS)

Fresh run on main: DDSketch p50 0.72% + HLL 0.33% solid (natural-fit gauge families);
KLL p50 regressed 0.0007→0.0597, CMS one-sided violated (143<244), agent shipped 57MB
raw not ~1MB sketched. Flags gate C1/C4. Data-fitness finding: frequency families belong
on DEBS (symbol-trade freq), not gct gauge data.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…perating-point)

57MB wire = per-family slices all contain 8 metric aliases (agent sketches 1, forwards 7
raw); accuracy is valid. KLL median = small-N rank coarseness (DDSketch buckets win small-N);
CMS one-sided = gauge data has no count to over-estimate (frequency families → DEBS). C1 wire
to be re-measured with true family slices.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…C1 clean-wire harness fix identified

C4 cell ✅ for the natural-fit gauge families (DDSketch p50 0.72%, HLL 0.33%) after root-cause;
C1 cell notes the make_perfamily un-slice + ship-wait coupling that blocks clean per-family wire.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…→ clean sketch-vs-raw wire

Fixes the two gaps that polluted per-family wire: (1) c1_wire.py slices the data to
{cpu_rate Sum-anchor, memory_usage, ONE family metric} (drops the 6 noise aliases that
forwarded raw → 57MB), (2) agent-raw-coldoff.yaml (no asap_edge) replays the same slice
as the raw baseline. Captures W_sketch vs W_raw over N trials with 95% CI.
Validated (ddsketch, real gct, 1 trial): W_sketch 0.99MB vs W_raw 33.7MB = 34.1x reduction,
accuracy intact (p50 0.72%). Confirms the prior 57MB was an un-sliced-data artifact, not a
regression (W_sketch=0.99MB matches the prior good run).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…(real gct, 3 trials+CI)

Matrix C1 cell → measured ✅. Fixed harness (true family slice + raw-forward arm) gives
clean sketch-vs-raw wire with tight CIs; W_sketch reproduces the prior committed numbers
exactly, settling the '57MB' question (un-sliced data, not a regression). Compression/Prom
baselines remain the open comparative gap.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…2.7x over raw+gzip

Compression baseline (b0-gzip/zstd): gzip on the actual raw payload = 12.3x encoding factor;
ASAP's 33.8x decomposes as encoding(12.3x) x residual-aggregation(2.7x) — internally consistent
(12.3*2.7≈33.8). Sketching still beats a gzip-compressed raw baseline by ~2.7x. Honest caveat:
--network host single-node can't isolate the agent→backend wire (loopback method failed, all
arms ~35MB); clean on-wire compression belongs on the cluster NIC. Configs+driver ready for it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…60x smaller; X1 ✅

Updated Fig 9 to the unified ε-floor (retired √(f/rate)); added the standalone algorithm
result (real DEBS rates, equal bandwidth): ε-floor max rel-err 0.06-0.41 vs fixed-p 3.9-40.9.
First real baseline vs academic prior art (NitroSketch). Matrix X1 → ✅.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…hole-sketch findings

Retract the 40-60x per-key claim (circular oracle f_k + retired law). Corrected: whole-sketch
ε-floor on real CMS — 17x insert-throughput at bounded L2, memory constant, p derived from
ε+observable R. Honest: ε-floor bounds L2 not per-key (rare-key accuracy inherently limited
under sampling); right metric = L2/heavy-hitter (TODO). Fleet modest (1.3x, 3 exchanges).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…t 1)

asap-precompute-rs hardcoded sample_p=0.0 in all wrappers — it could decode a
sampled envelope (query-side rescale) but never PRODUCE one, so a Rust edge under
the CDM coordinator's ε-floor grant would ship unsampled full-rate sketches.

Mirror Go's coordinated path (precompute.SampleSetter, applyGrantedSampleP):
- New sampling.rs: GeometricSampler (NitroSketch geometric skip-sampling,
  splitmix64) + wire_sample_p (stamp 0.0 when exact for byte-parity, else p).
- SampleSetter trait in precompute.rs — implemented by exactly CMS, CountSketch,
  DDSketch (the additive families). Sum/KLL/HLL deliberately excluded, matching
  Go's switch in applyGrantedSampleP (HLL keeps its own hash-threshold path).
- Each of the 3 wrappers: sample_p field + GeometricSampler, with_sample_p builder
  + set_sample_p (reseed), admit-gate in update(), stamp wire_sample_p in the
  envelope, reseed on reset(). Seeds mirror Go (cms ZMPC / cs 0x5a3e06d / dd DDSP).
- Count sketches rescale by 1/p on query; DDSketch is scale-invariant (samples to
  shed work, no rescale) — both still stamp p.

Exact path unchanged: sample_p stays 0.0 → #243 byte-parity preserved (all 57+11+27
tests green). New test asserts admit≈p fraction + envelope stamp + SetSampleP.

Part 2 (runtime hook: derive p from the engine's granted ε-floor and install the
window sample-hook, mirroring Go's applyGrantedSampleP wiring) is a follow-up.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…antile (#30)

Locks in the quantile case: sampled DDSketch admits ~p of updates (total_count ~p×)
but its quantile shape survives (scale-invariant, no 1/p rescale), and the envelope
stamps p while the exact path stamps 0.0 for byte-parity.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…+ skewed fleet)

F1-aggregate held at ε (0.050@ε=.05); point-query degrades as ε·√(R/f_k) (heavy
survive, rare lost); 22× insert-tput; synthetic fleet cold-edge 7× better than
fixed-p. Fig 9 → ✅ algorithm. X1 cell updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ollector_benchmark

Relocate the standalone ε-floor benchmark INTO ASAPCollector (its own Go module,
relative replace → ../../../sketchlib-go, mirroring cardinality_crossover) so the
paper-eval code lives with the rest of the eval and sketchlib-go stays unmodified.

Whole-sketch ε-floor p=1/(1+ε²R) on real CMS over real DEBS:
- 20× insert throughput (183 vs 8.9 Mupd/s), CMS memory constant
- accuracy LAW: F1-aggregate held at ≈ε (0.050@ε=.05); point query degrades as
  ε·√(R/f_k) (heavy survive, rare lost)
- synthetic skewed fleet (rate-CV=2.9): ε-floor equalizes per-edge err at ε;
  fixed-p under-protects the cold edge 7× (0.148 vs 0.020)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@zzylol

zzylol commented Jul 16, 2026

Copy link
Copy Markdown
Contributor Author

Superseded by feat/gos-unified-monitoring, which is a verified superset (tree-diff confirmed: identical or additive-only for every touched file) plus ongoing work since the split. Closing in favor of a fresh PR from that branch.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant