附註:

在 Oracle Cloud Infrastructure Compute 上使用 vLLM 設定簡易 LLM 推論基準測試系統

簡介

瞭解系統的效能特性可讓您針對其元件及這些元件做出明智的選擇。在本教學課程中,我們將為 AI 大型語言模型 (LLM) 推論設定完整的基準系統。使用此功能,您可以執行各種實驗,從評估特定 Oracle Cloud Infrastructure (OCI) Compute 資源配置是否適合 LLM 和效能需求,以相互比較各種 LLM。

在本教學課程中,我們使用熱門的開源推論伺服器 vLLM ,它支援許多最先進的 LLM 狀態,並提供高效率服務這些模型所需的效能最佳化,並且能夠處理數千個並行要求。此外,我們還使用 Ray LLMPerf 執行基準。

注意: 本教學課程假設您有一個具有 GPU 配額的 OCI 租用戶。如需有關配額的詳細資訊,請參閱計算配額

目標

必要條件

工作 1:設定您的網路

在這項任務中,設定您的虛擬雲端網路 (VCN) 以提供執行基準的功能和安全設定。在此範例中,我們需要一個具有一個公用和一個專用子網路的 VCN。您可以使用 VCN 設定精靈或手動設定所有元件,確定安全清單允許 SSH 存取,且將 NAT 閘道指定給專用子網路。

測試中包含專用和公用子網路、堡壘主機和 GPU VM 的解決方案架構總覽

在佈建 OCI Compute 執行處理並繼續進行基準設定之前,請務必確保您的網路設定值已正確設定。佈建的網路預設只允許子網路之間的必要流量。若要允許進行基準測試所需的網路流量,您需要調整這些設定值,以允許公用子網路和專用子網路之間的 HTTP 流量。特別是將傳入規則新增至私有子網路的安全列表,允許從 VCN CIDR 區塊到目的地連接埠 8000 的流量。

作業 2:佈建 OCI Compute 執行處理

在這項任務中,為我們的基準設定佈建兩個 OCI Compute 執行處理。一個是作為堡壘主機和基準從屬端機器的僅限 CPU 虛擬機器 (VM) 執行處理,另一個是測試中 GPU 壓縮的執行處理。

  1. 佈建具備 8 個 OCPU 和 Oracle Linux 8 的 VM.Flex.E5 執行處理。堡壘主機 / 基準從屬端不需要 GPU,因為它只會傳送要求至個別機器上代管的模型,因此可以選擇 CPU 資源配置。請務必在網路參數中選取公用子網路,而且不要忘記上傳您的 SSH 公用金鑰 (或視需要下載提供的私密金鑰)。

  2. 佈建 VM.GPU.A10.1 執行處理。若要簡化設定,請使用包含 NVIDIA 驅動程式和 CUDA 架構的 Oracle Linux 8 映像檔佈建執行處理。首先,選取想要的資源配置,然後瀏覽回影像選擇功能表,然後選擇內建 GPU 支援的 Oracle Linux 8 變體。此執行處理必須在專用子網路中佈建,這表示只能使用堡壘主機存取。請確定也設定 SSH 金鑰。

選取內建 GPU 支援之 Oracle Linux 8 映像檔的螢幕擷取畫面

作業 3:設定基準用戶端

在這項任務中,我們將安裝效能基準的所有必要元件,並設定 GPU 主機。

  1. 使用您的 SSH 金鑰登入堡壘主機,並且使用下列命令設定 LLMPerf 的所有需求。

    sudo dnf install epel-release -y
    sudo yum-config-manager --enable ol8_baseos_latest ol8_appstream ol8_addons ol8_developer_EPEL
    sudo dnf install git python3.11 python3.11-devel python3.11-pip -y
    
  2. 複製 Ray LLMPerf 儲存區域,設定 Python venv,然後使用下列命令安裝 LLMPerf。

    git clone https://github.com/ray-project/llmperf.git
    cd llmperf
    mkdir venv && python3.11 -mvenv venv && source venv/bin/activate
    
  3. 安裝 LLMPerf (及其 Python 相依性) 之前,請先編輯 pyproject.toml 檔案並移除 Python 需求子句。此子句不需要限制 Python 版本小於 3.11

    diff --git a/pyproject.toml b/pyproject.toml
    index 7687fb2..521a2a7 100644
    --- a/pyproject.toml
    +++ b/pyproject.toml
    @@ -8,7 +8,6 @@ version = "0.1.0"
     description = "A framework for load testing LLM APIs"
     authors = [{name="Avnish Narayan", email="avnish@anyscale.com"}]
     license = {text= "Apache-2.0"}
    -requires-python = ">=3.8, <3.11"
     dependencies = ["pydantic<2.5",
                     "ray",
                     "pytest>=6.0",
    
  4. 執行 pip install -e 命令以完成設定。

作業 4:設定基準目標

在此任務中,我們將設定基準目標本身。由於我們已經佈建了具有必要驅動程式和 Compute Unified Device Architecture (CUDA) 架構的節點,因此我們只需要安裝 vLLM 及其 python 相依性,然後部署要作為基準的模型。

注意: 您佈建的 GPU 運算執行處理位於專用子網路中。因此,若要連線,您必須先登入堡壘主機,並設定您為基準目標選擇的私密 SSH 金鑰。只有這樣您才能使用基準目標的專用 IP 位址登入基準目標。

  1. 安裝必要的套裝程式,例如堡壘主機上的初始設定。此外,使用下列命令更新主機的防火牆,以允許連接埠 8000 上的內送流量。

    sudo dnf install epel-release -y
    sudo yum-config-manager --enable ol8_baseos_latest ol8_appstream ol8_addons ol8_developer_EPEL
    sudo dnf install git python3.11 python3.11-devel python3.11-pip -y
    sudo firewall-cmd --permanent --zone=public --add-port=8000/tcp
    sudo firewall-cmd --reload
    
  2. 執行下列指令以安裝 vLLM 及其需求。

    mkdir venv
    python3.11 -mvenv venv && source venv/bin/activate
    pip install -U pip "bitsandbytes>=0.44.0" vllm gpustat mistral_common
    
  3. 我們已準備好使用想要測試的模型啟動 vLLM。

    export HF_TOKEN=<your huggingface token>
    export MODEL="meta-llama/Llama-3.2-3B-Instruct"
    ulimit -Sn 65536 # increase limits to avoid running out of files that can be opened
    vllm serve $MODEL --tokenizer-mode auto --config-format hf --load-format auto \
                      --enforce-eager --max-model-len 65536
    

    注意:我們需要減少模型相關資訊環境長度以符合 A10 GPU 記憶體,將相關資訊環境長度從 128k 記號的預設大小降低至 64k 記號。載入之後,模型 vLLM 應定期開始輸出其推論統計資料。

    INFO 12-09 15:46:36 metrics.py:449] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 0.0 tokens/s, Running: 0 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 0.0%, CPU KV cache usage: 0.0%.
    
  4. 我們會在切換到另一個終端機時,讓伺服器繼續在背景執行,我們現在會對設定進行測試與基準。您可以使用 curl 執行簡單測試,如下所示。

    export HOST="<the ip address of the benchmark machine"
    export MODEL="meta-llama/Llama-3.2-3B-Instruct"
    curl --location "http://${HOST}:8000/v1/chat/completions"     --header 'Content-Type: application/json'     --header 'Authorization: Bearer token'     --data '{
            "model": "'"$MODEL"'",
            "messages": [
              {
                "role": "user",
                "content": "What is the question to the answer to the ultimate question of life, the universe, and everything. You may give a humorous response."
              }
            ]
        }' -s | jq
    

    輸出將會是:

    {
      "id": "chatcmpl-f11306f943604d41bad84be1dadd9da6",
      "object": "chat.completion",
      "created": 1733997638,
      "model": "meta-llama/Llama-3.2-3B-Instruct",
      "choices": [
        {
          "index": 0,
          "message": {
            "role": "assistant",
            "content": "You want to know the ultimate question to the answer of 42?\n\nWell, after years of intense research and contemplation, I've discovered that the answer is actually a giant, cosmic joke. The question is: \"What's for lunch?\"",
            "tool_calls": []
          },
          "logprobs": null,
          "finish_reason": "stop",
          "stop_reason": null
        }
      ],
      "usage": {
        "prompt_tokens": 62,
        "total_tokens": 112,
        "completion_tokens": 50,
        "prompt_tokens_details": null
      },
      "prompt_logprobs": null
    }
    

作業 5:執行基準

現在,我們已經準備好執行基準。針對具有所選大型語言模型的特定應用程式案例,我們希望瞭解目標系統執行並行推論要求的效能特性為何。

讓我們依照下列情境進行基準測試:

PARAMETER
模型 Meta LLaMa 3.2 3B 指示
使用案例 chat - 交談
輸入權杖 N (200、40)
輸出權杖 N (100、10)
並行要求 1 - 32
  1. 在主目錄內的基準用戶端 (堡壘主機) 上建立下列名為 llm_benchmark.sh 的指令碼。

    #!/usr/bin/env bash
    
    set -xe
    
    # Use vLLM OpenAPI endpoint
    export OPENAI_API_BASE="http://<benchmark host>:8000/v1"
    # API key is not in use, but needs to be set for llmbench
    export OPENAI_API_KEY="none"
    
    model="meta-llama/Llama-3.2-3B-Instruct"
    
    modelname="${model##*/}"
    mkdir "$modelname"
    
    concurrent_requests=(1 2 4 8 16 32)
    
    pushd llmperf
    
    source venv/bin/activate
    
    for cr in "${concurrent_requests[@]}"
    do
        python3 token_benchmark_ray.py --model $model \
            --mean-input-tokens 200 --stddev-input-tokens 40 \
            --mean-output-tokens 100 --stddev-output-tokens 10 \
            --max-num-completed-requests $((cr * 100)) --num-concurrent-requests $cr \
            --metadata "use_case=chatbot" \
            --timeout 1800 --results-dir "../$modelname/result_outputs_chat_creq_$cr" --llm-api openai
    done
    popd
    

    此程序檔可讓您使用 llmperf 自動執行一系列基準,並增加並行要求的數目 (從 1 開始,連續加倍至 32)。正如您從傳遞至 token_benchmark_ray.py 命令檔的引數所見,我們正在設定上面表格中定義的記號輸入和輸出。

  2. 使用下列命令執行您的基準命令檔。

    bash -x llm_benchmark.sh
    

完成之後,您將會在您的本位目錄中找到一個名為 Llama-3.2-3B-Instruct 的新目錄,其中所有實驗結果都會以 JSON 格式儲存,您可以使用我的最愛資料分析工具來下載和後續處理。

注意:將基準轉換成繪圖的一個簡單方法,就是將您最感興趣的數字擷取成使用小 Shell 命令檔,並將 jq 擷取成 .csv 格式,這可以輕易地複製貼到 Excel 中。

echo "concurrent_requests,token_throughput"
for i in *; do
    cat $i/*_summary.json | jq -r '[.num_concurrent_requests, .results_request_output_throughput_token_per_s_mean] | join(",")'
done;

認可

其他學習資源

探索 docs.oracle.com/learn 上的其他實驗室,或存取 Oracle Learning YouTube 頻道上的更多免費學習內容。此外,請造訪 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

如需產品文件,請造訪 Oracle Help Center