Repeatable LLM inference benchmarks for OpenShift.
Note
This project is experimental and for learning purposes mainly, but the implemented execution paths today are llm-d and RHOAI. Expect some parts to still be highly coupled.
BenchFlow is a packaged control plane for running benchmark scenarios, not a loose collection of scripts. It resolves an experiment into one immutable RunPlan, executes it through Tekton PipelineRuns, captures metrics and artifacts, and pushes the result to MLflow. The current benchmark backends are vllm-project/guidellm and a narrow AIPerf trace replay path with explicit Mooncake and Weka benchmark profiles.
Warning
BenchFlow now locks shared llm-d and RHOAI platform mutations per target cluster by setup key. Same-key runs can share a wave and use spare GPUs in parallel; different-key runs wait until the current admitted wave finishes. Shared platform prerequisites stay installed until a different setup key is requested or you explicitly tear them down.
Install the CLI from the repository root:
pip install -e .For local development, install the dev extra and enable the pre-commit hooks:
pip install -e '.[dev]'
pre-commit installBefore bootstrapping, create the real secret manifests next to the examples under config/cluster/secrets/. BenchFlow applies every *.yaml file there except *.example.yaml, so cp the examples secrets and remove the .example suffix, and populate them with your credentials.
BenchFlow supports two cluster topologies.
bflow bootstrap --single-cluster
bflow experiment run experiments/smoke/qwen3-06b-llm-d-smoke.yamlBenchFlow installs Tekton, Kueue, the BenchFlow remote-capacity controller, Grafana, RBAC, GPU prerequisites, and the required PVCs in the same cluster. Kueue admits runs locally against the discovered GPU capacity, and Tekton runs the full workflow there. GPU prerequisites include DCGM exporter metrics and the ServiceMonitor used by BenchFlow system metrics.
Management cluster:
bflow bootstrapTarget cluster(s):
bflow bootstrap --target-kubeconfig ~/.kube/target-cluster --cluster-name target-clusterRun from the management cluster:
bflow experiment run experiments/smoke/qwen3-06b-llm-d-smoke.yaml --cluster-name target-clusterIn this mode, the management cluster runs Tekton, Kueue, and the BenchFlow remote-capacity controller. Kueue queues executions by target cluster and admits them only when the target has enough GPU capacity. The target cluster does not need Tekton; BenchFlow launches the runtime work there through plain Kubernetes Jobs using the stored kubeconfig Secret.
Target bootstrap also reconciles DCGM exporter metrics unless accelerator prerequisites are explicitly disabled.
The narrow path is the shipped smoke experiment:
bflow experiment run experiments/smoke/qwen3-06b-llm-d-smoke.yamlThen follow the execution:
bflow watch <execution-name> --namespace benchflowBenchFlow also supports matrix experiments by turning one or more profile fields into lists; the cluster then runs the cartesian product through child executions. rhoai and llm-d child executions can be admitted in parallel when target-cluster GPU capacity allows it. After all child executions finish, the parent prints a compact MLflow run summary. Once the parent has submitted child executions, canceling the parent is only best-effort; already queued or running children may need individual cancellation.
For the full command surface, RunPlan PipelineRun flow, matrix execution, and lower-level runtime commands, see docs/ADVANCED.md.
- The current AIPerf support is intentionally narrow: the explicit
aiperf-mooncake-trace,aiperf-mooncake-toolagent-trace, andaiperf-weka-tracebenchmark profiles for existing chat-style endpoints. It is not generic AIPerf support. - Comparison reports do not mix benchmark tools.
bflow benchmark plot comparisoncan compare multiple GuideLLM runs or multiple AIPerf runs, but not both in one report. - Legacy target clusters without BenchFlow platform state are adopted heuristically; the first mutating run after upgrading BenchFlow may reset and reinstall shared
llm-dorRHOAIprerequisites. - BenchFlow coordinates only the shared platform state it manages itself. Manual or out-of-band cluster mutations are not version-reconciled.
llm-dmatrix children depend on release-scoped chart values; use the current BenchFlow image when testing parallel llm-d runs.- Matrix parent cancellation is best-effort after child executions have already been submitted; queued or running children may need to be cancelled individually.
- BenchFlow manages GuideLLM benchmark output paths itself.
GUIDELLM_OUTPUT_DIRis set automatically during benchmark execution, andGUIDELLM_OUTPUT_PATHis not supported in benchmark environment overrides.