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,例如:
示例¶
🚀 在线基准测试¶
显示更多
首先启动您的模型服务
然后运行基准测试脚本
# 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?"}
# 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"]}
# 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 视觉语言模型基准测试¶
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}'
运行所有类别
# 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 数据集示例¶
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_char 或 vdaita/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:使用的爬坡策略(linear或exponential)。--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) - 用于受控负载测试
图表:各用例的负载模式示例。顶部:显示随时间累积请求的请求到达时间线。底部:显示流量变化模式的到达间隔时间分布。每列代表一个具有特定参数设置和最终流量特征的不同用例。
按用例推荐的负载模式
| 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 缓存大小:所有并发请求中可缓存的总 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、语法、正则表达式)的性能。
服务器设置¶
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 基准测试数据集¶
📚 长文档 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
前缀重复数据集¶
🧪 哈希基准测试¶
显示更多
benchmarks/ 中有两个辅助脚本,用于比较前缀缓存及相关实用程序所使用的哈希选项。它们是独立的(无需服务器),有助于在生产环境中启用前缀缓存前选择哈希算法。
benchmarks/benchmark_hash.py:微基准测试,测量三种实现在代表性(bytes, tuple[int])有效载荷上的单次调用延迟。
benchmarks/benchmark_prefix_block_hash.py:端到端块哈希基准测试,运行完整的前缀缓存哈希流水线 (hash_block_tokens),处理大量伪造块并报告吞吐量。
支持的算法:sha256, sha256_cbor, xxhash, xxhash_cbor。安装可选依赖以测试所有变体。
如果缺少某个算法的依赖项,脚本将跳过它并继续。
⚡ 请求优先级基准测试¶
显示更多
对 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 多条序列¶
👁️ 多模态基准测试¶
显示更多
对 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。
启动服务器
运行基准测试
# 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 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 计算也会相应调整。
