Qwen2-72B的vLLM部署
今天尝试本地部署了 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
- GPU:双卡 RTX 4090,共 48 GB 显存
- 内存:80 GB
安装 vLLM
确保已经安装了 CUDA 工具链。
创建一个新的 Python 虚拟环境,Python 使用最新版本即可。然后使用 pip
安装 vLLM:
pip install vllm
所有的依赖应该都会自动安装。
下载模型
模型位于 HuggingFace,国内可以使用镜像站 hf-mirror.com 来加速下载。这里记录一下使用 HuggingFace 官方的下载工具 huggingface-cli
下载模型的过程。
安装 huggingface-hub
:
如果已经安装了
vllm
,那么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。