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-32B是多模态模型,其显存需求通常高于纯文本模型。
| 资源 | Qwen2.5-32B (纯文本) | Qwen2.5-VL-32B (多模态) | 说明 |
|---|---|---|---|
| GPU显存 | 建议 ≥ 24GB (单卡) | 建议 ≥ 32GB (单卡或多卡) | 使用量化版本(如GPTQ-Int4)可大幅降低显存需求。 |
| 系统内存 | 建议 32GB+ | 建议 64GB+ | 避免模型加载时内存溢出(OOM)。 |
| 磁盘空间 | 模型文件约需 60GB+ | 模型文件约需 70GB+ | 需预留额外空间存放Docker镜像和依赖。 |
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.安装依赖:确保系统已安装Docker、NVIDIA驱动和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\": \"图片中有什么动物?\"
}"参考: