Spaces:
Paused
Paused
|
Download ARCHITECTURE.md from whassan/SensorflowStudio: direct link, hf CLI and curl.
- Browser
- Download file 4.26 kB
-
https://huggingface.co/spaces/whassan/SensorflowStudio/resolve/main/ARCHITECTURE.md
- Command line
-
hf download hf://spaces/whassan/SensorflowStudio/ARCHITECTURE.md
-
curl -L -o ARCHITECTURE.md https://huggingface.co/spaces/whassan/SensorflowStudio/resolve/main/ARCHITECTURE.md
4.26 kB
Sensorflow Studio — Aggregate-First Evaluation Architecture (megaeval)
The sensorflow/megaeval/ layer replaces the "evaluation-record browser" model
(annotation as the primary unit) with an aggregate-first, risk-first,
cohort-first, drill-down-on-demand design.
Mental model → code
| Concept | Meaning | Module / storage |
|---|---|---|
| Dataset | immutable source population | population.py → runs/megaeval/populations/{pop}/part-*.npz |
| Evaluation Run | model+config being evaluated (async job, first-class) | runs.py → runs/megaeval/runs/{run}/run.json |
| Population | all objects evaluated in a run | headline row of the metric cube |
| Cohort | slice by class/weather/lighting/road/scenario/sensor/distance/speed/occlusion | cube cells + POST /api/evaluations/query |
| Container | scene/frame/segment holding related objects | containers.npz aggregate table |
| Annotation | individual object — forensic view only | per-object objects-part-*.npz, loaded one partition at a time |
Data flow
generate population (vectorized numpy, partitioned npz)
│
create run (queued) ──► worker pool (4 threads) processes partitions:
│ model simulation → PARTIAL sufficient statistics
│ (n, tp, fp, fn, sum_iou, conf sums, histograms …)
│ grouped by the 9 cube dimensions, per partition
▼
reduce (concat + groupby-sum) ──► materialize METRIC CUBE (cube.npz)
│ + error index, container table, sketches,
│ container embeddings
▼
publish ──► queries served by QueryRouter: cache → cube → (rare) record scan
Aggregation never scans raw records at query time; queries like "pedestrian recall at night in rain for model v42" are cube lookups.
Single-node stand-ins for distributed infrastructure
This repo runs on one laptop; the seams are shaped so each piece maps to the production-scale equivalent:
| Here (single node) | Production analogue |
|---|---|
npz column partitions (part-0000.npz…, hash-partitioned by container) |
Parquet files in an Iceberg/Delta table, partitioned by scene |
ThreadPoolExecutor workers over partitions |
Spark executors / Flink task slots |
partial stats per partition + reduce_partials |
map-side combine + shuffle reduce |
QueryRouter (cache → cube → scan) with latency+source reporting |
OLAP engine (Druid/Pinot/ClickHouse) over the lakehouse |
QueryCache keyed by hash(dataset+model+filters+group_by+metrics) |
result cache / materialized views |
| in-process SSE progress events | job-status topic (Kafka) + progress service |
| numpy cosine similarity over container embeddings | vector DB (hybrid retrieval) |
Honesty rules encoded in the API
- Cube counts and derived ratios are exact (
meta.exact = true). - Percentiles/distributions come from fixed-bin quantile histograms; cardinalities from HyperLogLog — always labeled approximate.
- Precision/recall from human review are sampling estimates with 95% CIs (stratified risk-weighted design: Wilson per stratum, weighted normal-approx combination), reported with n reviewed / frame size / method.
- Every query response reports
source(cache/cube/scan),cache_hit, andlatency_msso aggregate-first behavior is observable in the UI. - Evaluation runs are reproducible: lineage (dataset, model+checkpoint, label version, evaluator code version, metric version, thresholds, sampling config, seed, hardware) is stored on the run and derives the deterministic seed.
Performance SLOs (measured locally, 320k-object population, 67k cube cells)
| Query | SLO | Measured |
|---|---|---|
| aggregate dashboard (group by class) | < 2 s | ~75 ms |
| filtered cohort query | < 3 s | ~350 ms first / sub-ms cached |
| cached query | < 100 ms | ~0.1 ms |
| object investigation (one container, forensic) | < 1 s | ~50–200 ms |
The legacy sensorflow/evaluation/ layer (label-evaluation pipeline, triage,
HITL, training flywheel) remains unchanged; megaeval integrates with its
regression tracker and alerting rather than duplicating them.