一、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?加載,用于測試多適配器切換性能。 |