参数扫描¶
在线基准测试¶
基础¶
vllm bench sweep serve 自动启动 vllm serve 并运行 vllm bench serve 以评估 vLLM 在多种配置下的表现。
请按照以下步骤运行脚本
- 构建
vllm serve的基本命令,并将其传递给--serve-cmd选项。 - 构建
vllm bench serve的基本命令,并将其传递给--bench-cmd选项。 -
(可选)如果您想改变
vllm serve的设置,请创建一个新的 JSON 文件并填入您想测试的参数组合。将文件路径传递给--serve-params。- 示例:调整
--max-num-seqs和--max-num-batched-tokens
[ { "max_num_seqs": 32, "max_num_batched_tokens": 1024 }, { "max_num_seqs": 64, "max_num_batched_tokens": 1024 }, { "max_num_seqs": 64, "max_num_batched_tokens": 2048 }, { "max_num_seqs": 128, "max_num_batched_tokens": 2048 }, { "max_num_seqs": 128, "max_num_batched_tokens": 4096 }, { "max_num_seqs": 256, "max_num_batched_tokens": 4096 } ] - 示例:调整
-
(可选)如果您想改变
vllm bench serve的设置,请创建一个新的 JSON 文件并填入您想测试的参数组合。将文件路径传递给--bench-params。- 示例:对随机数据集使用不同的输入/输出长度
-
确定您想保存结果的位置,并将该路径传递给
--output-dir。
示例命令
vllm bench sweep serve \
--serve-cmd 'vllm serve meta-llama/Llama-2-7b-chat-hf' \
--bench-cmd 'vllm bench serve --model meta-llama/Llama-2-7b-chat-hf --backend vllm --endpoint /v1/completions --dataset-name sharegpt --dataset-path benchmarks/ShareGPT_V3_unfiltered_cleaned_split.json' \
--serve-params benchmarks/serve_hparams.json \
--bench-params benchmarks/bench_hparams.json \
-o benchmarks/results
重要
如果同时传入了 --serve-params 和 --bench-params,脚本将遍历它们之间的笛卡尔积。您可以使用 --dry-run 来预览将要运行的命令。
我们只为每个 --serve-params 启动一次服务器,并让它为多个 --bench-params 保持运行。在每次基准测试运行之间,我们会调用所有的 /reset_*_cache 端点,以获得一个干净的开始。如果您正在使用自定义的 --serve-cmd,可以通过设置 --after-bench-cmd 来覆盖用于重置状态的命令。
注意
默认情况下,每个参数组合会运行 3 次,以使结果更可靠。您可以通过设置 --num-runs 来调整运行次数。
提示
如果其中一次运行失败,您可以使用 --resume 选项来继续参数扫描。
SLA 自动调优器¶
vllm bench sweep serve_sla 是 vllm bench sweep serve 的一个包装器,它会调整请求速率或并发性(通过 --sla-variable 选择)以满足 --sla-params 提供的 SLA 约束。
例如,确保 99% 请求的端到端延迟在不同的目标值内
[
{
"p99_e2el_ms": "<=200"
},
{
"p99_e2el_ms": "<=500"
},
{
"p99_e2el_ms": "<=1000"
},
{
"p99_e2el_ms": "<=2000"
}
]
示例命令
vllm bench sweep serve_sla \
--serve-cmd 'vllm serve meta-llama/Llama-2-7b-chat-hf' \
--bench-cmd 'vllm bench serve --model meta-llama/Llama-2-7b-chat-hf --backend vllm --endpoint /v1/completions --dataset-name sharegpt --dataset-path benchmarks/ShareGPT_V3_unfiltered_cleaned_split.json' \
--serve-params benchmarks/serve_hparams.json \
--bench-params benchmarks/bench_hparams.json \
--sla-params benchmarks/sla_hparams.json \
--sla-variable max_concurrency \
-o benchmarks/results
调整 SLA 变量的算法如下
- 使用最大可能 QPS 运行一次基准测试,然后使用最小可能 QPS 运行一次。对于每次运行,计算 SLA 指标与目标的距离,从而得到 QPS 与 SLA 距离的数据点。
- 在数据点之间执行样条插值,以估计导致 SLA 距离为零的 QPS。
- 使用估计的 QPS 运行基准测试,并将生成的数据点添加到历史记录中。
- 重复步骤 2 和 3,直到历史记录中通过 SLA 的最大 QPS 和未通过 SLA 的最小 QPS 彼此足够接近。
重要
SLA 调优应用于 --serve-params、--bench-params 和 --sla-params 的每种组合。
对于给定的 --serve-params 和 --bench-params 组合,我们会在 --sla-params 之间共享基准测试结果,以避免使用相同的 SLA 变量值重新运行基准测试。
启动¶
vllm bench sweep startup 在参数组合上运行 vllm bench startup,以比较不同引擎设置下的冷启动/热启动时间。
请按照以下步骤运行脚本
- (可选)构建
vllm bench startup的基本命令,并将其传递给--startup-cmd(默认值:vllm bench startup)。 - (可选)重用来自
vllm bench sweep serve的--serve-paramsJSON 来改变引擎设置。只有vllm bench startup支持的参数才会被应用。 - (可选)创建一个
--startup-paramsJSON 来改变特定于启动的选项,例如迭代次数。 - 确定您想保存结果的位置,并将该路径传递给
--output-dir。
示例 --serve-params
[
{
"_benchmark_name": "tp1",
"model": "Qwen/Qwen3-0.6B",
"tensor_parallel_size": 1,
"gpu_memory_utilization": 0.9
},
{
"_benchmark_name": "tp2",
"model": "Qwen/Qwen3-0.6B",
"tensor_parallel_size": 2,
"gpu_memory_utilization": 0.9
}
]
示例 --startup-params
[
{
"_benchmark_name": "qwen3-0.6",
"num_iters_cold": 2,
"num_iters_warmup": 1,
"num_iters_warm": 2
}
]
示例命令
vllm bench sweep startup \
--startup-cmd 'vllm bench startup --model Qwen/Qwen3-0.6B' \
--serve-params benchmarks/serve_hparams.json \
--startup-params benchmarks/startup_hparams.json \
-o benchmarks/results
重要
默认情况下,--serve-params 或 --startup-params 中不受支持的参数会被忽略并发出警告。使用 --strict-params 可以快速识别未知键。
可视化¶
基础¶
vllm bench sweep plot 可用于绘制参数扫描结果的性能曲线。
示例命令
vllm bench sweep plot benchmarks/results/<timestamp> \
--var-x max_concurrency \
--row-by random_input_len \
--col-by random_output_len \
--curve-by api_server_count,max_num_batched_tokens \
--filter-by 'max_concurrency<=1024'
提示
您可以使用 --dry-run 来预览要绘制的图形。
帕累托图¶
vllm bench sweep plot_pareto 有助于选择平衡每个用户吞吐量和每个 GPU 吞吐量的配置。
更高的并发性或批处理大小可以提高 GPU 效率(每个 GPU),但会增加每个用户的延迟;较低的并发性可以提高每个用户的速率,但 GPU 利用率不高;帕累托前沿显示了您的运行中可达到的最佳配对。
- x 轴:tokens/s/user =
output_throughput÷ concurrency(--user-count-var,默认为max_concurrency,备用max_concurrent_requests)。 - y 轴:tokens/s/GPU =
output_throughput÷ GPU 数量(如果设置了--gpu-count-var;否则 gpu_count 是 TP×PP*DP)。 - 输出:在
OUTPUT_DIR/pareto/PARETO.png的一个图中。 - 显示每个数据点所使用的配置
--label-by(默认值:max_concurrency,gpu_count)。
示例