AIPerf
Benchmark any inference endpoint with production-shaped traffic, and get the metrics that decide your SLA.
A benchmark that doesn't look like production tells you the wrong answer
same server · same config
Same server, two answers. Real prompt lengths and bursts cut throughput ~5× and exposed context-window failures that uniform synthetic prompts hide.
Three planes, so measuring never gets in the way of sending
~10 services in separate processes, talking over ZMQ. Press → to follow one request.
① Credit. The Timing Manager sends a credit, permission to send exactly one request, to a worker.
② Data. The worker reads its prompt from memory-mapped dataset files. No copies, no waiting.
③ Request. The worker sends it to your server and timestamps every streamed chunk.
④ Return. The credit goes back to the Timing Manager. A slow server means fewer free credits: natural backpressure.
⑤ Records. Raw results go to Record Processors, which scale with load and compute per-request metrics.
⑥ Results. The Records Manager aggregates and exports, alongside GPU and server metrics.
Shape the traffic exactly: closed loop, open loop, or replay a trace
--arrival-smoothness0.4--concurrency-ramp-durationWarm-up--warmup-request-countCap prefill--prefill-concurrencyUsers--user-centric-rate --num-usersCancel--request-cancellation-rateDon't guess the operating point. Sweep it, or let AIPerf search for it.
TTFT SLA (ms)600From synthetic prompts to real agent sessions, byte for byte
--isl 4000 --osl 500--public-dataset sharegpt--custom-dataset-type mooncake_trace--scenario inferencex-agentx-mvp--endpoint-type image_generation--endpoint-type chat --streamingEvery token is timed. Goodput counts only the requests that met the SLA.
TTFT SLO (ms)600ITL SLO (ms)30
👆 Click any dot to see that request above. Drag the SLOs to move the box.
One run: a console table, exports, plots, and live telemetry
Every run exports artifacts/<run>/profile_export_aiperf.csv · .json · per-request .jsonl · parquet · timeslices
aiperf plot --theme dark example from the docs · numbers = concurrency · hover a point--ui-type dashboard · default in interactive terminals · live while the run is going--gpu-telemetry DCGM · --server-metrics on by defaultstream to --otel-url · --mlflow-tracking-uri · --wandb-projectRun it in the cluster, next to the model, as a Kubernetes job
helm install aiperf-operator \
oci://ghcr.io/ai-dynamo/charts/aiperf-operator \
-n aiperf-system --create-namespace
# one benchmark, or an in-cluster search
aiperf kube profile ...
aiperf kube sweep ...
aiperf kube dashboard
Beta in v0.13.0. CRDs: AIPerfJob, AIPerfSweep.
The harness behind public benchmarks and cloud recommendations
One install, one command
pip install aiperf
aiperf profile \
--model Qwen/Qwen3-0.6B \
--url localhost:8000 \
--endpoint-type chat --streaming \
--concurrency 8,16,32,64 \
--goodput "time_to_first_token:600" \
--auto-plot