Repository navigation
GuideLLM v0.8.0
Overview
GuideLLM v0.8.0 is a major release with several significant new features and improvements that enhance usability.
To get started, install with:
pip install guidellm[recommended]==0.8.0Or from source with:
pip install 'guidellm[recommended] @ git+https://github.com/vllm-project/guidellm.git'@v0.8.0Highlights
WEKA and OTEL replay
GuideLLM can now replay WEKA and OTEL trace datasets, including subagent branches and tool calling. See https://vllm-project.github.io/guidellm/0.8.0/guides/trace_replay/
Backend support
- websockets backend now tracks round-trip metrics
- vLLM in-process batch processing
Configuration (scenario) files
The built-in configuration files (scenarios) have been replaced with more modern and relevant configurations.
- rhaiis/concurrent-100k-1k-equal.json -- very large context
- rhaiis/concurrent-1k-1k-equal.json -- prefill/decode balanced
- rhaiis/concurrent-1k-1k-multiturn.json --- Multi-turn with prefix caching
- rhaiis/concurrent-2ki-128-equal.json -- Prefill-heavy
- rhaiis/concurrent-512-2ki-norm.json -- Generation-heavy
- rhaiis/concurrent-8k-1k-equal.json -- Large context
- rhaiis/concurrent-8k-800-norm.json -- Large context with sequence length
Goodput
GuideLLM can now measure and report performance against a target SLO. The SLO is set using `--metrics '{"kind":"generative","slo":{"ttft_ms":200,"tpot_ms":50}}'. The "Goodput Attainment" will be reported in the console output and in the JSON/CSV benchmark files by percentage and per-second mean.
The Goodput profile will search for the highest load that can meet the SLO specified by --metrics parameters at some target attainment level. For example,
$ guidellm run \
--backend kind=openai_http,target=http://localhost:8000 \
--profile kind=goodput,target_attainment=0.99 \
--data kind=synthetic_text,prompt_tokens=256,output_tokens=128 \
--metrics '{"kind":"generative","slo":{"ttft_ms":200,"tpot_ms":50}}' \
--constraint kind=max_duration,seconds=120Minimum requests constraint
The new min_requests acts like max_requests in every way except that it continues to queue and run new requests after its request count is reached and only stops the benchmark when the count number of requests fully complete. This gives it the advantage of max_seconds where the full request rate is maintained at the end of the benchmark as opposed to max_requests which tails off.
Chinese documentation
Contributor @tangming1996 has begun a project to translate GuideLLM documentation into Chinese, beginning with the "Getting started" section. See https://vllm-project.github.io/guidellm/0.8.0/zh/
New HTML output
New HTML output (--output kind=html) is a single file that's more easily transportable.
Using SQL datasets
You can now use a SQLite3 database as a data source by specifying the SQLAlchemy URI and a SQL query string: for example, --data kind=db_file,uri=sqlite:///prompts.db,load_kwargs.sql="SELECT text FROM samples"
Change Log
Features
- Partial WEKA Trace Format Support (without subagents) by @SkiHatDuckie in #972
- Subagent Conversation Support by @jaredoconnell in #935
- feat: capture cached_tokens from prompt_tokens_details in usage metrics by @flexwang in #994
- Add WebSocket round-trip metrics (Time To Last Round Trip and Avg RTT) by @dreamer-89 in #850
- Switch current trace formats to use a DAG by @SkiHatDuckie in #1012
- Add vLLM Python batch backend for micro-batched inference by @maryamtahhan in #736
- Move entrypoint configs to top-level
schemassubmodule by @sjmonson in #1016 - Minimal Self-Contained HTML Report by @jaredoconnell in #1032
- Fix & Replace Builtin Scenarios by @sjmonson in #1064
- Add scheduler dispatch delay and schedule-relative latency metrics by @QHarshil in #1053
- WEKA Subagent Support + Tool Calls by @jaredoconnell in #1071
- Add multimodal support to the mock server by @rishabhsinha17 in #1056
- Add goodput measurement against per-request latency objectives by @QHarshil in #1085
- Do not default to sweep profile by @sjmonson in #1135
- Add min_requests constraint by @sjmonson in #1116
- Add logic for global and local hash IDs for trace formats by @jaredoconnell in #1134
- Log benchmark progress by default alongside the Rich display by @provoke210 in #1115
- Add Request Totals to Console output & Clear progress at the end of the benchmark by @sjmonson in #1149
- Add goodput profile to search for peak load under latency objectives by @QHarshil in #1086
- Fix multimodal data drop when combined with synthetic text in one message by @sharonh24 in #1148
- Pass a backend's per-request metrics through to the compiled stats by @wenxuan-elastix in #1159
- Implement
copiesfeature for synthetic traces by @jaredoconnell in #1155 - OTeL trace support by @jaredoconnell in #1153
- Simplify benchmark_generative_text interface by @sjmonson in #1185
- Add context length cap to weka by @sjmonson in #1177
- Turn predecessor delay and scheduler delay metrics by @jaredoconnell in #1191
- Trace Relative Timing by @jaredoconnell in #1190
- feat(metrics): add per-turn-position metrics for multi-turn workloads by @huangpengtao00-dotcom in #1181
- Add confidence intervals for request-level metrics by @QHarshil in #1163
- Add generation_delay metric by @sjmonson in #1200
Bug fixes
- fix(openai): allow opting out of ignore_eos for end-of-turn-sensitive models (#979) by @Anai-Guo in #982
- Fix multipart filenames for audio uploads by @fedirz in #990
- Fix non-streaming audio response parsing by @fedirz in #981
- Fix encoded audio sample frame metrics by @fedirz in #987
- Fix extras typestubs by @sjmonson in #893
- fix(openai): capture cached_tokens for Responses API usage metrics by @Smallfu666 in #1014
- fix: return a Dataset from file dataset deserializers by @Pragadeesh122 in #1013
- fix: use spawn multiprocessing context on macOS by @nightcityblade in #1026
- fix: keep GHCR latest/stable as multi-arch manifests by @amit-chaubey in #1018
- Reject duplicate unrepeatable kind-type registry-backed click options by @jaredoconnell in #1023
- Report worker 0 correctly in RequestInfo.scheduler_node_id by @himanshu1573 in #1044
- fix: splice mid-chain last-edge merges into walk-back position by @AmirF194 in #1030
- Defer entrypoint imports and switch to spawn as default MP context by @sjmonson in #1058
- fix: make terminal request bookkeeping idempotent under max_duration cancellation by @AmirF194 in #1055
- Pull pending requests into a worker only when a consumer is waiting by @himanshu1573 in #1042
- fix: reject empty trace conversations by @tangming1996 in #1054
- fix: ensure backend cleanup after resolution errors by @tangming1996 in #1074
- fix: validate only the required columns in trace files by @QHarshil in #1072
- Fix/stalled scheduled requests by @jaredoconnell in #1080
- Added options to better manage trace request timing by @jaredoconnell in #1081
- Fix inconsistent dataset split resolving by @sjmonson in #1088
- fix: don't start in-process backends in the main process by @Pragadeesh122 in #1084
- fix: serialize audio translation filename by @tangming1996 in #1096
- fix(openai): accept SSE DONE markers without a space by @git-jxj in #1106
- Trace dataset deserialization cleanup by @sjmonson in #1092
- fix(openai): surface nested Responses streaming errors by @git-jxj in #1107
- fix(openai): validate non-streaming tool calls before yielding by @DivyamTalwar in #1099
- Address review comments from WEKA Subagent PR by @jaredoconnell in #1093
- Fix a bunch of issues with logging by @sjmonson in #1070
- fix: replay flat trace rows as independent conversations by @git-jxj in #1118
- Fix invalid format placeholder in mock server error logging by @tayoogunbiyi in #1142
- fix: export tool call metrics to CSV by @tangming1996 in #1097
- Bound token events by when they occur by @sjmonson in #1079
- fix: preserve resize dimensions for image URLs by @git-jxj in #1172
- fix: load SQLite dataset files through a database connection by @git-jxj in #1094
- Few Small Cleanup items before v0.8.0 by @sjmonson in #1208
Documentation
- docs: add Kubernetes/OpenShift client Job example by @amit-chaubey in #1031
- docs: fix broken backend link by @tangming1996 in #1051
- docs: fix multiturn backend example by @tangming1996 in #1052
- docs: clarify default benchmark outputs by @tangming1996 in #1077
- feat(docs): add Chinese translation pilot by @tangming1996 in #1164
- docs: correct benchmark constraint parameter names by @git-jxj in #1184
CI & environment
- Weekly report skill by @dbutenhof in #991
- Drop the development container CI build by @sjmonson in #1005
- Refactor to improve E2E test reliability and not depend on HF servers by @jaredoconnell in #1017
- Add Import checker to CI by @sjmonson in #1047
- Attempt to make test less flaky by @jaredoconnell in #1087
- Fix more flaky tests by reducing reliance on time-only blocking by @jaredoconnell in #1089
- Ignore default plot output by @tangming1996 in #1119
- Fix CI by making replay test deterministic by @jaredoconnell in #1128
- Increase timeout for integration test by @jaredoconnell in #1154
- Add a CODEOWNERS by @sjmonson in #1165
- Add a message to users waiting on second approval by @sjmonson in #1169
- ci: prevent broken pipe in PR formatter by @tangming1996 in #1171
- docs: move English docs under en by @tangming1996 in #1170
- Improvement to team status skill by @dbutenhof in #1157
- Fix an action version comment to match SHA by @dbutenhof in #1187
Dependency updates
- Bump aiohttp from 3.14.1 to 3.14.3 by @dependabot[bot] in #995
- Bump h2 from 4.3.0 to 4.4.1 by @dependabot[bot] in #1011
- [GitHub Actions]: Bump redhat-actions/push-to-registry from 2.8 to 3 by @dependabot[bot] in #1037
- [GitHub Actions]: Bump redhat-actions/buildah-build from 2.13 to 3 by @dependabot[bot] in #1036
- [GitHub Actions]: Bump redhat-actions/buildah-build from 3.0.2 to 3.1.0 by @dependabot[bot] in #1062
- build(deps): Bump transformers from 5.5.0 to 5.10.1 by @dependabot[bot] in #1076
- [GitHub Actions]: Bump docker/setup-qemu-action from 4.2.0 to 4.3.0 by @dependabot[bot] in #1129
- build(deps): Bump anyio from 4.12.0 to 4.14.2 by @dependabot[bot] in #1162
- Bump pygments v2.19.2 -> v2.21.0 by @sjmonson in #1174
- [GitHub Actions]: Bump docker/setup-qemu-action from 4.3.0 to 4.4.0 by @dependabot[bot] in #1178
New Contributors
- @flexwang made their first contribution in #994
- @fedirz made their first contribution in #990
- @Smallfu666 made their first contribution in #1014
- @dreamer-89 made their first contribution in #850
- @nightcityblade made their first contribution in #1026
- @amit-chaubey made their first contribution in #1018
- @himanshu1573 made their first contribution in #1044
- @AmirF194 made their first contribution in #1030
- @tangming1996 made their first contribution in #1051
- @QHarshil made their first contribution in #1053
- @DivyamTalwar made their first contribution in #1099
- @rishabhsinha17 made their first contribution in #1056
- @provoke210 made their first contribution in #1115
- @tayoogunbiyi made their first contribution in #1142
- @sharonh24 made their first contribution in #1148
- @wenxuan-elastix made their first contribution in #1159
- @huangpengtao00-dotcom made their first contribution in #1181
Full Changelog: v0.7.4...v0.8.0