What is, and is not, in the benchmark database.
Method version 1.4.1 · Dataset 2026-09-07 · Last updated: September 2026
Benchmark Explorer answers one question: for a given hardware, model, precision and runtime, what has actually been measured, by whom, and what should you expect? Every row keeps its evidence class and its source line. This page states the row schema, the three sources merged into the database, the dedupe rule, the evidence classes, the expected-range and fallback rules, the comparison rule, the confidence rule and the known coverage gaps. If a number on a result page cannot be traced back to something on this page, that is a bug.
Input rules
Inputs (WP-01). A field that is not stated takes its documented default and is listed in provenance.defaulted; a field that is stated but invalid — a count of 0, a negative, a fraction or a non-number, true in place of a count, an unknown value of an enumerated input, or an empty string — is rejected with VALIDATION_ERROR naming the field, never replaced by a default.
Input keys (WP-02). The engine accepts one list of input keys — the inputs documented here and their declared backward-compatible aliases. Unknown input keys are rejected with VALIDATION_ERROR naming the key: an invented or misspelt key is never silently ignored, a __ test hook never reaches the engine, and an alias sent together with the key it stands for is rejected too (the engine would read only one of them). export_json.inputs echoes every input the engine honoured, so replaying it reproduces the result.
Contents
1. What the database is, and is not
The database is 605 rows, one per hardware × model × runtime ×
precision × input × power mode, each carrying a throughput or latency
metric with a source. It is inference-only unless a
row's scope says end_to_end: publisher numbers
are almost always the model forward pass at batch 1, measured with the
hardware's clocks locked to maximum (jetson_clocks on
Jetson) — not a full camera pipeline (decode, pre/post-processing,
tracking, encode). A full pipeline runs slower; use
Camera Stream Capacity for
the end-to-end budget.
It does not run any benchmark itself. It reads numbers the hardware or model vendor already published, or numbers EdgeAIStack derived from those with the scaling stated, and reports them with their class and source. Where nothing has been measured for an exact configuration, it consults the same benchmark hierarchy the Inference Estimator engine uses (class B → C → D) and reports the fallback with its tier chain — never a silent guess.
2. Row schema
| Field | Meaning |
|---|---|
id | Stable row id. |
key | Dedupe key: hardware|family|variant|runtime|precision|resolution|batch|power_mode. |
origin | catalog (EdgeAIStack's existing benchmark library), research_corpus (the deep-research pipeline), or p185 (the LLM/VLM tokens/s pass layered from the Model Memory Fit registry). |
hardware | One of the 21 hardware ids (§9 for the full list, and the hub for labels). |
power_mode | The nvpmodel preset or power state the row was measured at, or default when the publisher did not state one. |
software | { name, version } of the SDK/runtime build, when the source states it. |
model | { family, series, variant, task } — e.g. yolo11 / n / detection. |
input | { resolution, batch } — the input size and batch size the row was measured at. |
runtime | tensorrt, edge_tpu, hailo_sdk, rknn, openvino, pytorch, cpu, mlc, … |
runtime_inferred | True when the source did not state a runtime and the platform's native runtime was assumed (mostly research-corpus rows). |
precision | fp32, fp16, bf16, fp8, int8, int4. |
accelerator | gpu, igpu, npu, tpu, cpu. |
scope | inference_only (default) or end_to_end. |
metrics | { fps, latency_ms, latency_p99_ms, tokens_per_s, power_w, memory_mb, accuracy_map50_95 } — whichever the source published. |
class | C or D — see §5. |
confidence | high / medium / low, set at ingestion from source quality. |
date | Publication or measurement date/quarter, when stated. |
derivation | For class-D rows, the scaling basis in plain text (e.g. "Coral TPU Extended"). |
sources[] | One or more provenance records. |
duplicates[] | Other rows that described the same configuration before dedupe (§4), kept as a count on result pages. |
superseded_ids[] | Stable row ids removed as exact duplicates during build; the id stays reserved in research/benchmark-ids.json and is not reassigned. |
measurement_distinguisher | When the same hardware/model/runtime tuple would otherwise collide (e.g. Hailo Model Zoo batch-1 vs batch-8 FPS columns), names the distinguishing field and value from the publisher table. |
3. Sources merged
The database is built (edgeaistack-api/scripts/build-benchmarks-v2.js) from three inputs:
- Catalog benchmark library (437 rows before dedupe) — EdgeAIStack's existing per-platform benchmark table, sourced from vendor model pages (Ultralytics, Hailo Model Zoo, Google Coral) and NVIDIA-AI-IOT project READMEs.
- Research corpus (118 rows) — the deep-research pipeline's benchmark corpus (
tools/stream-calculator/benchmark-corpus-research.json), aggregated from published community and vendor measurements across platforms not otherwise covered. - LLM/VLM tokens/s (12 rows) — tokens-per-second measurements from the Jetson AI Lab benchmark pass, layered onto the Model Memory Fit registry's Jetson measurements.
Rows without any usable metric (no fps, latency or tokens/s) are dropped at build time.
4. Dedupe rule
Rows are grouped by hardware × model (family + variant) × runtime
× precision × input (resolution + batch). Within a group, the
power_mode is folded in: a row recorded at the
default power mode (the publisher did not state one) merges
into the same slot as an explicit power mode for the same configuration,
rather than creating a second row — so a class-D estimate made before a
power mode was known does not survive alongside the same configuration
measured at, say, maxn_super. Rows for genuinely different
explicit power modes on the same hardware × model × precision keep
separate rows.
Inside one group, the best-evidenced row is kept: higher
evidence class wins (C over D), and within the same class, higher stated
confidence wins. Everything else in the group is recorded on the kept
row's duplicates[] (origin, class, metric value, source doc
id) rather than discarded outright — 96 rows were folded this way across
the current build.
5. Evidence classes
Only two classes appear in this database today; A and B are reserved.
| Class | Meaning |
|---|---|
| C | Measured and published by the source named on the row (a vendor benchmark page, model-zoo table, or a community/research measurement the corpus cites). 163 rows. |
| D | EdgeAIStack-derived — scaled or interpolated from a related measurement, with the derivation basis stated in plain text on the row. 404 rows. |
A (vendor specification) does not apply to a performance number by definition — a spec sheet states a chip's peak TOPS, not a model's measured fps. B (EdgeAIStack measurement) is reserved for rows measured by EdgeAIStack itself under the measurement protocol and reviewed against it; none exist yet. Submit one and it lands here.
6. Expected-range and fallback rules
For a given hardware × model, the expected range per precision is the min / median / max of every matching row (both classes), plus the count and how many of those are class C. This is not a statistical confidence interval — it is the spread of what has actually been reported, which can be wide when sources disagree on measurement conditions (JetPack version, power mode, warm-up).
A power_mode filter on a Jetson module is a ceiling: rows at the
highest supported preset at or below it are returned, and the query publishes the request,
the ceiling and the preset used (query.power_mode_request). A ceiling below every
preset matches no row and says so. On hardware without power-mode presets the value must be
one its rows carry (for example usb3 on the Coral). A value that is none of these
is a validation error naming power_mode — it is never dropped silently.
default means no power-mode filter.
When a precision has no matching row, the engine calls the same estimator hierarchy the Compute Fit engine uses: it tries a class-B (EdgeAIStack measurement), then class-C (measured benchmark), then class-D (derived) source in that order, reports which tier answered, and lists the whole tier chain it walked — so a fallback value is never presented as if it were a measured row. Reference platforms outside the hardware catalog (e.g. NVIDIA A100, T4, V100, Raspberry Pi 5) have no estimator hierarchy to fall back to; an unmatched precision on those platforms reports no value rather than a guess.
7. Comparison rule
The cross-hardware comparison takes the best row per hardware for the same model and precision (highest fps or tokens/s; lowest latency if that is the only metric published), across every hardware that has at least one matching row, and ranks them relative to the fastest. It is a comparison of best-published numbers, not a guarantee every platform was measured under the same conditions — check each row's power mode, input size and runtime before treating the ranking as a like-for-like result.
8. Confidence rule
The rule is deliberately coarse — it is a signal to look at the rows, not a statistical measure. A single class-C row against a wall of class-D estimates for other precisions still reports HIGH or MEDIUM overall depending on the row mix for the exact query; narrow the query (hardware + model + precision) to see the mix that produced the label.
9. Publishers and documents
| Publisher | Document | Covers |
|---|---|---|
| Ultralytics | NVIDIA Jetson guide — YOLO benchmarks | YOLO family on Jetson modules |
| Ultralytics | Raspberry Pi guide — YOLO benchmarks | YOLO family on Raspberry Pi |
| Ultralytics | YOLOv8 model page | YOLOv8 performance table |
| Ultralytics | YOLO11 model page | YOLO11 performance table |
| Ultralytics | YOLOv10 model page | YOLOv10 performance table |
| Ultralytics | RT-DETR model page | RT-DETR performance table |
| Google Coral | Edge TPU benchmarks | Coral Edge TPU throughput |
| Google Coral | Model zoo — image classification | Coral classification models |
| Google Coral | Model zoo — object detection | Coral detection models |
| Google AutoML | EfficientDet repository benchmark table | EfficientDet family |
| Hailo | Hailo Model Zoo — HAILO8 object detection | Hailo-8 detection models |
| Hailo | Hailo Model Zoo — HAILO8 classification | Hailo-8 classification models |
| Hailo | Hailo Model Zoo — HAILO8L object detection | Hailo-8L detection models |
| Hailo | Hailo Model Zoo — HAILO8L classification | Hailo-8L classification models |
| Hailo (community examples) | hailo-rpi5-examples benchmark README | Hailo on Raspberry Pi 5 |
| NVIDIA (NVIDIA-AI-IOT) | nanosam README benchmark table | NanoSAM on Jetson |
| NVIDIA (NVIDIA-AI-IOT) | whisper_trt README benchmark table | Whisper ASR on Jetson |
| MLCommons | MLPerf Inference: Edge results | Cross-vendor edge inference results |
| Hailo | Hailo-8 SDK benchmarks (Model Zoo) | Hailo SDK-reported throughput |
| EdgeAIStack | Benchmark corpus — research-derived rows (P-series) | Class-D derived rows, derivation cited per row |
10. Dataset statistics
| Breakdown | Values |
|---|---|
| Rows | 605 |
| By class | C 310 · D 295 |
| By origin | catalog 480 · research_corpus 113 · p185 12 |
| By runtime | edge tpu 40 · hailo sdk 134 · tensorrt 357 · mlc 4 · pytorch 5 · unspecified 8 · openvino 25 · cpu 5 · rknn 27 |
| By precision | int8 327 · fp16 213 · int4 4 · fp32 32 · unspecified 8 · fp8 21 |
| By task | segmentation 75 · classification 61 · detection 395 · pose 52 · text generation 8 · lidar detection 3d 2 · speech recognition 8 · vision language 4 |
| Hardware | 24 |
| Model families | 49 |
| Deduped | 96 rows folded into duplicates[] during build |
Full breakdown, always current: benchmarks-v2.json (stats object).
11. Coverage gaps
From the research corpus's own gap analysis (tools/stream-calculator/benchmark-corpus-research.json):
- "jetson_agx_thor - only YOLO26 benchmarks available publicly as of 2026-03; no YOLOv8/YOLO11 data"
- "jetson_orin_nano_4gb - no public benchmarks; expect ~55% of Nano 8GB throughput"
- "jetson_agx_orin_32gb - no distinct benchmarks; interpolate between Orin NX and AGX Orin 64GB"
- "whisper models on AGX Orin / Orin NX - only Nano measured by NVIDIA-AI-IOT/whisper_trt"
- "whisper_small on any edge platform - no published measurements found"
- "coral TPU - YOLOv8 incompatible (anchor-free head not fully Edge TPU compilable)"
- "hailo_8 - yolov8l/x too large for on-chip SRAM without model partitioning"
- "NanoSAM on Orin NX - only Nano and AGX Orin measured"
- "raspberry_pi_5 INT8 CPU benchmarks - no INT8 TFLite delegate benchmarks found for detection"
- "intel_nuc - OpenVINO iGPU benchmarks are community-only; no official Intel NUC AI benchmark suite"
These are exactly the configurations where the expected-range table (§6) falls back to the estimator hierarchy rather than a matched row — a submitted measurement for any of them replaces a fallback with a class-C row.
12. What invalidates a result
- A dataset update. Every result URL carries
mv(method version) anddv(dataset version); a newer research pass or measurement submission bumpsdv, and a result page built against an older one says so. - A different power mode, JetPack/SDK version or input size than the row's. Rows are keyed to an exact configuration; a measurement at a different power mode or clock lock can differ meaningfully, especially near thermal limits.
- A class-D row later measured. Submitting a measurement for a configuration that currently only has a class-D estimate replaces it with a class-C row and moves the derived estimate to that row's
duplicates[]. - A coverage gap filled by future research (§11) — the fallback chain reported today may shorten once a real measurement lands.
13. Limitations
- 295 of 605 rows (49%) are class D — EdgeAIStack-derived, not independently measured. Treat any figure without a class-C row nearby as a planning estimate.
- No class-A or class-B rows exist yet; class B is reserved for EdgeAIStack's own measurements once the measurement protocol produces some.
- Publisher measurement conditions (exact JetPack/SDK version, thermal state, warm-up length) are not always fully stated on the source page; where a row's
runtimeis inferred rather than stated, it is flaggedruntime_inferred. - The cross-hardware comparison (§7) does not normalise for different power modes, input sizes or measurement dates across hardware — read each row before treating a ranking as apples-to-apples.
- See §11 for the specific hardware × model combinations known to be unmeasured.
14. Method changelog
| Method | Dataset | Date | Change |
|---|---|---|---|
| 1.4.1 | 2026-09-07 | 2026-09-28 | Input rules (WP-01 remainder, WP-02): limit outside 1–200 is rejected instead of clamped; precision, task, runtime, min_class (C or D) and sort are checked against their lists instead of matching zero rows; limit, min_class and sort defaults are listed in provenance.defaulted. Unknown input keys are rejected. No formula changed. |
| 1.4.0 | 2026-09-07 | 2026-09-27 | The power_mode filter is a ceiling on Jetson modules (highest preset at or below it, published in query.power_mode_request; below every preset → no rows); an unrecognised value is a validation error instead of being dropped and the query running unfiltered. |
| 1.0 | 2026-09-07 | 2026-09-07 | First release. 567 rows across 21 hardware platforms and 49 model families, merged from the catalog benchmark library, the research corpus and the LLM/VLM tokens/s pass, deduplicated to the best-evidenced row per configuration. Expected-range, comparison and confidence rules shared in spirit with the other V2 constraint engines. |
Method changes bump the method version; dataset updates (new research
passes, new measurement submissions) bump the dataset version. Both
appear in the citation block under every result and in the
provenance object of every API response.
Browse the database, or measure your own board.
Every result carries its rows, evidence classes, source lines and a permanent link. Browse the precomputed tree at /benchmarks/, the raw database at benchmarks-v2.json, or read the measurement protocol to submit a class-C row.