Qwen2-72B的vLLM部署

Eslzzyl發表於2024-08-24

今天嘗試本地部署了 Qwen2-72B-Instruct-GPTQ-Int4 模型,這裡記錄一下操作的過程。

參考:

  • https://qwen.readthedocs.io/zh-cn/latest/deployment/vllm.html
  • https://docs.vllm.ai/en/stable/serving/openai_compatible_server.html
  • https://techdiylife.github.io/blog/blog.html?category1=c01&blogid=0058

環境

  • Ubuntu 22.04
  • Python 3.12.3
  • vLLM 0.5.5
  • PyTorch 2.4.0
  • 硬體:雙卡 RTX 4090,共 48 GB 視訊記憶體

安裝 vLLM

確保已經安裝了 CUDA 工具鏈。

建立一個新的 Python 虛擬環境,Python 使用最新版本即可。然後使用 pip 安裝 vLLM:

pip install vllm

所有的依賴應該都會自動安裝。

下載模型

模型位於 HuggingFace,國內可以使用映象站 hf-mirror.com 來加速下載。這裡記錄一下使用 HuggingFace 官方的下載工具 huggingface-cli 下載模型的過程。

安裝 huggingface-hub

pip install huggingface_hub

找一處空間足夠大的地方。需要約 40 GB 空閒空間來存放 INT4 量化的 72B 模型權重,最好是固態硬碟,從而獲得最快的模型載入速度。首先將 HF_ENDPOINT 環境變數修改為 hf-mirror.com:

export HF_ENDPOINT=https://hf-mirror.com

然後進行下載:

huggingface-cli download --resume-download Qwen/Qwen2-72B-Instruct-GPTQ-Int4 --local-dir Qwen2-72B-Instruct-GPTQ-Int4

這會在當前目錄中建立一個 Qwen2-72B-Instruct-GPTQ-Int4 目錄用於儲存模型的權重。如果下載過程中出現問題,會自動恢復。

啟動服務

使用以下命令啟動服務:

vllm serve ./Qwen2-72B-Instruct-GPTQ-Int4 \
    --tensor-parallel-size 2 \
    --host 127.0.0.1 \
    --port 6006 \
    --served-model-name Qwen2-72B-Instruct \
    --api-key xxx \
    --gpu-memory-utilization 0.95 \
    --max_model_len 4096 \
    --enforce-eager \
    --quantization gptq

注意,48 GB 視訊記憶體只能勉強放下 72B 的模型,因此我們需要一些額外的節省視訊記憶體的策略來防止 CUDA OOM 錯誤。以下是所有引數的解釋:

  • tensor-parallel-size:張量並行的路數,可以簡單地理解為使用多少張卡來推理。
  • host:監聽的主機名,一般是 127.0.0.1 或者 0.0.0.0。本地使用的話前者即可。如果希望公開服務,那麼建議使用前者的同時外加反向代理。
  • port:監聽埠號。
  • served-model-name:提供的 OpenAI 風格的 API 能夠接受的模型名稱。其他程式在呼叫模型時需要使用這個名稱。如果不指定,就是傳遞給 vllm serve 的預設模型名稱。
  • api-key:OpenAI 的 Python 庫強制要求使用 API-key,如果不使用會拒絕請求。此處可以隨便填寫,不需要遵循 OpenAI 的 API-key 命名規則。
  • gpu-memory-utilization 預留視訊記憶體佔總視訊記憶體的百分比。預設值是0.9,但在這個配置下必須調到 0.95 才不會 OOM。
  • max_model_len:最大的位置嵌入(max_position_embedding)長度,Qwen 系列的預設值是 32768。在這個配置下最大是 4096,再大就會 OOM。
  • enforce-eager:不太明白什麼意思,似乎開啟之後每張卡會有 1~3 GB 的額外視訊記憶體佔用,用來儲存某種東西。官方的解釋是:Always use eager-mode PyTorch. If False, will use eager mode and CUDA graph in hybrid for maximal performance and flexibility.
  • quantization:使用的量化型別。此處為 GPTQ。

測試服務

使用 OpenAI 的 Python 客戶端庫來測試:

from openai import OpenAI
from rich import print

client = OpenAI(
    api_key="xxx",
    base_url="http://127.0.0.1:6006/v1/"
)

chat_completion = client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content": "你是誰?",
        }
    ],
    model="Qwen2-72B-Instruct",
)
print(chat_completion)

輸出如下:

ChatCompletion(
    id='chat-75c0e4db516c415094c3558d48d7c863',
    choices=[
        Choice(
            finish_reason='stop',
            index=0,
            logprobs=None,
            message=ChatCompletionMessage(
                content='我是通義千問,由阿里雲開發的AI助手。我可以回答各種問題、提供資訊和與使用者進行對話。有什麼我
可以幫助你的嗎?',
                role='assistant',
                function_call=None,
                tool_calls=[]
            ),
            stop_reason=None
        )
    ],
    created=1724498191,
    model='Qwen2-72B-Instruct',
    object='chat.completion',
    service_tier=None,
    system_fingerprint=None,
    usage=CompletionUsage(completion_tokens=34, prompt_tokens=22, total_tokens=56),
    prompt_logprobs=None
)

說明服務一切正常。之後就可以像使用 OpenAI API 那樣呼叫 vLLM 提供的 API。

相關文章