今天嘗試本地部署了 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。