跳到內容

引數掃描

線上基準測試

基本

vllm bench sweep serve 會自動啟動 vllm serve 並執行 vllm bench serve 來評估 vLLM 在多種配置下的效能。

請按照以下步驟執行指令碼

  1. 構建 vllm serve 的基礎命令,並將其傳遞給 --serve-cmd 選項。
  2. 構建 vllm bench serve 的基礎命令,並將其傳遞給 --bench-cmd 選項。
  3. (可選)如果您想改變 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
        }
    ]
    
  4. (可選)如果您想改變 vllm bench serve 的設定,請建立一個新的 JSON 檔案,並填入您想測試的引數組合。將檔案路徑傳遞給 --bench-params

    • 示例:為隨機資料集使用不同的輸入/輸出長度
    [
        {
            "random_input_len": 128,
            "random_output_len": 32
        },
        {
            "random_input_len": 256,
            "random_output_len": 64
        },
        {
            "random_input_len": 512,
            "random_output_len": 128
        }
    ]
    
  5. 確定您希望儲存結果的位置,並將其傳遞給 --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_prefix_cache/reset_mm_cache 端點,以獲得一個乾淨的狀態以進行下一次執行。如果您使用的是自定義 --serve-cmd,您可以透過設定 --after-bench-cmd 來覆蓋用於重置狀態的命令。

注意

預設情況下,每個引數組合會執行 3 次,以使結果更可靠。您可以透過設定 --num-runs 來調整執行次數。

提示

如果其中一次執行失敗,您可以使用 --resume 選項來繼續引數掃描。

SLA 自動調優器

vllm bench sweep serve_slavllm 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 變數的演算法如下

  1. 以無限 QPS 執行基準測試,並使用相應的指標來確定變數的初始值。
    • 例如,初始請求速率設定為無限 QPS 下的併發度。
  2. 如果 SLA 仍然滿足,則將值加倍,直到 SLA 不再滿足。這會給出一個相對狹窄的視窗,其中包含 SLA 剛好滿足的點。
  3. 在視窗上應用二分查詢,以找到仍滿足 SLA 的最大值。

重要

SLA 調優應用於 --serve-params--bench-params--sla-params 的每個組合。

對於給定的 --serve-params--bench-params 組合,我們在 --sla-params 之間共享基準測試結果,以避免使用相同的 SLA 變數值重新執行基準測試。

視覺化

基本

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) 顯示每個資料點使用的配置。

示例

vllm bench sweep plot_pareto benchmarks/results/<timestamp> \
  --label-by max_concurrency,tensor_parallel_size,pipeline_parallel_size