一、KVM 虚拟机环境
GPU:4张英伟达A6000(48G)
内存:128G
海光Cpu:128核
大模型:DeepSeek-R1-Distill-Qwen-32B
推理框架Vllm:0.10.1
二、测试命令(random )
vllm bench serve \
--backend vllm \
--base-url http://127.0.0.1:9400 \
--endpoint /v1/completions \
--dataset-name random \
--model qwen32b \
--tokenizer /mnt/data/models/DeepSeek-R1-Distill-Qwen-32B \
--seed 12345 \
--random-input-len 2048 \
--random-output-len 2048 \
--num-prompts 16 \
--request-rate 8 \
--metric-percentiles 95,99 \
--trust-remote-code
三、测试结果
和vllm的启动参数关系很大。
详见《Vllm-0.10.1:通过vllm bench serve测试TTFT、TPOT、ITL、E2EL四个指标》。
四、测试参数说明
vllm bench serve --help
4.1、基础配置(Backend & Server)
参数 | 类型 | 默认值 | 说明 |
--backend | str | "vllm" | 指定后端服务类型(如 vllm,openai,openai-chat,openai-audio等) |
--base-url | str | None | 若使用外部 API(如 OpenAI)或自定义 URL,则指定完整的基础地址如 http://host:port。 |
--host | str | "127.0.0.1" | 本地测试推荐用 127.0.0.1 强制 IPv4,避免 localhost 解析为 IPv6。 |
--port | int | 8000 | 对接的服务端口,默认为 vLLM 的 8000。 |
--endpoint | str | "/v1/completions" | API 路径,如 /v1/chat/completions 或 /v1/completions)。 |
4.1.1、openai和vllm的区别
维度 | --backend openai | --backend vllm |
协议兼容性 | 模拟 OpenAI API 协议 | 使用 vLLM 原生 API 格式 |
请求格式 | 发送标准 OpenAI JSON 格式 | 发送 vLLM 内部格式(简化) |
tokenizer 使用方式 | 仅用于预处理 prompt 长度估算 | 同左 |
endpoint 含义 | 必须匹配 OpenAI 路由(如 /v1/completions) | 可自定义,但需服务端支持 |
数据集适配 | 自动将 sharegpt 转为 messages 数组 | 同左 |
灵活性 | 高(兼容所有 OpenAI 客户端) | 低(仅用于 vLLM 内部测试) |
4.2、通用数据集参数
参数 | 类型 | 默认值 | 说明 |
--dataset-name | str | "sharegpt" | 可选数据集:sharegpt, burstgpt, sonnet, random, hf, custom。决定从哪加载 prompt。 |
--dataset-path | str | None | 数据路径或 HuggingFace 数据集 ID(如 HuggingFaceH4/ultrachat_200k)。 |
--no-stream | flag | False | 是否禁用流式加载(适用于大文件,减少内存占用)。加此参数表示不流式加载。 |
4.3、各数据集专属参数
4.3.1、ShareGPT (--dataset-name=sharegpt)
--sharegpt-output-len int None 覆盖原始数据集中每个样本的输出长度,统一设置生成 token 数。
详见《Vllm-0.10.1:通过vllm bench serve测试TTFT、TPOT、ITL、E2EL四个指标》。
4.3.2、Sonnet (--dataset-name=sonnet)
--sonnet-input-len int 550 输入长度(模拟诗歌输入)。
--sonnet-output-len int 150 输出长度。
--sonnet-prefix-len int 200 前缀 token 数(可用于测试 prefix caching 性能)。
4.3.3、Random (--dataset-name=random)
--random-input-len int 1024 每个请求输入 token 数。
--random-output-len int 128 每个请求输出 token 数。
--random-range-ratio float 0.0 输入/输出长度采样范围:[len*(1-r), len*(1+r)],实现长度波动(如 0.1 表示 ±10%)。
--random-prefix-len int 0 在随机 context 前固定添加的 prefix token 数量(测试 KV cache 复用)。
4.3.4、HuggingFace (--dataset-name=hf)
--hf-subset str None HF 数据集的子集(如 default)。 --hf-split str None 数据划分(如 train, test)。 --hf-output-len int None 覆盖 HF 数据集中输出长度。
4.3.5、Custom (--dataset-name=custom)
--custom-output-len int 256 自定义数据下生成长度。 --custom-skip-chat-template flag False 不应用 tokenizer 的 chat template(直接传原始文本)。
4.4、模型与 Tokenizer
参数 | 类型 | 默认值 | 说明 |
--model | str | required | 模型名称(如 meta-llama/Llama-3-8b),必填。 |
--tokenizer | str | None | 指定 tokenizer 名或路径(与 model 不同时使用)。 |
--tokenizer-mode | str | "auto" | tokenizer 模式:<br>auto: 优先 fast tokenizer<br>slow: 强制使用 slow tokenizer<br>mistral: 使用 mistral_common<br>custom: 使用预注册 tokenizer |
--served-model-name | str | None | API 中对外暴露的模型名(可与 --model 不同)。 |
--trust-remote-code | flag | False | 允许加载 HF 上的自定义模型代码(如 ChatGLM)。 |
4.5、生成控制参数(Sampling)
参数 | 类型 | 默认值 | 说明 |
--temperature | float | None | 温度,0.0 为 greedy decoding。 |
--top-p | float | None | Nucleus sampling,保留累积概率 top-p 的 token。 |
--top-k | int | None | 仅从 top-k 个 token 中采样。 |
--min-p | float | None | 最小概率阈值,低于此值的 token 被过滤。 |
4.6、请求调度与并发控制
参数 | 类型 | 默认值 | 说明 |
--request-rate | float | inf | 每秒请求数(RPS)。<br>inf:所有请求同时发出(burst 模式)<br>数值:按 Poisson 或 Gamma 分布生成到达时间。 |
--burstiness | float | 1.0 | 请求到达的“突发性”:<br>=1: Poisson 过程(随机到达)<br><1: 更突发(短时间密集)<br>>1: 更均匀(接近固定间隔) |
--max-concurrency | int | None | 最大并发请求数。即使请求速率高,也最多允许这么多并发执行。用于模拟限流系统。 |
--ramp-up-strategy | str | None | 请求速率爬升策略:<br>linear: 线性增长<br>exponential: 指数增长<br>需配合 --ramp-up-start-rps 和 --ramp-up-end-rps 使用。 |
--ramp-up-start-rps | int | None | 爬升起始 RPS(如 1)。 |
--ramp-up-end-rps | int | None | 爬升结束 RPS(如 100),在 benchmark 持续时间内达到。 |
4.7、解码策略与日志
参数 | 类型 | 默认值 | 说明 |
--use-beam-search | flag | False | 使用 beam search 解码(非采样)。通常用于确定性输出。 |
--logprobs | int | None | 返回每个 token 的 logprob 数量。<br>未设置时:<br>• 非 beam search → 返回 dummy logprob<br>• beam search → 返回 1 个 logprob |
--ignore-eos | flag | False | 忽略 EOS token,强制生成到 max_tokens。⚠️ 不支持 TGI 和 DeepSpeed-MII。 |
4.8、评估与结果记录
参数 | 类型 | 默认值 | 说明 |
--num-prompts | int | 1000 | 总共处理多少个 prompt(影响 benchmark 时长)。 |
--disable-tqdm | flag | False | 禁用进度条显示。 |
--profile | flag | False | 启用 PyTorch Profiler,需服务端设置 VLLM_TORCH_PROFILER_DIR。 |
--save-result | flag | False | 将 benchmark 结果保存为 JSON 文件。 |
--save-detailed | flag | False | 保存详细结果(每个请求的响应、延迟、错误等)。 |
--append-result | flag | False | 若结果文件已存在,追加而非覆盖。 |
--metadata | KEY=VALUE | None | 添加元数据(如 version=0.3.3 tp=1),记录实验配置。 |
--result-dir | str | . | 结果文件保存目录。 |
--result-filename | str | 自动生成 | 自定义文件名,否则格式为:{backend}-{rps}qps-{model}-{time}.json |
--percentile-metrics | str | "ttft,tpot,itl" | 计算百分位的指标: ttft: Time to First Token tpot: Time per Output Token itl: Inter-token Latency e2el: End-to-end Latency |
--metric-percentiles | str | "99" | 百分位值(如 "25,50,75" 表示 25%/50%/75%)。 |
--goodput | KEY:VALUE | None | 定义“有效吞吐量”(Goodput)的 SLO:<br>例如 --goodput ttft:1000 tpot:100 表示 TTFT ≤1s 且 TPOT ≤100ms 的请求才算成功。<br>参考:DistServe 论文 |
4.9、请求标识
参数 | 类型 | 默认值 | 说明 |
--request-id-prefix | str | "benchmark-serving" | 所有请求 ID 的前缀,便于追踪日志。 |
4.10、高级功能:LoRA 支持
参数 | 类型 | 默认值 | 说明 |
--lora-modules | list(str) | None | 指定可用的 LoRA 模块名(如 lora1 lora2)。每个请求会随机选择一个 LoRA 加载,用于测试多适配器切换性能。 |