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。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)