vLLM 部署Qwen2.5 LLM & VLM 大模型

Qwen2.5-32B 和 Qwen2.5-VL-32B 是通义千问(Qwen)系列中的两个大模型,分别对应纯语言模型(LLM)和多模态视觉-语言模型(VLM)。Docker环境安装与配置 NVIDIA Container Toolk,下载大模型参考 Docker部署bge-m3/bge-reranker模型

模型简介

模型名称类型参数量特点
Qwen2.5-32B纯文本语言模型~32B支持中英文,推理、代码、对话能力强
Qwen2.5-VL-32B视觉-语言多模态模型~32B(含视觉编码器)支持图像理解、图文问答、多模态推理

注意:Qwen2.5-VL 基于 Qwen2.5 语言主干 + 视觉编码器(如 SigLIP 或 CLIP 变体),需同时加载视觉和语言组件。

部署前的硬件准备

部署前,需确认硬件环境满足基本要求。由于Qwen2.5-VL-32B是多模态模型,其显存需求通常高于纯文本模型。

资源Qwen2.5-32B (纯文本)Qwen2.5-VL-32B (多模态)说明
GPU显存建议 ≥ 24GB (单卡)建议 ≥ 32GB (单卡或多卡)使用量化版本(如GPTQ-Int4)可大幅降低显存需求。
系统内存建议 32GB+建议 64GB+避免模型加载时内存溢出(OOM)
磁盘空间模型文件约需 60GB+模型文件约需 70GB+需预留额外空间存放Docker镜像和依赖。

OpenLLM - Qwen

model    version                repo     required GPU RAM    platforms
-------  ---------------------  -------  ------------------  -----------
qwen2.5  qwen2.5:0.5b           default  12G                 linux
         qwen2.5:1.5b           default  12G                 linux
         qwen2.5:3b             default  12G                 linux
         qwen2.5:7b             default  24G                 linux
         qwen2.5:14b            default  80G                 linux
         qwen2.5:14b-ggml-q4    default                      macos
         qwen2.5:14b-ggml-q8    default                      macos
         qwen2.5:32b            default  80G                 linux
         qwen2.5:32b-ggml-fp16  default                      macos
         qwen2.5:72b            default  80Gx2               linux
         qwen2.5:72b-ggml-q4    default                      macos

硬件要求

  • Qwen2.5-32B(纯文本)

    • 推荐:2×A100 80GB(FP16)或 4×A10 24GB(INT4 量化)

    • 最低:单卡 A100 80GB(INT4)

  • Qwen2.5-VL-32B(多模态)

    • 推荐:2×A100 80GB(FP16)或 4×A10 24GB(INT4)

    • 需额外加载视觉编码器(如 ViT),显存需求略高

基于vLLM的Docker部署通用流程

下面以 vLLM框架 为例,介绍在Docker中部署这两个模型的通用步骤。vLLM是一个高效的推理和服务框架

步骤一:准备环境与下载模型

1.安装依赖:确保系统已安装DockerNVIDIA驱动NVIDIA Container Toolkit(使Docker支持GPU)。

2.下载模型:推荐使用国内镜像源(如ModelScope)下载模型到本地目录。

# 示例:通过ModelScope下载Qwen2.5-32B-Instruct
pip install modelscope
modelscope download --model Qwen/Qwen2.5-32B-Instruct --local_dir /your/local/model/path

3.拉取Docker镜像:拉取官方vLLM镜像。

docker pull vllm/vllm-openai:latest

步骤二:启动Docker容器并运行模型

使用以下命令启动容器。请务必将命令中的 /your/local/model/path 和 Qwen2.5-32B-Instruct 替换为你实际部署的模型路径和名称(例如,部署VL模型时需替换为Qwen2.5-VL-32B-Instruct)。

docker run -d \
  --gpus all \
  -p 8000:8000 \
  -v /your/local/model/path:/model \  # 将宿主机模型目录挂载到容器
  --name vllm-qwen \
  vllm/vllm-openai:latest \
  --model /model \  # 容器内的模型路径
  --served-model-name Qwen2.5-32B \  # 服务名称,可按需修改
  --tensor-parallel-size 1 \  # 使用的GPU数量,单卡设为1
  --gpu-memory-utilization 0.9 \  # GPU内存利用率,可调整以防OOM
  --max-model-len 8192 \  # 最大序列长度,可根据需要调整
  --trust-remote-code  # Qwen模型需要此参数

部署 Qwen2.5-VL-32B-Instruct

docker run -d \
  --gpus all \  # 允许容器使用所有GPU
  -p 8000:8000 \  # 映射端口(主机端口:容器端口)
  -v /your/local/model/path:/model \  # 挂载模型目录到容器内
  --name vllm-qwen-vl \  # 容器名称
  vllm/vllm-openai:latest \  # 使用的镜像
  --model /model \  # 容器内模型路径 外部调用时入参model 需要与此处相同 注意此处有 /
  --served-model-name Qwen2.5-VL-32B \  # 服务名称,可按需修改
  --port 8000 \  # 容器内服务端口
  --host 0.0.0.0 \  # 允许外部访问
  --tensor-parallel-size 1 \  # 若单卡则设1,多卡按实际数量调整
  --gpu-memory-utilization 0.9 \  # 允许使用90%的GPU内存(避免OOM)
  --trust-remote-code  # 信任远程模型代码(Qwen模型需要)

关键参数说明

  • --tensor-parallel-size:根据你使用的GPU数量设置。例如,单卡设为1,双卡可设为2

  • --gpu-memory-utilization控制显存使用率。如果启动时出现内存不足(OOM)错误,可以尝试降低此值(如调整为0.8)。

  • --max-model-len:根据模型支持的上下文长度和你的需求调整。

  • --dtype float16:模型运行的数据类型:float16 是半精度浮点类型,相比 float32 可减少 GPU 内存占用(约节省一半),同时保持较好的推理精度。Qwen2.5 模型支持 float16,推荐使用(若 GPU 支持 bfloat16,也可改为 bfloat16)。

测试与验证部署

服务启动后,可以通过以下方式验证模型是否正常工作:

1.检查服务状态

curl http://localhost:8000/health

如果返回 {"status":"OK"} 或类似信息,说明服务已就绪

2.发送推理请求进行测试

Qwen2.5-32B (文本):直接向其 /v1/completions 或 /v1/chat/completions 端点发送文本Prompt。

1. 测试聊天接口(推荐)

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen2.5-32B",
    "messages": [
      {"role": "user", "content": "你好,请介绍一下你自己。"}
    ],
    "max_tokens": 100,
    "temperature": 0.7
  }'

2. 测试流式输出(streaming)

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "Qwen2.5-32B",
    "messages": [{"role": "user", "content": "写一首关于春天的诗。"}],
    "stream": true,
    "max_tokens": 150
  }'

Qwen2.5-VL-32B (多模态):需要构建一个包含图像和文本的多模态请求。可以参考官方GitHub仓库中的示例代码

自定义 FastAPI + Transformers

1. Dockerfile(多模态)

# Dockerfile(多模态)
FROM nvcr.io/nvidia/pytorch:24.06-py3

RUN pip install --upgrade pip && \
    pip install "transformers>=4.40" "accelerate" "torch" "torchvision" \
    "pillow" "fastapi" "uvicorn" "einops" "timm" "qwen-vl-utils" \
    -i https://pypi.tuna.tsinghua.edu.cn/simple

COPY app_vl.py /app/app.py
WORKDIR /app
EXPOSE 8000
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"]

2.app_vl.py(简化版)

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from PIL import Image
import base64
import io
from transformers import AutoModelForVision2Seq, AutoTokenizer

app = FastAPI()

# 加载模型(启动时加载)
model = AutoModelForVision2Seq.from_pretrained(
    "Qwen/Qwen2.5-VL-32B",
    device_map="auto",
    trust_remote_code=True,
    torch_dtype="auto"
)
processor = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-VL-32B", trust_remote_code=True)

class VLRequest(BaseModel):
    image_b64: str  # Base64 编码的图片
    question: str

@app.post("/vl")
async def vision_language(request: VLRequest):
    try:
        # 解码图片
        image_data = base64.b64decode(request.image_b64)
        image = Image.open(io.BytesIO(image_data)).convert("RGB")

        # 构造消息
        messages = [{
            "role": "user",
            "content": [
                {"type": "image", "image": image},
                {"type": "text", "text": request.question}
            ]
        }]

        # 预处理
        inputs = processor(messages, return_tensors="pt", padding=True)
        inputs = {k: v.to(model.device) for k, v in inputs.items()}

        # 生成
        output = model.generate(**inputs, max_new_tokens=256)
        response = processor.decode(output[0], skip_special_tokens=True)

        return {"response": response}
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

3. 构建并运行

docker build -t qwen25-vl-32b -f Dockerfile.vl .
docker run -d --gpus all -p 8001:8000 qwen25-vl-32b

4.curl 测试(需 Base64 图片)

# 先将图片转为 base64
base64_image=$(base64 -i cat.jpg | tr -d '\n')

curl http://localhost:8001/vl \
  -H "Content-Type: application/json" \
  -d "{
    \"image_b64\": \"$base64_image\",
    \"question\": \"图片中有什么动物?\"
  }"


参考:


anzhihe 安志合个人博客,版权所有 丨 如未注明,均为原创 丨 转载请注明转自:https://chegva.com/6585.html | ☆★★每天进步一点点,加油!★★☆ | 

您可能还感兴趣的文章!

发表评论

电子邮件地址不会被公开。 必填项已用*标注