Deploying
Deploying Qwen 2.5 with vLLM: A Step-by-Step Tutorial from Weight Download to OpenAI-Compatible API
Qwen 2.5 系列模型自 2024 年 9 月发布以来,已成为中国开源大模型生态中部署最广泛的基座之一。根据阿里云官方数据,Qwen 2.5 在发布后 30 天内 Hugging Face 下载量突破 300 万次【阿里云,2024,Qwen 2.5 技术博客】,而 vLLM 作为当前吞吐性能最高的推理引擎,…
Qwen 2.5 系列模型自 2024 年 9 月发布以来,已成为中国开源大模型生态中部署最广泛的基座之一。根据阿里云官方数据,Qwen 2.5 在发布后 30 天内 Hugging Face 下载量突破 300 万次【阿里云,2024,Qwen 2.5 技术博客】,而 vLLM 作为当前吞吐性能最高的推理引擎,在 MLPerf Inference v4.0 基准测试中,对 70B 级别模型的 token 生成速度比 Hugging Face Transformers 原生方案提升 8-12 倍【MLCommons,2024,MLPerf Inference v4.0 结果】。这意味着,对于任何需要生产级 API 部署的 MLOps 工程师,将 Qwen 2.5 权重加载到 vLLM 并暴露为 OpenAI 兼容接口,是当前性价比最高的技术路线。本文将从权重下载、环境配置、vLLM 启动到 API 测试,提供一套可在 30 分钟内跑通的完整部署流程。
环境准备:GPU 选型与依赖安装
部署 Qwen 2.5 模型前,需根据模型参数量级选择 GPU。以 Qwen2.5-7B-Instruct 为例,其权重占用约 14 GB(FP16),推荐使用 NVIDIA A10G(24 GB) 或 RTX 4090(24 GB) 单卡即可运行。对于 Qwen2.5-72B-Instruct,则至少需要 2 张 A100-80GB 或 4 张 A10G-24GB 进行张量并行。
操作系统与 Python 环境
建议使用 Ubuntu 22.04 LTS 或 Rocky Linux 9,Python 版本锁定为 3.10-3.12。使用 conda 创建独立环境:
conda create -n vllm_qwen python=3.11
conda activate vllm_qwen
vLLM 与 CUDA 版本对齐
vLLM 0.6.x 系列要求 CUDA 12.1 以上。检查当前驱动:
nvidia-smi | grep "CUDA Version"
若版本低于 12.1,需更新 NVIDIA 驱动至 535 或 545 系列。安装 vLLM 推荐使用预编译 wheel:
pip install vllm==0.6.3
此命令会自动安装 torch 2.4.0 + cu121 依赖。对于国内用户,可添加 -i https://mirrors.aliyun.com/pypi/simple/ 加速。
权重下载:从 Hugging Face 到本地缓存
Qwen 2.5 系列权重托管于 Hugging Face,但国内直连下载速度不稳定。推荐使用 ModelScope 镜像作为主要下载源。
使用 ModelScope 下载
ModelScope 对 Qwen 系列提供了完整镜像,速度可达 50-100 MB/s:
from modelscope import snapshot_download
model_dir = snapshot_download('Qwen/Qwen2.5-7B-Instruct', cache_dir='/data/models/')
该命令会将全部权重文件下载至 /data/models/Qwen/Qwen2.5-7B-Instruct。对于 7B 模型,总大小约 15 GB,耗时 3-5 分钟。
验证权重完整性
下载完成后,检查关键文件是否存在:
ls -lh /data/models/Qwen/Qwen2.5-7B-Instruct/
应包含 config.json、tokenizer.json、model-00001-of-00002.safetensors 等文件。若使用 Hugging Face 直连,建议开启 resume_download=True 参数防止断连。
启动 vLLM 服务:核心参数详解
vLLM 提供两种启动方式:Python API 脚本和命令行 vllm serve。生产环境推荐后者。
最小化启动命令
python -m vllm.entrypoints.openai.api_server \
--model /data/models/Qwen/Qwen2.5-7B-Instruct \
--served-model-name qwen2.5-7b \
--port 8000 \
--max-model-len 8192 \
--gpu-memory-utilization 0.9
关键参数说明:
--model:指向本地权重路径,vLLM 会自动加载 tokenizer 和 config。--served-model-name:在 API 中暴露的模型名称,客户端调用时需匹配。--max-model-len:最大上下文长度。Qwen2.5-7B 原生支持 32K,但若 GPU 显存不足(如 24 GB),建议降至 8192 以避免 OOM。--gpu-memory-utilization:预留 10% 显存给 KV cache 以外的操作,设为 0.9 较为稳妥。
多 GPU 张量并行
对于 72B 模型,使用 4 张 A10G 时添加:
--tensor-parallel-size 4
vLLM 会自动将模型权重切分到各 GPU,并通过 NCCL 通信。启动后日志会显示每个 GPU 的显存占用,正常应为 20-22 GB / 24 GB。
测试 OpenAI 兼容 API:curl 与 Python SDK
vLLM 启动后会在 http://localhost:8000 暴露 chat completions 端点,完全兼容 OpenAI 格式。
使用 curl 快速验证
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "qwen2.5-7b",
"messages": [{"role": "user", "content": "用中文解释什么是注意力机制"}],
"max_tokens": 512,
"temperature": 0.7
}'
成功响应应包含 "id": "chatcmpl-xxx" 和 "choices" 数组。首 token 延迟通常在 200-500 ms(7B 模型)。
Python 客户端调用
使用 openai 库(v1.x):
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="EMPTY")
response = client.chat.completions.create(
model="qwen2.5-7b",
messages=[{"role": "user", "content": "列出三种模型量化方法"}]
)
print(response.choices[0].message.content)
注意将 api_key 设为任意值,vLLM 默认不校验 key。
性能调优:吞吐与延迟的平衡
vLLM 的默认配置偏向低延迟,但可通过调整参数优化吞吐。
连续批处理与调度策略
vLLM 默认启用 continuous batching,即无需等待所有请求完成即可插入新请求。若请求并发量高(>50 QPS),可设置:
--max-num-seqs 256 \
--max-num-batched-tokens 8192
前者控制最大并行序列数,后者控制单次批处理的总 token 数。实验表明,对 Qwen2.5-7B,将 max-num-seqs 从 64 提升至 256 可使吞吐从 1200 tokens/s 升至 2800 tokens/s,但首 token 延迟会从 300 ms 升至 800 ms【vLLM 官方 benchmark,2024】。
量化部署
对于显存紧张场景,使用 AWQ 量化版权重:
--model Qwen/Qwen2.5-7B-Instruct-AWQ \
--quantization awq
AWQ 量化可将 7B 模型显存占用从 14 GB 降至 5.6 GB,且精度损失小于 1%【MIT & NVIDIA,2023,AWQ 论文】。启动时需安装 autoawq 库:
pip install autoawq
常见错误与排查指南
CUDA Out of Memory
若启动时出现 torch.cuda.OutOfMemoryError,按优先级尝试:
- 降低
--max-model-len至 4096。 - 降低
--gpu-memory-utilization至 0.8。 - 使用量化版权重(AWQ 或 GPTQ)。
模型加载报 “missing keys”
通常因权重下载不完整导致。重新执行 snapshot_download 并添加 resume_download=True。若仍报错,检查 config.json 中的 model_type 字段,确保为 "qwen2"。
API 返回 404
检查 --served-model-name 是否与请求中的 model 字段完全一致。vLLM 默认模型名称为权重文件夹名,建议显式指定。
FAQ
Q1:部署 Qwen 2.5 需要多少显存?
对于 Qwen2.5-7B-Instruct(FP16),最低需要 16 GB 显存,推荐 24 GB。量化版本(AWQ 4-bit)仅需 5.6 GB,可在 RTX 3060 12GB 上运行。72B 模型需 2 张 A100-80GB 或 4 张 A10G-24GB。
Q2:vLLM 是否支持 Qwen 2.5 的 function calling?
支持。vLLM 0.6.0 以上版本已集成 Qwen 2.5 的 function calling 模板,只需在 messages 中传入 tools 参数即可。需确保启动时未禁用 --enable-tool-use(默认开启)。
Q3:如何将 vLLM 部署为生产级服务?
推荐使用 systemd 管理进程,并配合 Nginx 反向代理添加负载均衡与 HTTPS。对于高并发场景,可前置 Redis 做请求队列。vLLM 本身支持 Prometheus 指标暴露,可集成 Grafana 监控。
参考资料
- 阿里云 2024 Qwen 2.5 技术博客
- MLCommons 2024 MLPerf Inference v4.0 结果
- MIT & NVIDIA 2023 AWQ 量化论文
- vLLM 官方 2024 vLLM 0.6.x 文档与性能基准
- ModelScope 2024 Qwen 模型镜像仓库