Qwen2-72B的vLLM部署

今天尝试本地部署了 Qwen2-72B-Instruct-GPTQ-Int4 模型,这里记录一下操作的过程。

参考:

环境

  • 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。

posted @ 2024-08-24 20:46  Eslzzyl  阅读(1164)  评论(0编辑  收藏  举报