External Benchmarks¶
External inference benchmarks are performance priors for Anvil Serving. They help answer:
External sources report that model X on RTX PRO 6000 with vLLM/NVFP4 at 32K context usually lands around Y tok/s. Our local serve fingerprint lands at Z tok/s, with these flags and these methodology differences.
They are not local qualification truth. Preflight and repeated local quality evaluation against the exact served model, engine, and hardware determine whether an operator should use that serve behind a capability alias.
Curated DeepSeek V4 Flash 0731 prior¶
The 2026-08-01
DeepSeek V4 Flash 0731 research update
is the current curated external-prior for this model. Its
source registry
pins the publisher release-weight and current documentation revisions,
Artificial Analysis result, vLLM/SGLang recipes, community 0731 NVFP4
artifacts, and the Unsloth GGUF collection.
Decision-critical boundaries:
- 0731 is a distinct re-post-trained generation even though it retains the V4 Flash architecture.
- Artificial Analysis independently supports the intelligence claim but also records exceptionally high output-token use.
- NVIDIA's official DeepSeek V4 Flash NVFP4 artifact is Preview, not 0731.
- Current 0731 NVFP4 evidence is community-authored: TP=2 on two DGX Spark systems or TP=4 on four RTX PRO 6000 cards does not prove dual-PRO TP=2.
- DSpark can improve interactive decode while remaining neutral at saturated concurrency, and mixed NVFP4-target/MXFP4-draft routing has a silent zero-acceptance failure mode in the strongest current SM120 report.
- The exact publisher checkpoint now has a separate pinned r16 local lane with
low/high/max reasoning, DSpark K5, 128K, and same-image no-spec evidence.
It remains
no-promotionbecause both profiles failed the 3 GiB free-VRAM policy. Community 0731 NVFP4 and 256K local context remain unqualified.
The local result and raw A/B are published separately in the r16 qualification; they do not convert the external rows into local measurements.
Do not import the external throughput rows into a local leaderboard without retaining GPU count, engine revision, TP/EP shape, speculative state, concurrency, and perplexity/quality differences.
Choose a workflow¶
| Goal | Command |
|---|---|
| Create the local evidence store | eval benchmark external init |
| See adapters and their latest snapshots | eval benchmark external sources |
| Fetch and import a live snapshot | eval benchmark external fetch |
| Import a retained snapshot without network access | eval benchmark external import |
| Browse normalized rows | eval benchmark external list |
| Render filtered Markdown or JSON | eval benchmark external report |
| Export normalized rows | eval benchmark external export |
| Compare a local capacity artifact with external priors | eval benchmark external compare |
| Record a local quality artifact in the comparison notebook | eval benchmark external notebook add |
| List retained notebook runs | eval benchmark external notebook list |
| Render notebook scores and verdicts | eval benchmark external notebook render |
Add --help after any command path for its complete operands, filters, and defaults. External
rows are advisory priors; only local quality evidence can support a deployment decision.
Supported Sources¶
Supported source adapters:
llmrequirements: machine-readable model/build recipe priors fromllmrequirements.com/data/db.json.millstone: Millstone AI LLM inference benchmark snapshots.rtx6kpro:local-inference-lab/rtx6kproRTX PRO 6000 Blackwell community inference-throughput JSON artifacts.
The Millstone adapter does not assume a stable public API. It supports:
fetchmode for downloading and storing a raw snapshot from a configured URL.importmode for importing a previously saved JSON, CSV, Markdown, or HTML snapshot from disk.
The rtx6kpro v1 adapter is intentionally narrower. It imports individual raw JSON artifacts only:
benchmarks/inference-throughput/*.jsonmodels/glm5.1/benchmarks/**/decode-matrix.json
It does not crawl the whole GitHub repository or wiki, and it does not ingest Markdown, CSV, quality benchmarks, hardware/network/power benchmarks, or prose as deployment truth. Non-JSON imports still store the raw snapshot and mark parsing failed with a message pointing users to the machine-readable JSON artifacts.
The llmrequirements adapter reproduces the site's Q4 fit and parameter-bucket
speed estimates from its JSON database. These are editorial recipe priors, not
per-model measurements. The normalized row preserves the site's ratings,
benchmark claims, source links, fit estimate, and build record in
raw_metrics_json; its methodology warning explicitly prevents treating the
row as promotion-quality evidence.
Import mode is the foundation for tests and reproducible comparisons. It never needs network access.
Every snapshot stores the raw file path, source URL or import path, fetch/import timestamp, parser name and version, SHA256 content hash, parse status, and parse error if parsing fails.
Initialize A Store¶
anvil-serving eval benchmark external init --db .anvil/benchmarks.sqlite --dry-run
anvil-serving eval benchmark external init --db .anvil/benchmarks.sqlite --confirm
This creates a local SQLite store with tables for sources, raw snapshots, normalized benchmark rows, serve fingerprints, and comparison records.
Import A Saved Snapshot¶
anvil-serving eval benchmark external import \
--source millstone \
--file tests/fixtures/external_benchmarks/millstone_sample.json \
--db .anvil/benchmarks.sqlite \
--confirm
For rtx6kpro, save a raw JSON artifact first, then import that file:
anvil-serving eval benchmark external import \
--source rtx6kpro \
--file tests/fixtures/external_benchmarks/rtx6kpro_qwen_vllm_mtp.json \
--db .anvil/benchmarks.sqlite \
--confirm
The raw snapshot is copied under .anvil/external-benchmarks/raw/ when the DB lives under .anvil/. Parser failures are non-destructive: the raw snapshot stays stored, the snapshot row is marked failed, and the CLI prints the parse error.
Fetch A Live Snapshot¶
anvil-serving eval benchmark external fetch \
--source millstone \
--url https://example.com/millstone-snapshot.html \
--db .anvil/benchmarks.sqlite \
--confirm
For rtx6kpro, fetch individual raw GitHub JSON files rather than repository or wiki pages:
anvil-serving eval benchmark external fetch \
--source rtx6kpro \
--url https://raw.githubusercontent.com/local-inference-lab/rtx6kpro/master/benchmarks/inference-throughput/vllm_awq_mtp.json \
--db .anvil/benchmarks.sqlite \
--confirm
For the llmrequirements recipe database, fetch the machine-readable data file, not the dynamically rendered picker page:
anvil-serving eval benchmark external fetch \
--source llmrequirements \
--url https://llmrequirements.com/data/db.json \
--db .anvil/benchmarks.sqlite \
--confirm
Use fetch mode only when you explicitly want live network access. Tests and fixture-based workflows should use import mode.
List RTX PRO 6000 Rows¶
anvil-serving eval benchmark external list \
--gpu "RTX PRO 6000" \
--top 20 \
--db .anvil/benchmarks.sqlite
GPU names are normalized conservatively. These all map to rtx_pro_6000_blackwell_96gb:
RTX PRO 6000 BlackwellRTX PRO 6000RTX Pro 6000NVIDIA RTX PRO 6000 Blackwell 96GB
RTX 5090 variants map to rtx_5090_32gb.
Generate A Markdown Report¶
anvil-serving eval benchmark external report \
--gpu "RTX PRO 6000" \
--format markdown \
--db .anvil/benchmarks.sqlite
The output is a Markdown table suitable for docs or README inclusion.
Use External Priors For Voice Model A/B¶
For OpenClaw Talk or other voice-latency experiments, external benchmark rows are only a candidate-selection aid. They can help decide which local model to test first, but they do not prove tool-call behavior, session-memory behavior, audio turn latency, or promotion safety.
The practical workflow is:
- Start from the current local baseline in
configs/serve-recipes.toml. - Use
anvil-serving eval benchmark external sourcesandanvil-serving eval benchmark external reportto find advisory throughput or TTFT priors for the same GPU family. - Mark any candidate that needs a model download, cache deletion, new image, new port, cloud API usage, or current-serve disruption as human-gated.
- Run local
preflight,benchmark, andvoice benchmarkbefore any live Talk trial. - Promote nothing from external priors alone.
The dated findings under docs/findings/ should record why a candidate was
included or rejected, the exact serve recipe used, and whether the evidence came
from local measurement or an external advisory source.
Export Rows¶
anvil-serving eval benchmark external export \
--format json \
--out external-benchmarks.json \
--db .anvil/benchmarks.sqlite \
--confirm
Mutation commands support --dry-run and require the shared confirmation gate for apply.
Fetch and import inputs are capped at 16 MiB, and fetches use a bounded 30-second request.
Exports validate the destination before reading the store, replace atomically, and preserve an
existing regular file as a numbered .anvil.bak.N backup.
The export contains normalized benchmark rows with their source and snapshot metadata.
Compare A Local Anvil Run¶
anvil-serving eval benchmark external compare \
--local tests/fixtures/external_benchmarks/local_benchmark_sample.json \
--gpu "RTX PRO 6000" \
--db .anvil/benchmarks.sqlite
The comparison matches external rows by:
- Normalized GPU name.
- Model family or normalized model id.
- Engine, when known.
- Precision or quantization, when known.
- Context-length bucket.
- Concurrency bucket.
If an exact match is not available, the report shows the nearest external row and explains the mismatches.
The report includes the local serve fingerprint, nearest external source, local and external throughput, delta percentage, TTFT when available, context/concurrency mismatch warnings, and methodology warnings.
Important warning example:
Local run used NEXTN speculative decoding; external baseline did not report speculative decoding. Throughput delta is not an apples-to-apples model/engine comparison.
Retain quality runs in the notebook¶
The notebook stores local protocol evidence separately from imported performance priors. It
accepts only protocol-v3 artifacts containing an explicit ranking suite, a strong
exact_choice or typed_structure validator, and at least three attempts per check. Legacy or
diagnostic-only artifacts cannot produce notebook wins. Record one completed quality artifact
with its task and hardware identity:
anvil-serving eval benchmark external notebook add \
--evidence primary-quality.json \
--task primary \
--hardware rtx-pro-6000 \
--db .anvil/benchmarks.sqlite \
--confirm
List the latest run per candidate, or add --all to inspect the append history:
anvil-serving eval benchmark external notebook list \
--task primary \
--hardware rtx-pro-6000 \
--db .anvil/benchmarks.sqlite
Render a comparison matrix and choose an explicit baseline when useful:
anvil-serving eval benchmark external notebook render \
--task primary \
--hardware rtx-pro-6000 \
--baseline current-primary \
--db .anvil/benchmarks.sqlite
Notebook verdicts summarize retained evidence; they do not promote a model or change the active capability alias or serve configuration.
Agent MCP Advisory Workflow¶
Agents should prefer the MCP/controller wrappers when they need external benchmark priors:
external_bench_sourcesexternal_bench_listexternal_bench_reportexternal_bench_compare
Every wrapper returns advisory_only: true and
promotion_quality_evidence: false. external_bench_compare returns structured
local-vs-external deltas for throughput and TTFT, plus exact/nearest match
metadata. The MCP wrappers read initialized benchmark stores only: they do not
import snapshots, initialize a missing DB, or record comparison history. Use the
CLI init, import, fetch, or compare commands when you intentionally want
those persistent writes. Workflow packets may include MCP results in
advisory_priors, but workflow_packet_validate rejects priors that lack
advisory_only: true and promotion_quality_evidence: false, and still
requires a human-approved serves_promote result before any packet can claim
promoted: true.
Local Benchmark JSON¶
anvil-serving eval benchmark capacity keeps concise console output. For comparison workflows,
write an artifact with --output:
anvil-serving eval benchmark capacity \
--base-url http://127.0.0.1:30000/v1 \
--model local-specialist \
--burst 20 \
--output local-benchmark.json \
--confirm
Add GPU, engine, quantization, and serve flags to the JSON when the benchmark command cannot infer them from the endpoint. The compare command accepts the fields used in tests/fixtures/external_benchmarks/local_benchmark_sample.json.
Serve Fingerprints¶
A serve fingerprint identifies a local serving setup:
- model id and served model name
- engine and engine version
- precision and quantization
- GPU model and GPU count
- context limit
- KV cache dtype
- reasoning parser and tool-call parser
- serve flags
The fingerprint hash is stored with comparison records so an engine, quant, parser, context, or serve-flag change does not get confused with a prior local measurement.
Known Limitations¶
- External benchmarks are advisory only. They never silently become quality gates.
- Millstone is parsed from snapshots, not from a guaranteed API contract.
llmrequirementsrows are Q4 build-bucket estimates. They do not identify an engine or prove per-model throughput, concurrency, or quality.rtx6kprov1 supports individual JSON artifacts only. Whole-repo crawling, wiki ingestion, quality CSVs such as GPQA/GSM8K/HardMath, and hardware/network/power benchmarks are out of scope until Anvil has separate schemas for those priors.- HTML and Markdown parsing is table-oriented. Highly irregular pages may require saving a cleaner snapshot or adding source-specific extraction logic.
- Methodology fields are best-effort. If a source does not report prompt cache, speculative decoding, tokenizer details, or sampling settings, Anvil reports that as a comparison caveat.
- Wrapper names such as LM Studio or Ollama UI should be treated as wrappers. Store the underlying engine when known, such as
vLLM,SGLang,TensorRT-LLM,llama.cpp,ExLlamaV3,Transformers, orKTransformers.
Add Another Source Adapter¶
- Add an adapter in
anvil_serving/external_benchmarks/sources/. - Subclass
SourceAdapterand return aParseResult. - Preserve raw snapshots by using the shared CLI/store path. Do not parse before storage.
- Normalize rows through
normalize_external_row()unless the source already emits the exact internal fields. - Register the adapter in
sources/__init__.py. - Add offline fixtures under
tests/fixtures/external_benchmarks/. - Add tests that import from disk. Do not require network access.