GuideLLM and vLLM comparison
This procedure compares the two HTTP benchmark clients against the same vLLM server. It uses the fixed four-prompt dataset, one request at a time, greedy sampling, and a fixed eight-token output budget. Run each client against a freshly restarted server with the same model and server flags. Keep both raw JSON files; never compare a hand-normalized copy.
Recorded settings
| Setting | Value |
|---|---|
| Dataset | docs/assets/backend-comparison.jsonl, four prompts in file order |
| Endpoint | /v1/completions on 127.0.0.1:8000 |
| Requests | 4, max_requests=4 / num-prompts=4 |
| Concurrency | 1 (synchronous / max-concurrency=1) |
| Arrival | Immediate (request-rate=inf) |
| Sampling | temperature=0, top_p=1 |
| EOS | ignore_eos=true in both clients |
| Output | 8 requested tokens per request |
| Server | Same model, vLLM flags, port, and environment for both runs |
Run
From the repository root on native Linux, set an absolute model path and create an empty evidence directory:
MODEL=/models/your-model
rm -rf comparison-evidence
mkdir -p comparison-evidence/guidellm comparison-evidence/vllm
Restart the same server before each client. Save the server log separately for each run. Then execute:
vllm serve "$MODEL" --host 127.0.0.1 --port 8000 \
> comparison-evidence/guidellm/vllm.log 2>&1 &
SERVER_PID=$!
trap 'kill "$SERVER_PID" 2>/dev/null || true' EXIT
guidellm run \
--backend '{"kind":"openai_http","target":"http://127.0.0.1:8000","model":"'"$MODEL"'","request_format":"/v1/completions","extras":{"body":{"temperature":0,"top_p":1,"ignore_eos":true}}}' \
--profile kind=synchronous \
--constraint kind=max_requests,count=4 \
--data kind=json_file,path=docs/assets/backend-comparison.jsonl \
--output kind=json,path=comparison-evidence/guidellm/results.json
kill "$SERVER_PID"; wait "$SERVER_PID" 2>/dev/null || true
trap - EXIT
Repeat the server start with its log redirected to vllm/vllm.log, then run:
vllm serve "$MODEL" --host 127.0.0.1 --port 8000 \
> comparison-evidence/vllm/vllm.log 2>&1 &
SERVER_PID=$!
trap 'kill "$SERVER_PID" 2>/dev/null || true' EXIT
vllm bench serve --backend vllm --model "$MODEL" \
--host 127.0.0.1 --port 8000 --endpoint /v1/completions \
--dataset-name custom --dataset-path docs/assets/backend-comparison.jsonl \
--num-prompts 4 --max-concurrency 1 --request-rate inf \
--custom-output-len 8 --temperature 0 --top-p 1 --ignore-eos \
--save-result --result-dir comparison-evidence/vllm \
--result-filename results.json --disable-tqdm
kill "$SERVER_PID"; wait "$SERVER_PID" 2>/dev/null || true
trap - EXIT
Compare
Record the installed vLLM, GuideLLM, Python, model, GPU, and server flags next to the evidence. Compare these fields without silently changing definitions:
| Canonical unit | GuideLLM source | vLLM source |
|---|---|---|
| Request total | request_totals |
num_prompts |
| Successful/failed | request_totals.successful, .errored, .incomplete |
completed, failed, and num_prompts |
| Requests/s | requests_per_second |
request_throughput |
| Output tokens/s | output_tokens_per_second |
output_throughput |
| TTFT | time_to_first_token_ms |
mean_ttft_ms and percentile fields |
| End-to-end latency | request_latency converted seconds to milliseconds |
mean_e2el_ms and percentile fields |
GuideLLM and vLLM may differ in measurement-window boundaries, request scheduling overhead, token counting, and percentile implementation. Report those differences beside the raw values. A matching request total is necessary but does not make latency or throughput definitions identical.