跳到内容

Benchmark CLI

本节指导您如何使用 vLLM 支持的广泛数据集运行基准测试。

这是一份实时文档,随着新功能和数据集的发布会不断更新。

提示

本页面描述的基准测试主要用于评估特定的 vLLM 功能以及进行回归测试。

对于生产环境下的 vLLM 服务器基准测试,我们推荐使用 GuideLLM,这是一个成熟的性能基准测试框架,具有实时进度更新和自动报告生成功能。在数据集加载、请求格式化和工作负载模式方面,它比 vllm bench serve 更灵活。

数据集概述

数据集 在线 离线 数据路径
ShareGPT wget https://hugging-face.cn/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json
ShareGPT4V (图像) wget https://hugging-face.cn/datasets/Lin-Chen/ShareGPT4V/resolve/main/sharegpt4v_instruct_gpt4-vision_cap100k.json
注意,图像需要单独下载。例如,下载 COCO 2017 训练集图像:
wget http://images.cocodataset.org/zips/train2017.zip
ShareGPT4Video (视频) git clone https://hugging-face.cn/datasets/ShareGPT4Video/ShareGPT4Video
BurstGPT wget https://github.com/HPMLL/BurstGPT/releases/download/v1.1/BurstGPT_without_fails_2.csv
Sonnet (已弃用) 本地文件:benchmarks/sonnet.txt
随机 合成 (synthetic)
RandomMultiModal (图像/视频) 合成 (synthetic)
RandomForReranking 合成 (synthetic)
前缀重复 合成 (synthetic)
HuggingFace-VisionArena lmarena-ai/VisionArena-Chat
HuggingFace-MMVU yale-nlp/MMVU
HuggingFace-InstructCoder likaixin/InstructCoder
HuggingFace-AIMO AI-MO/aimo-validation-aime, AI-MO/NuminaMath-1.5, AI-MO/NuminaMath-CoT
HuggingFace-Other lmms-lab/LLaVA-OneVision-Data, Aeala/ShareGPT_Vicuna_unfiltered
HuggingFace-MTBench philschmid/mt-bench
HuggingFace-Blazedit vdaita/edit_5k_char, vdaita/edit_10k_char
HuggingFace-ASR openslr/librispeech_asr, facebook/voxpopuli, LIUM/tedlium, edinburghcstr/ami, speechcolab/gigaspeech, kensho/spgispeech
Spec Bench wget https://raw.githubusercontent.com/hemingkx/Spec-Bench/refs/heads/main/data/spec_bench/question.jsonl
自定义 本地文件:data.jsonl
自定义 MM 本地文件:mm_data.jsonl

图例

  • ✅ - 支持
  • 🟡 - 部分支持
  • 🚧 - 即将支持

注意

HuggingFace 数据集的 dataset-name 应设置为 hf。对于本地 dataset-path,请将 hf-name 设置为其 Hugging Face ID,例如:

--dataset-path /datasets/VisionArena-Chat/ --hf-name lmarena-ai/VisionArena-Chat

示例

🚀 在线基准测试

显示更多

首先启动您的模型服务

vllm serve NousResearch/Hermes-3-Llama-3.1-8B

然后运行基准测试脚本

# download dataset
# wget https://hugging-face.cn/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json
vllm bench serve \
  --backend vllm \
  --model NousResearch/Hermes-3-Llama-3.1-8B \
  --endpoint /v1/completions \
  --dataset-name sharegpt \
  --dataset-path <your data path>/ShareGPT_V3_unfiltered_cleaned_split.json \
  --num-prompts 10

如果成功,您将看到以下输出

============ Serving Benchmark Result ============
Successful requests:                     10
Benchmark duration (s):                  5.78
Total input tokens:                      1369
Total generated tokens:                  2212
Request throughput (req/s):              1.73
Output token throughput (tok/s):         382.89
Total token throughput (tok/s):          619.85
---------------Time to First Token----------------
Mean TTFT (ms):                          71.54
Median TTFT (ms):                        73.88
P99 TTFT (ms):                           79.49
-----Time per Output Token (excl. 1st token)------
Mean TPOT (ms):                          7.91
Median TPOT (ms):                        7.96
P99 TPOT (ms):                           8.03
---------------Inter-token Latency----------------
Mean ITL (ms):                           7.74
Median ITL (ms):                         7.70
P99 ITL (ms):                            8.39
==================================================

自定义数据集

如果您要进行基准测试的数据集 vLLM 尚未支持,您仍然可以使用 CustomDataset 进行测试。您的数据需要为 .jsonl 格式,并且每条记录必须包含“prompt”字段,例如 data.jsonl

{"prompt": "What is the capital of India?"}
{"prompt": "What is the capital of Iran?"}
{"prompt": "What is the capital of China?"}
# start server
vllm serve meta-llama/Llama-3.1-8B-Instruct
# run benchmarking script
vllm bench serve --port 9001 --save-result --save-detailed \
  --backend vllm \
  --model meta-llama/Llama-3.1-8B-Instruct \
  --endpoint /v1/completions \
  --dataset-name custom \
  --dataset-path <path-to-your-data-jsonl> \
  --custom-skip-chat-template \
  --num-prompts 80 \
  --max-concurrency 1 \
  --temperature=0.3 \
  --top-p=0.75 \
  --result-dir "./log/"

如果您的数据已经包含了聊天模板,可以使用 --custom-skip-chat-template 跳过应用模板的过程。

自定义多模态数据集

如果您要进行基准测试的多模态数据集 vLLM 尚未支持,您可以使用 CustomMMDataset 进行测试。您的数据需要为 .jsonl 格式,且每条记录必须包含“prompt”和“image_files”字段,例如 mm_data.jsonl

{"prompt": "How many animals are present in the given image?", "image_files": ["/path/to/image/folder/horsepony.jpg"]}
{"prompt": "What colour is the bird shown in the image?", "image_files": ["/path/to/image/folder/flycatcher.jpeg"]}
# need a model with vision capability here
vllm serve Qwen/Qwen2-VL-7B-Instruct
# run benchmarking script
vllm bench serve--save-result --save-detailed \
  --backend openai-chat \
  --model Qwen/Qwen2-VL-7B-Instruct \
  --endpoint /v1/chat/completions \
  --dataset-name custom_mm \
  --dataset-path <path-to-your-mm-data-jsonl> \
  --allowed-local-media-path /path/to/image/folder

注意,对于多模态输入,我们需要使用 openai-chat 后端和 /v1/chat/completions 端点。

VisionArena 视觉语言模型基准测试

# need a model with vision capability here
vllm serve Qwen/Qwen2-VL-7B-Instruct
vllm bench serve \
  --backend openai-chat \
  --model Qwen/Qwen2-VL-7B-Instruct \
  --endpoint /v1/chat/completions \
  --dataset-name hf \
  --dataset-path lmarena-ai/VisionArena-Chat \
  --hf-split train \
  --num-prompts 1000

InstructCoder 投机采样基准测试

vllm serve meta-llama/Meta-Llama-3-8B-Instruct \
    --speculative-config $'{"method": "ngram",
    "num_speculative_tokens": 5, "prompt_lookup_max": 5,
    "prompt_lookup_min": 2}'
vllm bench serve \
    --model meta-llama/Meta-Llama-3-8B-Instruct \
    --dataset-name hf \
    --dataset-path likaixin/InstructCoder \
    --num-prompts 2048

Spec Bench 投机采样基准测试

vllm serve meta-llama/Meta-Llama-3-8B-Instruct \
    --speculative-config $'{"method": "ngram",
    "num_speculative_tokens": 5, "prompt_lookup_max": 5,
    "prompt_lookup_min": 2}'

SpecBench 数据集

运行所有类别

# Download the dataset using:
# wget https://raw.githubusercontent.com/hemingkx/Spec-Bench/refs/heads/main/data/spec_bench/question.jsonl

vllm bench serve \
    --model meta-llama/Meta-Llama-3-8B-Instruct \
    --dataset-name spec_bench \
    --dataset-path "<YOUR_DOWNLOADED_PATH>/data/spec_bench/question.jsonl" \
    --num-prompts -1

可用类别包括 [writing, roleplay, reasoning, math, coding, extraction, stem, humanities, translation, summarization, qa, math_reasoning, rag]

仅运行特定类别,例如“summarization”

vllm bench serve \
    --model meta-llama/Meta-Llama-3-8B-Instruct \
    --dataset-name spec_bench \
    --dataset-path "<YOUR_DOWNLOADED_PATH>/data/spec_bench/question.jsonl" \
    --num-prompts -1
    --spec-bench-category "summarization"

其他 HuggingFace 数据集示例

vllm serve Qwen/Qwen2-VL-7B-Instruct

lmms-lab/LLaVA-OneVision-Data:

vllm bench serve \
  --backend openai-chat \
  --model Qwen/Qwen2-VL-7B-Instruct \
  --endpoint /v1/chat/completions \
  --dataset-name hf \
  --dataset-path lmms-lab/LLaVA-OneVision-Data \
  --hf-split train \
  --hf-subset "chart2text(cauldron)" \
  --num-prompts 10

Aeala/ShareGPT_Vicuna_unfiltered:

vllm bench serve \
  --backend openai-chat \
  --model Qwen/Qwen2-VL-7B-Instruct \
  --endpoint /v1/chat/completions \
  --dataset-name hf \
  --dataset-path Aeala/ShareGPT_Vicuna_unfiltered \
  --hf-split train \
  --num-prompts 10

AI-MO/aimo-validation-aime:

vllm bench serve \
    --model Qwen/QwQ-32B \
    --dataset-name hf \
    --dataset-path AI-MO/aimo-validation-aime \
    --num-prompts 10 \
    --seed 42

philschmid/mt-bench:

vllm bench serve \
    --model Qwen/QwQ-32B \
    --dataset-name hf \
    --dataset-path philschmid/mt-bench \
    --num-prompts 80

vdaita/edit_5k_charvdaita/edit_10k_char

vllm bench serve \
    --model Qwen/QwQ-32B \
    --dataset-name hf \
    --dataset-path vdaita/edit_5k_char \
    --num-prompts 90 \
    --blazedit-min-distance 0.01 \
    --blazedit-max-distance 0.99

openslr/librispeech_asr, facebook/voxpopuli, LIUM/tedlium, edinburghcstr/ami, speechcolab/gigaspeech, kensho/spgispeech

vllm bench serve \
    --model openai/whisper-large-v3-turbo \
    --backend openai-audio \
    --dataset-name hf \
    --dataset-path facebook/voxpopuli --hf-subset en --hf-split test --no-stream --trust-remote-code \
    --num-prompts 99999999 \
    --no-oversample \
    --endpoint /v1/audio/transcriptions \
    --ready-check-timeout-sec 600 \
    --save-result \
    --max-concurrency 512

使用采样参数运行

使用兼容 OpenAI 的后端(如 vllm)时,可以指定可选的采样参数。客户端命令示例:

vllm bench serve \
  --backend vllm \
  --model NousResearch/Hermes-3-Llama-3.1-8B \
  --endpoint /v1/completions \
  --dataset-name sharegpt \
  --dataset-path <your data path>/ShareGPT_V3_unfiltered_cleaned_split.json \
  --top-k 10 \
  --top-p 0.9 \
  --temperature 0.5 \
  --num-prompts 10

使用请求速率爬坡运行

基准测试工具还支持在测试期间逐步提高请求速率。这对于压力测试服务器或在给定的延迟预算下寻找最大吞吐量非常有用。

支持两种爬坡策略

  • linear(线性):请求速率从起始值线性增加到结束值。
  • exponential(指数):请求速率呈指数增长。

以下参数可用于控制爬坡:

  • --ramp-up-strategy:使用的爬坡策略(linearexponential)。
  • --ramp-up-start-rps:基准测试开始时的请求速率。
  • --ramp-up-end-rps:基准测试结束时的请求速率。

负载模式配置

vLLM 的基准测试脚本通过三个关键参数提供复杂的负载模式模拟能力,这些参数控制着请求生成和并发行为:

负载模式控制参数
  • --request-rate:控制目标请求生成速率(每秒请求数)。设置为 inf 进行最大吞吐量测试,或设置为有限值进行受控负载模拟。
  • --burstiness:使用 Gamma 分布控制流量变化(范围:> 0)。值越小流量越具有突发性,值越大流量越均匀。
  • --max-concurrency:限制并发未完成的请求数。如果不提供此参数,则并发无限制。设置一个值可模拟反压(backpressure)。

这些参数协同工作以创建具有精心选择默认值的真实负载模式。--request-rate 参数默认为 inf(无限),即立即发送所有请求以进行最大吞吐量测试。当设置为有限值时,它使用泊松过程(默认 --burstiness=1.0)或 Gamma 分布来获取真实的请求时序。--burstiness 参数仅在 --request-rate 不是无限时生效——值为 1.0 时产生自然的泊松流量,值较小 (0.1-0.5) 时产生突发模式,值较大 (2.0-5.0) 时产生均匀间隔。--max-concurrency 参数默认为 None(无限),但可设置为模拟现实世界中的限制,即负载均衡器或 API 网关限制并发连接。结合使用这些参数,您可以模拟从无限制压力测试 (--request-rate=inf) 到具有真实到达模式和资源限制的生产环境场景。

--burstiness 参数通过 Gamma 分布在数学上控制请求到达模式,其中:

  • 形状参数:burstiness
  • 变异系数 (CV):\(\frac{1}{\sqrt{burstiness}}\)
  • 流量特征
    • burstiness = 0.1:高突发流量 (CV ≈ 3.16) - 用于压力测试
    • burstiness = 1.0:自然泊松流量 (CV = 1.0) - 用于真实模拟
    • burstiness = 5.0:均匀流量 (CV ≈ 0.45) - 用于受控负载测试

Load Pattern Examples

图表:各用例的负载模式示例。顶部:显示随时间累积请求的请求到达时间线。底部:显示流量变化模式的到达间隔时间分布。每列代表一个具有特定参数设置和最终流量特征的不同用例。

按用例推荐的负载模式

Use Case 突发性 (Burstiness) 请求速率 最大并发 描述
最大吞吐量 不适用 无限 受限 最常用:模拟带有无限用户需求下的负载均衡器/网关限制
真实测试 1.0 中等 (5-20) 无限 用于基线性能的自然泊松流量模式
压力测试 0.1-0.5 高 (20-100) 无限 挑战性的突发模式以测试弹性
延迟分析 2.0-5.0 低 (1-10) 无限 用于一致时序分析的均匀负载
容量规划 1.0 可变 受限 在真实约束下测试资源限制
SLA 验证 1.0 目标速率 SLA 限制 用于合规性测试的生产环境约束

这些负载模式有助于评估 vLLM 部署的各个方面,从基本性能特征到在挑战性流量条件下的弹性。

最大吞吐量模式 (--request-rate=inf --max-concurrency=<limit>) 是生产环境基准测试中最常用的配置。这模拟了现实世界的部署架构,其中:

  • 用户以其所能达到的最快速度发送请求(无限速率)
  • 负载均衡器或 API 网关控制最大并发连接数
  • 系统在并发限制下运行,揭示真实的吞吐量容量
  • 由于速率无限时不控制请求时序,--burstiness 不起作用

此模式有助于确定生产环境负载均衡器配置的最佳并发设置。

要有效配置负载模式(特别是针对容量规划SLA 验证用例),您需要了解系统的资源限制。在启动时,vLLM 会报告直接影响负载测试参数的 KV 缓存配置:

GPU KV cache size: 15,728,640 tokens
Maximum concurrency for 8,192 tokens per request: 1920

其中

  • GPU KV 缓存大小:所有并发请求中可缓存的总 token 数
  • 最大并发:给定 max_model_len 下的理论最大并发请求数
  • 计算:max_concurrency = kv_cache_size / max_model_len

使用 KV 缓存指标进行负载模式配置

  • 用于容量规划:将 --max-concurrency 设置为报告最大值的 80-90%,以测试真实的资源约束
  • 用于 SLA 验证:使用报告的最大值作为您的 SLA 限制,以确保合规性测试与生产容量匹配
  • 用于真实测试:当接近理论极限时监控内存使用情况,以了解可持续的请求速率
  • 请求速率建议:使用 KV 缓存大小来估算针对特定工作负载和序列长度的可持续请求速率

📈 离线吞吐量基准测试

显示更多
vllm bench throughput \
  --model NousResearch/Hermes-3-Llama-3.1-8B \
  --dataset-name sonnet \
  --dataset-path vllm/benchmarks/sonnet.txt \
  --num-prompts 10

如果成功,您将看到以下输出

Throughput: 7.15 requests/s, 4656.00 total tokens/s, 1072.15 output tokens/s
Total num prompt tokens:  5014
Total num output tokens:  1500

VisionArena 视觉语言模型基准测试

vllm bench throughput \
  --model Qwen/Qwen2-VL-7B-Instruct \
  --backend vllm-chat \
  --dataset-name hf \
  --dataset-path lmarena-ai/VisionArena-Chat \
  --num-prompts 1000 \
  --hf-split train

num prompt tokens 现在包含了图像 token 计数

Throughput: 2.55 requests/s, 4036.92 total tokens/s, 326.90 output tokens/s
Total num prompt tokens:  14527
Total num output tokens:  1280

InstructCoder 投机采样基准测试

VLLM_WORKER_MULTIPROC_METHOD=spawn \
vllm bench throughput \
    --dataset-name=hf \
    --dataset-path=likaixin/InstructCoder \
    --model=meta-llama/Meta-Llama-3-8B-Instruct \
    --input-len=1000 \
    --output-len=100 \
    --num-prompts=2048 \
    --async-engine \
    --speculative-config $'{"method": "ngram",
    "num_speculative_tokens": 5, "prompt_lookup_max": 5,
    "prompt_lookup_min": 2}'
Throughput: 104.77 requests/s, 23836.22 total tokens/s, 10477.10 output tokens/s
Total num prompt tokens:  261136
Total num output tokens:  204800

其他 HuggingFace 数据集示例

lmms-lab/LLaVA-OneVision-Data:

vllm bench throughput \
  --model Qwen/Qwen2-VL-7B-Instruct \
  --backend vllm-chat \
  --dataset-name hf \
  --dataset-path lmms-lab/LLaVA-OneVision-Data \
  --hf-split train \
  --hf-subset "chart2text(cauldron)" \
  --num-prompts 10

Aeala/ShareGPT_Vicuna_unfiltered:

vllm bench throughput \
  --model Qwen/Qwen2-VL-7B-Instruct \
  --backend vllm-chat \
  --dataset-name hf \
  --dataset-path Aeala/ShareGPT_Vicuna_unfiltered \
  --hf-split train \
  --num-prompts 10

AI-MO/aimo-validation-aime:

vllm bench throughput \
  --model Qwen/QwQ-32B \
  --backend vllm \
  --dataset-name hf \
  --dataset-path AI-MO/aimo-validation-aime \
  --hf-split train \
  --num-prompts 10

使用 LoRA 适配器进行基准测试

# download dataset
# wget https://hugging-face.cn/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json
vllm bench throughput \
  --model meta-llama/Llama-2-7b-hf \
  --backend vllm \
  --dataset_path <your data path>/ShareGPT_V3_unfiltered_cleaned_split.json \
  --dataset_name sharegpt \
  --num-prompts 10 \
  --max-loras 2 \
  --max-lora-rank 8 \
  --enable-lora \
  --lora-path yard1/llama-2-7b-sql-lora-test

合成随机多模态 (random-mm)

生成合成多模态输入以进行离线吞吐量测试,无需外部数据集。使用 --backend vllm-chat 以确保图像 token 被正确计算。

vllm bench throughput \
  --model Qwen/Qwen2-VL-7B-Instruct \
  --backend vllm-chat \
  --dataset-name random-mm \
  --num-prompts 100 \
  --random-input-len 300 \
  --random-output-len 40 \
  --random-mm-base-items-per-request 2 \
  --random-mm-limit-mm-per-prompt '{"image": 3, "video": 0}' \
  --random-mm-bucket-config '{(256, 256, 1): 0.7, (720, 1280, 1): 0.3}'

🛠️ 结构化输出基准测试

显示更多

基准测试结构化输出生成(JSON、语法、正则表达式)的性能。

服务器设置

vllm serve NousResearch/Hermes-3-Llama-3.1-8B

JSON Schema 基准测试

python3 benchmarks/benchmark_serving_structured_output.py \
  --backend vllm \
  --model NousResearch/Hermes-3-Llama-3.1-8B \
  --dataset json \
  --structured-output-ratio 1.0 \
  --request-rate 10 \
  --num-prompts 1000

基于语法的生成基准测试

python3 benchmarks/benchmark_serving_structured_output.py \
  --backend vllm \
  --model NousResearch/Hermes-3-Llama-3.1-8B \
  --dataset grammar \
  --structure-type grammar \
  --request-rate 10 \
  --num-prompts 1000

基于正则表达式的生成基准测试

python3 benchmarks/benchmark_serving_structured_output.py \
  --backend vllm \
  --model NousResearch/Hermes-3-Llama-3.1-8B \
  --dataset regex \
  --request-rate 10 \
  --num-prompts 1000

基于选择的生成基准测试

python3 benchmarks/benchmark_serving_structured_output.py \
  --backend vllm \
  --model NousResearch/Hermes-3-Llama-3.1-8B \
  --dataset choice \
  --request-rate 10 \
  --num-prompts 1000

XGrammar 基准测试数据集

python3 benchmarks/benchmark_serving_structured_output.py \
  --backend vllm \
  --model NousResearch/Hermes-3-Llama-3.1-8B \
  --dataset xgrammar_bench \
  --request-rate 10 \
  --num-prompts 1000

📚 长文档 QA 基准测试

显示更多

使用前缀缓存对长文档问答性能进行基准测试。

基础长文档 QA 测试

python3 benchmarks/benchmark_long_document_qa_throughput.py \
  --model meta-llama/Llama-2-7b-chat-hf \
  --enable-prefix-caching \
  --num-documents 16 \
  --document-length 2000 \
  --output-len 50 \
  --repeat-count 5

不同的重复模式

# Random mode (default) - shuffle prompts randomly
python3 benchmarks/benchmark_long_document_qa_throughput.py \
  --model meta-llama/Llama-2-7b-chat-hf \
  --enable-prefix-caching \
  --num-documents 8 \
  --document-length 3000 \
  --repeat-count 3 \
  --repeat-mode random

# Tile mode - repeat entire prompt list in sequence
python3 benchmarks/benchmark_long_document_qa_throughput.py \
  --model meta-llama/Llama-2-7b-chat-hf \
  --enable-prefix-caching \
  --num-documents 8 \
  --document-length 3000 \
  --repeat-count 3 \
  --repeat-mode tile

# Interleave mode - repeat each prompt consecutively
python3 benchmarks/benchmark_long_document_qa_throughput.py \
  --model meta-llama/Llama-2-7b-chat-hf \
  --enable-prefix-caching \
  --num-documents 8 \
  --document-length 3000 \
  --repeat-count 3 \
  --repeat-mode interleave

🗂️ 前缀缓存基准测试

显示更多

对自动前缀缓存的效率进行基准测试。

带前缀缓存的固定 Prompt

python3 benchmarks/benchmark_prefix_caching.py \
  --model meta-llama/Llama-2-7b-chat-hf \
  --enable-prefix-caching \
  --num-prompts 1 \
  --repeat-count 100 \
  --input-length-range 128:256

带前缀缓存的 ShareGPT 数据集

# download dataset
# wget https://hugging-face.cn/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json

python3 benchmarks/benchmark_prefix_caching.py \
  --model meta-llama/Llama-2-7b-chat-hf \
  --dataset-path /path/ShareGPT_V3_unfiltered_cleaned_split.json \
  --enable-prefix-caching \
  --num-prompts 20 \
  --repeat-count 5 \
  --input-length-range 128:256
前缀重复数据集
vllm bench serve \
  --backend openai \
  --model meta-llama/Llama-2-7b-chat-hf \
  --dataset-name prefix_repetition \
  --num-prompts 100 \
  --prefix-repetition-prefix-len 512 \
  --prefix-repetition-suffix-len 128 \
  --prefix-repetition-num-prefixes 5 \
  --prefix-repetition-output-len 128

🧪 哈希基准测试

显示更多

benchmarks/ 中有两个辅助脚本,用于比较前缀缓存及相关实用程序所使用的哈希选项。它们是独立的(无需服务器),有助于在生产环境中启用前缀缓存前选择哈希算法。

  • benchmarks/benchmark_hash.py:微基准测试,测量三种实现在代表性 (bytes, tuple[int]) 有效载荷上的单次调用延迟。
python benchmarks/benchmark_hash.py --iterations 20000 --seed 42
  • benchmarks/benchmark_prefix_block_hash.py:端到端块哈希基准测试,运行完整的前缀缓存哈希流水线 (hash_block_tokens),处理大量伪造块并报告吞吐量。
python benchmarks/benchmark_prefix_block_hash.py --num-blocks 20000 --block-size 32 --trials 5

支持的算法:sha256, sha256_cbor, xxhash, xxhash_cbor。安装可选依赖以测试所有变体。

uv pip install xxhash cbor2

如果缺少某个算法的依赖项,脚本将跳过它并继续。

⚡ 请求优先级基准测试

显示更多

对 vLLM 中请求优先级的性能进行基准测试。

基础优先级测试

python3 benchmarks/benchmark_prioritization.py \
  --model meta-llama/Llama-2-7b-chat-hf \
  --input-len 128 \
  --output-len 64 \
  --num-prompts 100 \
  --scheduling-policy priority

每个 Prompt 多条序列

python3 benchmarks/benchmark_prioritization.py \
  --model meta-llama/Llama-2-7b-chat-hf \
  --input-len 128 \
  --output-len 64 \
  --num-prompts 100 \
  --scheduling-policy priority \
  --n 2

👁️ 多模态基准测试

显示更多

对 vLLM 中多模态请求的性能进行基准测试。

图像 (ShareGPT4V)

启动 vLLM

vllm serve Qwen/Qwen2.5-VL-7B-Instruct \
  --dtype bfloat16 \
  --limit-mm-per-prompt '{"image": 1}' \
  --allowed-local-media-path /path/to/sharegpt4v/images

发送带图像的请求

vllm bench serve \
  --backend openai-chat \
  --model Qwen/Qwen2.5-VL-7B-Instruct \
  --dataset-name sharegpt \
  --dataset-path /path/to/ShareGPT4V/sharegpt4v_instruct_gpt4-vision_cap100k.json \
  --num-prompts 100 \
  --save-result \
  --result-dir ~/vllm_benchmark_results \
  --save-detailed \
  --endpoint /v1/chat/completions

视频 (ShareGPT4Video)

启动 vLLM

vllm serve Qwen/Qwen2.5-VL-7B-Instruct \
  --dtype bfloat16 \
  --limit-mm-per-prompt '{"video": 1}' \
  --allowed-local-media-path /path/to/sharegpt4video/videos

发送带视频的请求

vllm bench serve \
  --backend openai-chat \
  --model Qwen/Qwen2.5-VL-7B-Instruct \
  --dataset-name sharegpt \
  --dataset-path /path/to/ShareGPT4Video/llava_v1_5_mix665k_with_video_chatgpt72k_share4video28k.json \
  --num-prompts 100 \
  --save-result \
  --result-dir ~/vllm_benchmark_results \
  --save-detailed \
  --endpoint /v1/chat/completions

合成随机图像 (random-mm)

生成合成图像输入以及随机文本提示,在没有外部数据集的情况下对视觉模型进行压力测试。

注意事项

  • 对于在线基准测试,请使用 --backend openai-chat 和端点 /v1/chat/completions
  • 对于离线基准测试,请使用 --backend vllm-chat(示例见离线吞吐量基准测试)。

启动服务器(示例)

vllm serve Qwen/Qwen2.5-VL-3B-Instruct \
  --dtype bfloat16 \
  --max-model-len 16384 \
  --limit-mm-per-prompt '{"image": 3, "video": 0}' \
  --mm-processor-kwargs max_pixels=1003520

基准测试。建议使用 --ignore-eos 标志来模拟真实响应。您可以通过参数 random-output-len 设置输出大小。

例 1:固定数量的项和单一图像分辨率,强制生成约 40 个 token

vllm bench serve \
  --backend openai-chat \
  --model Qwen/Qwen2.5-VL-3B-Instruct \
  --endpoint /v1/chat/completions \
  --dataset-name random-mm \
  --num-prompts 100 \
  --max-concurrency 10 \
  --random-prefix-len 25 \
  --random-input-len 300 \
  --random-output-len 40 \
  --random-range-ratio 0.2 \
  --random-mm-base-items-per-request 2 \
  --random-mm-limit-mm-per-prompt '{"image": 3, "video": 0}' \
  --random-mm-bucket-config '{(224, 224, 1): 1.0}' \
  --request-rate inf \
  --ignore-eos \
  --seed 42

可以通过传递多个图像 bucket 来控制每个请求的项数

  --random-mm-base-items-per-request 2 \
  --random-mm-num-mm-items-range-ratio 0.5 \
  --random-mm-limit-mm-per-prompt '{"image": 4, "video": 0}' \
  --random-mm-bucket-config '{(256, 256, 1): 0.7, (720, 1280, 1): 0.3}' \

random-mm 专用标志

  • --random-mm-base-items-per-request:每个请求的基础多模态项数。
  • --random-mm-num-mm-items-range-ratio:在整数范围 [floor(n·(1−r)), ceil(n·(1+r))] 内均匀改变项数。设置 r=0 可保持固定;r=1 允许 0 项。
  • --random-mm-limit-mm-per-prompt:每种模态的硬性上限,例如 '{"image": 3, "video": 0}'。
  • --random-mm-bucket-config:将 (H, W, T) 映射到概率的字典。概率为 0 的条目会被删除;剩余概率归一化后总和为 1。图像使用 T=1。设置 T>1 用于视频(目前尚不支持视频采样)。

行为说明

  • 如果请求的基础项数无法在提供的单 Prompt 限制下满足,工具会报错而不是静默截断。

采样工作原理

  • 确定每个请求的项数 k:从 --random-mm-base-items-per-request--random-mm-num-mm-items-range-ratio 定义的整数范围内均匀采样,然后将 k 截断至不超过各模态上限之和。
  • 对于 k 个项中的每一个,根据 --random-mm-bucket-config 中的归一化概率采样一个 bucket (H, W, T),同时跟踪已添加的每种模态的项数。
  • 如果某种模态(如图像)达到了 --random-mm-limit-mm-per-prompt 的上限,则该模态的所有 bucket 将被排除,剩余 bucket 的概率会在继续前重新归一化。这应被视为边缘情况,如果通过设置较大的 --random-mm-limit-mm-per-prompt 可以避免此行为。注意,这可能会因为引擎配置 --limit-mm-per-prompt 而导致错误。
  • 生成的请求在 multi_modal_data(OpenAI 聊天格式)中包含合成图像数据。当 random-mm 与 OpenAI Chat 后端一起使用时,Prompt 保持为文本,而多模态内容通过 multi_modal_data 附加。

🔬 多模态处理器基准测试

基准测试多模态 (MM) 输入处理器流水线的各个阶段延迟,包括编码器前向传播。这对于分析视觉语言模型中的预处理瓶颈非常有用。

显示更多

基准测试会测量每个请求的以下阶段:

阶段 描述
get_mm_hashes_secs 哈希多模态输入所花费的时间
get_cache_missing_items_secs 查找处理器缓存所花费的时间
apply_hf_processor_secs 在 HuggingFace 处理器中花费的时间
merge_mm_kwargs_secs 合并多模态 kwargs 所花费的时间
apply_prompt_updates_secs 更新 Prompt token 所花费的时间
preprocessor_total_secs 预处理总耗时
encoder_forward_secs 编码器模型前向传播所花费的时间
num_encoder_calls 每个请求的编码器调用次数

基准测试还会报告每个请求的端到端延迟(TTFT + 解码时间)。使用 --metric-percentiles 选择要报告的百分位数(默认:p99),并使用 --output-json 保存结果。

基于合成数据的基本示例 (random-mm)

vllm bench mm-processor \
  --model Qwen/Qwen2-VL-7B-Instruct \
  --dataset-name random-mm \
  --num-prompts 50 \
  --random-input-len 300 \
  --random-output-len 40 \
  --random-mm-base-items-per-request 2 \
  --random-mm-limit-mm-per-prompt '{"image": 3, "video": 0}' \
  --random-mm-bucket-config '{(256, 256, 1): 0.7, (720, 1280, 1): 0.3}'

使用 HuggingFace 数据集

vllm bench mm-processor \
  --model Qwen/Qwen2-VL-7B-Instruct \
  --dataset-name hf \
  --dataset-path lmarena-ai/VisionArena-Chat \
  --hf-split train \
  --num-prompts 100

预热、自定义百分位数和 JSON 输出

vllm bench mm-processor \
  --model Qwen/Qwen2-VL-7B-Instruct \
  --dataset-name random-mm \
  --num-prompts 200 \
  --num-warmups 5 \
  --random-input-len 300 \
  --random-output-len 40 \
  --random-mm-base-items-per-request 1 \
  --metric-percentiles 50,90,95,99 \
  --output-json results.json

请参阅 vllm bench mm-processor 获取完整参数参考。

Embedding 基准测试

对 vLLM 中 Embedding 请求的性能进行基准测试。

显示更多

文本 Embedding

与使用 Completions API 或 Chat Completions API 的生成模型不同,您应设置 --backend openai-embeddings--endpoint /v1/embeddings 来使用 Embedding API。

您可以使用任何文本数据集对模型进行基准测试,例如 ShareGPT。

启动服务器

vllm serve jinaai/jina-embeddings-v3 --trust-remote-code

运行基准测试

# download dataset
# wget https://hugging-face.cn/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json
vllm bench serve \
  --model jinaai/jina-embeddings-v3 \
  --backend openai-embeddings \
  --endpoint /v1/embeddings \
  --dataset-name sharegpt \
  --dataset-path <your data path>/ShareGPT_V3_unfiltered_cleaned_split.json

多模态 Embedding

与使用 Completions API 或 Chat Completions API 的生成模型不同,您应设置 --endpoint /v1/embeddings 来使用 Embedding API。使用的后端取决于模型:

  • CLIP: --backend openai-embeddings-clip
  • VLM2Vec: --backend openai-embeddings-vlm2vec

对于其他模型,请在 vllm/benchmarks/lib/endpoint_request_func.py 中添加自己的实现,以匹配预期的指令格式。

只要模型支持,您可以使用任何文本或多模态数据集对模型进行基准测试。例如,可以使用 ShareGPT 和 VisionArena 来基准测试视觉语言 Embedding。

服务并基准测试 CLIP

# Run this in another process
vllm serve openai/clip-vit-base-patch32

# Run these one by one after the server is up
# download dataset
# wget https://hugging-face.cn/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json
vllm bench serve \
  --model openai/clip-vit-base-patch32 \
  --backend openai-embeddings-clip \
  --endpoint /v1/embeddings \
  --dataset-name sharegpt \
  --dataset-path <your data path>/ShareGPT_V3_unfiltered_cleaned_split.json

vllm bench serve \
  --model openai/clip-vit-base-patch32 \
  --backend openai-embeddings-clip \
  --endpoint /v1/embeddings \
  --dataset-name hf \
  --dataset-path lmarena-ai/VisionArena-Chat

服务并基准测试 VLM2Vec

# Run this in another process
vllm serve TIGER-Lab/VLM2Vec-Full --runner pooling \
  --trust-remote-code \
  --chat-template examples/template_vlm2vec_phi3v.jinja

# Run these one by one after the server is up
# download dataset
# wget https://hugging-face.cn/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json
vllm bench serve \
  --model TIGER-Lab/VLM2Vec-Full \
  --backend openai-embeddings-vlm2vec \
  --endpoint /v1/embeddings \
  --dataset-name sharegpt \
  --dataset-path <your data path>/ShareGPT_V3_unfiltered_cleaned_split.json

vllm bench serve \
  --model TIGER-Lab/VLM2Vec-Full \
  --backend openai-embeddings-vlm2vec \
  --endpoint /v1/embeddings \
  --dataset-name hf \
  --dataset-path lmarena-ai/VisionArena-Chat

重排序器 (Reranker) 基准测试

对 vLLM 中重排序请求的性能进行基准测试。

显示更多

与使用 Completions API 或 Chat Completions API 的生成模型不同,您应设置 --backend vllm-rerank--endpoint /v1/rerank 来使用 Reranker API。

对于重排序,唯一支持的数据集是 --dataset-name random-rerank

启动服务器

vllm serve BAAI/bge-reranker-v2-m3

运行基准测试

vllm bench serve \
  --model BAAI/bge-reranker-v2-m3 \
  --backend vllm-rerank \
  --endpoint /v1/rerank \
  --dataset-name random-rerank \
  --tokenizer BAAI/bge-reranker-v2-m3 \
  --random-input-len 512 \
  --num-prompts 10 \
  --random-batch-size 5

对于重排序模型,这将创建 num_prompts / random_batch_size 个请求,其中包含 random_batch_size 个“文档”,每个文档接近 random_input_len 个 token。在上面的示例中,这会产生 2 个重排序请求,每个请求包含 5 个“文档”,每个文档接近 512 个 token。

请注意,/v1/rerank 也受 Embedding 模型支持。因此,如果您在运行 Embedding 模型,请同时设置 --no_reranker。在这种情况下,查询被服务器视为单独的 Prompt,这里我们发送 random_batch_size - 1 个文档,以核算作为查询的额外 Prompt。为了正确报告吞吐量数字,token 计算也会相应调整。