Known limitations
Honest scope for Metrum AI Bench CLI at the 1.0 line. See also Comparison and Performance Methodology.
Client-side only
Bench is a load-generation client. It measures what the client observes (send, first byte, first visible token, body complete, errors). It cannot observe GPU utilization, KV-cache state, or scheduler internals on the server except when you optionally scrape a metrics URL from the strategic runner.
Gateways that synthesize streaming
Gateways that synthesize SSE from unary upstream calls report total latency as TTFT. This behavior is undetectable client-side.
SUT is declared, not verified
--sut / --require-sut (when present) embed an operator-supplied
system-under-test block into the run summary for publication. They do not
probe the remote host, confirm GPU SKU, driver, or engine version, or prove
that the declared SUT matches the endpoint you hit. A mismatched or empty
declaration is a policy/process failure, not something the client can detect.
Performance, not quality (except ASR)
Headline outputs are latency, throughput, goodput under SLOs, and related
distributions. The only built-in quality scores are ASR WER/CER (with
--normalizer). There is no general task accuracy, judge score, or agent
success metric in 1.0.
No agent mode
Multi-turn / tool / schema paths on strategic are request validity helpers, not an agent evaluation harness.
No cost per accepted task
Token, dollar, or “accepted task” cost accounting is not in 1.0 (roadmap: next release, no date).
Open-loop and closed-loop
Both modes exist: omit --request-rate for closed-loop concurrency; set
--request-rate (and optional --arrival poisson) for open-loop. Open-loop
coordinated-omission latency is the headline field when scheduling is
open-loop. Do not compare open-loop and closed-loop numbers as if they were
the same experiment.
Pooled multi-endpoint = mixture
When requests are distributed across endpoints, aggregate distributions are
labeled pooled_mixture. Use per_endpoint for diagnosis; do not treat the
pool as a single homogeneous replica.
Percentile unreliability at small n
p99 is marked p99_unreliable when fewer than 100 samples exist.
Small-n p95/p90 also carry p95_unreliable / p90_unreliable flags. Treat
tail percentiles accordingly at small n.
Single node / single client process
One Bench process drives one endpoint or one configured pool. Fleet-wide comparison, history, and attestation are Platform concerns, not this OSS client.
Published smoke matrix is NVIDIA-only
AMD Instinct coverage is in progress. No comparative vendor results are published in the repository smoke matrix.
MLPerf export is unofficial
--mlperf-dir writes parser-oriented LoadGen-shaped files marked UNOFFICIAL
and never emits bare Result is : VALID. It is not a submission.
Partial runs
Interrupted runs can write partial: true. Do not treat a partial summary as a
complete campaign cell without checking that flag and sample counts. A hard
kill may leave valid request lines without a summary.
Prompt-library mixes vs llm scheduling
metrum-ai-bench-prompts can solve for ISL/OSL mean or median within
tolerances, including by repeating rows or leaving the preferred --count.
metrum-ai-bench-llm still shuffles --prompts and cycles with modulo
indexing under a global --max-tokens. The selected mix is preserved only
when --num-requests equals the extractor's selected_count and
--warmup-requests is 0. Warmup or a mismatched request count changes the
measured mix. Repeats in the JSONL are solver output for length statistics,
not a claim about prompt diversity or answer quality.
Optional features and platforms
GitHub Release binaries include otlp but not tokenizer. Windows has no
release archives. See Platforms.