vllm多卡部署Qwen2.5-72B-Instruct
·
vllm多卡部署Qwen2.5-72B-Instruct
📋 概述
本文详细记录在浪潮NF5468M5服务器上部署Qwen2.5-72B-Instruct大模型的完整过程。服务器配备8张NVIDIA Tesla V100 32GB显卡,通过vLLM框架实现高效推理服务。
🖥️ 硬件配置
| 组件 | 规格 | 说明 |
|---|---|---|
| 服务器型号 | 浪潮NF5468M5 | 2U机架式服务器 |
| GPU | 8×NVIDIA Tesla V100 SXM2 32GB | Volta架构,总计256GB显存 |
| CPU | 2×Intel Xeon Gold 6248R | 48核96线程 |
| 内存 | 384GB DDR4-2933 ECC REG | 16-24条内存插槽 |
| 系统盘 | 1TB SATA SSD | /dev/sda3 挂载于 / |
| 网络 | 千兆/万兆以太网 | IP: 192.168.15.122/24 |
🛠️ 环境准备
1. 安装NVIDIA驱动
# 更新系统
sudo apt update
# 安装NVIDIA驱动(535版本)
sudo apt install -y nvidia-driver-535
# 重启生效
sudo reboot
2. 验证GPU状态
nvidia-smi
预期输出应显示8张V100显卡,每张32GB显存,驱动版本535.274.02,CUDA 12.2。
3. 安装Miniconda
# 下载Miniconda安装包
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
# 安装到用户目录
bash Miniconda3-latest-Linux-x86_64.sh -b -p $HOME/miniconda3
# 初始化conda
$HOME/miniconda3/bin/conda init bash
source ~/.bashrc
设置环境变量(重要步骤):
# 编辑bash配置文件
echo 'export PATH="$HOME/miniconda3/bin:$PATH"' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH="/usr/local/cuda-12.2/lib64:$LD_LIBRARY_PATH"' >> ~/.bashrc
# 立即生效
source ~/.bashrc
# 验证安装
conda --version
4. 创建Python环境
# 创建名为qwen3的Python 3.10环境
conda create -n qwen3 python=3.10 -y
# 激活环境
conda activate qwen3
📦 安装依赖包
1. 基础依赖
# 安装必要的系统工具
sudo apt install -y wget gnupg vim
# 添加NVIDIA CUDA仓库
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt update
2. 安装Python包
# 激活conda环境
conda activate qwen3
# 安装vLLM推理框架(指定兼容版本)
pip install vllm==0.8.4
# 安装ModelScope(用于下载国内模型)
pip install modelscope
# 可选的:安装PyTorch(如果vLLM依赖的版本不符)
pip install torch==2.1.0 torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
3. 环境验证
# 验证GPU识别
python -c "import torch; print(f'GPU数量: {torch.cuda.device_count()}')"
# 验证vLLM安装
python -c "import vllm; print(f'vLLM版本: {vllm.__version__}')"
# 验证CUDA可用性
python -c "import torch; print(f'CUDA可用: {torch.cuda.is_available()}')"
📥 下载模型
使用ModelScope(推荐国内用户)
# 确保在conda环境中
conda activate qwen3
# 下载Qwen2.5-72B-Instruct模型
modelscope download --model Qwen/Qwen2.5-72B-Instruct --local_dir /home/mzt/models

4. 验证模型完整性
# 检查模型文件
ls -lh /home/mzt/models/ | head -20
# 预期看到的主要文件:
# - config.json # 模型配置文件
# - model.safetensors # 权重文件(可能有多个分片)
# - tokenizer.json # 分词器文件
# - tokenizer_config.json
# - generation_config.json
# - model.safetensors.index.json # 分片索引文件
🚀 启动vLLM API服务
1. V100专用优化配置
由于Tesla V100计算能力为7.0(不支持bfloat16),需要特殊配置:
# 进入conda环境
conda activate qwen3
# V100优化启动命令
python -m vllm.entrypoints.api_server \
--model /home/mzt/models/Qwen2.5-72B-Instruct \
--tensor-parallel-size 8 \
--gpu-memory-utilization 0.9 \
--dtype half \ # V100必须使用half,不能用bfloat16
--max-model-len 16384 \ # 降低上下文长度以节省显存
--port 8000 \
--host 0.0.0.0 \
--trust-remote-code \ # Qwen模型必需
--swap-space 1 \ # 减少CPU交换空间
--max-num-seqs 16 \
--enforce-eager \ # V100必需,禁用CUDA Graph
--cpu-offload-gb 0 # 禁用CPU卸载
注意:后台运行大模型可以采用下面章节的启动脚本
2. 参数详解表
| 参数 | 值 | 说明 |
|---|---|---|
--model | /home/mzt/models/Qwen2.5-72B-Instruct | 完整模型路径,必须是包含config.json的目录 |
--tensor-parallel-size | 8 | 张量并行度,8张V100并行处理72B模型 |
--gpu-memory-utilization | 0.9 | 显存利用率,90%显存用于模型,留10%缓冲 |
--dtype | half | 精度设置,V100使用float16,A100/H100可用bfloat16 |
--max-model-len | 16384 | 最大上下文长度,V100建议16384,A100可设32768 |
--trust-remote-code | (无值) | 必需,Qwen使用自定义模型代码 |
--enforce-eager | (无值) | V100必需,计算能力7.0需要禁用CUDA Graph |
--swap-space | 1 | CPU交换空间,GB单位,减少OOM风险 |
--max-num-seqs | 16 | 最大并发数,控制同时处理的请求数 |
--cpu-offload-gb | 0 | 禁用CPU卸载,减少CPU内存压力 |
3. 高级优化配置
# 生产环境优化配置
python -m vllm.entrypoints.api_server \
--model /home/mzt/models/Qwen2.5-72B-Instruct \
--tensor-parallel-size 8 \
--gpu-memory-utilization 0.92 \
--dtype half \
--max-model-len 12288 \
--port 8000 \
--host 0.0.0.0 \
--trust-remote-code \
--swap-space 0.5 \
--cpu-offload-gb 0 \
--enforce-eager \
--max-num-seqs 32 \
--max-num-batched-tokens 4096 \
--block-size 16 \
--disable-custom-all-reduce
🔍 监控与验证
1. 监控GPU状态
# 实时监控GPU使用情况(另开终端)
watch -n 2 nvidia-smi
# 详细监控
nvidia-smi --query-gpu=name,memory.total,memory.used,memory.free,temperature.gpu,utilization.gpu --format=csv -l 1

正常加载状态:
- 每张V100显存使用:约29-30GB(90%利用率)
- GPU温度:35-45°C
- GPU利用率:加载时0-5%,推理时30-80%
2. 监控加载进度
模型加载过程中会显示:
Loading safetensors checkpoint shards: 27% Completed | 10/37 [02:15<06:05, 13.50s/it]
总37个分片,加载时间约5-15分钟,取决于磁盘速度。
3. 服务启动验证
成功启动的标志:
INFO: Uvicorn running on http://0.0.0.0:8000
INFO: Loaded model in 326.45 seconds
INFO: Starting HTTP server on 0.0.0.0:8000
4. API接口测试
# 测试1:获取模型列表
curl http://localhost:8000/v1/models | python -m json.tool
# 测试2:简单对话
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "/home/mzt/models/Qwen2.5-72B-Instruct",
"messages": [
{"role": "user", "content": "你好,请介绍一下你自己"}
],
"max_tokens": 100,
"temperature": 0.7
}' | python -m json.tool
# 测试3:批量处理(Python脚本)
cat > test_api.py << 'EOF'
import requests
import json
url = "http://localhost:8000/v1/chat/completions"
headers = {"Content-Type": "application/json"}
data = {
"model": "/home/mzt/models/Qwen2.5-72B-Instruct",
"messages": [{"role": "user", "content": "中国的首都是哪里?"}],
"max_tokens": 50,
"temperature": 0.7
}
response = requests.post(url, headers=headers, json=data)
print(json.dumps(response.json(), ensure_ascii=False, indent=2))
EOF
python test_api.py
🐛 常见问题解决
问题1:bfloat16不支持错误
ValueError: Bfloat16 is only supported on GPUs with compute capability of at least 8.0
原因:V100计算能力7.0,不支持bfloat16。
解决:使用--dtype half替代--dtype bfloat16。
问题2:交换空间过大
ValueError: Too large swap space. 32.00 GiB out of the 31.02 GiB total CPU memory
原因:默认交换空间太大,系统内存不足。
解决:添加--swap-space 0.5或--swap-space 1参数。
问题3:模型路径错误
ValueError: Invalid repository ID or local directory specified
原因:路径不正确或缺少配置文件。
解决:
# 检查路径
ls -la /home/mzt/models/Qwen2.5-72B-Instruct/
# 确保有config.json文件
# 使用完整路径:--model /home/mzt/models/Qwen2.5-72B-Instruct
问题4:CUDA out of memory
原因:显存不足。
解决:
- 降低
--max-model-len(如从32768降到8192) - 降低
--gpu-memory-utilization(如从0.9降到0.85) - 使用量化模型版本
- 减少
--max-num-seqs并发数
问题5:加载速度慢
原因:磁盘IO瓶颈或网络问题。
解决:
# 检查磁盘IO
iostat -x 1
# 使用更快的磁盘(NVMe SSD)
# 确保模型文件在本地,不在网络存储
⚡ 性能优化建议
1. 使用量化模型(显著提升)
# 下载GPTQ-Int4量化版本(约40GB,比原生144GB小很多)
modelscope download --model Qwen/Qwen2.5-72B-Instruct-GPTQ-Int4 \
--local_dir /home/mzt/models/Qwen2.5-72B-GPTQ
# 启动量化模型
python -m vllm.entrypoints.api_server \
--model /home/mzt/models/Qwen2.5-72B-GPTQ \
--tensor-parallel-size 8 \
--gpu-memory-utilization 0.95 \
--dtype half \
--max-model-len 32768 \
--quantization gptq \
--port 8000 \
--host 0.0.0.0 \
--trust-remote-code
量化模型优势:
- 显存占用:40GB vs 144GB(原生)
- 加载时间:1-2分钟 vs 5-15分钟
- 支持更长上下文:可设32768 tokens
2. 系统级优化
# 增加系统交换空间
sudo fallocate -l 32G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
# 查看交换空间
free -h
swapon --show
# 优化内核参数
echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
echo 'vm.vfs_cache_pressure=50' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 设置环境变量
export VLLM_NO_MEMORY_PROFILING=1
export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128,expandable_segments:True
3. 启动脚本
# 启动脚本
#!/bin/bash
# start_vllm_background.sh
# 设置变量
MODEL_PATH="/home/mzt/models"
LOG_DIR="/home/mzt/vllm_logs"
PORT=8000
# 创建日志目录
mkdir -p "$LOG_DIR"
# 生成时间戳
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG_FILE="$LOG_DIR/vllm_${TIMESTAMP}.log"
echo "启动vLLM API服务..."
echo "模型: $MODEL_PATH"
echo "端口: $PORT"
echo "日志文件: $LOG_FILE"
# 使用nohup在后台运行
nohup python -m vllm.entrypoints.openai.api_server \
--model "$MODEL_PATH" \
--tensor-parallel-size 8 \
--gpu-memory-utilization 0.95 \
--dtype half \
--max-model-len 32768 \
--port "$PORT" \
--host 0.0.0.0 \
--trust-remote-code \
--swap-space 0.5 \
--max-num-seqs 4 \
--enforce-eager \
--cpu-offload-gb 2 \
--block-size 16 \
--max-num-batched-tokens 65536 \
--kv-cache-dtype fp8 \
--enable-chunked-prefill \
--max-long-partial-prefills 1 \
--num-lookahead-slots 2 \
--disable-custom-all-reduce \
--served-model-name "Qwen2.5-72B-Instruct" \
--uvicorn-log-level info \
> "$LOG_FILE" 2>&1 &
# 获取进程ID
PID=$!
echo "进程PID: $PID"
echo "PID保存到: $LOG_DIR/vllm.pid"
echo $PID > "$LOG_DIR/vllm.pid"
# 等待几秒检查进程
sleep 3
# 检查进程是否运行
if kill -0 $PID 2>/dev/null; then
echo "✅ vLLM服务启动成功!"
echo "查看日志: tail -f $LOG_FILE"
echo "停止服务: kill $PID"
else
echo "❌ vLLM服务启动失败,查看日志: tail -n 50 $LOG_FILE"
exit 1
fi
3.1 赋权限
chmod +x start_qwen.sh
3.2 运行脚本
./start_qwen.sh
4. Systemd服务管理(生产环境)
# 创建systemd服务文件
sudo tee /etc/systemd/system/vllm-qwen.service << 'EOF'
[Unit]
Description=vLLM Qwen2.5-72B API Server
After=network.target nvidia-persistenced.service
Requires=nvidia-persistenced.service
[Service]
Type=simple
User=mzt
Group=mzt
WorkingDirectory=/home/mzt
Environment="PATH=/home/mzt/miniconda3/envs/qwen3/bin"
Environment="PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128"
Environment="VLLM_NO_MEMORY_PROFILING=1"
# 启动命令
ExecStart=/home/mzt/miniconda3/envs/qwen3/bin/python -m vllm.entrypoints.api_server \
--model /home/mzt/models/Qwen2.5-72B-Instruct \
--tensor-parallel-size 8 \
--gpu-memory-utilization 0.9 \
--dtype half \
--max-model-len 16384 \
--port 8000 \
--host 0.0.0.0 \
--trust-remote-code \
--swap-space 1 \
--max-num-seqs 16 \
--enforce-eager \
--cpu-offload-gb 0
Restart=always
RestartSec=10
StandardOutput=journal
StandardError=journal
# 资源限制
LimitNOFILE=65536
LimitMEMLOCK=infinity
[Install]
WantedBy=multi-user.target
EOF
# 重载systemd配置
sudo systemctl daemon-reload
# 启用并启动服务
sudo systemctl enable vllm-qwen
sudo systemctl start vllm-qwen
# 查看服务状态
sudo systemctl status vllm-qwen
# 查看日志
sudo journalctl -u vllm-qwen -f
5. 监控脚本
# 创建监控脚本
cat > monitor_qwen.sh << 'EOF'
#!/bin/bash
echo "====== Qwen2.5-72B 服务监控 ======"
echo "时间: $(date)"
echo ""
# 检查服务进程
echo "1. 进程状态:"
pgrep -f "vllm.entrypoints.api_server" >/dev/null && echo "✅ vLLM服务运行中" || echo "❌ vLLM服务未运行"
echo ""
echo "2. GPU状态:"
nvidia-smi --query-gpu=name,memory.used,memory.total,utilization.gpu,temperature.gpu --format=csv
echo ""
echo "3. 端口监听:"
netstat -tlnp | grep :8000
echo ""
echo "4. API健康检查:"
curl -s http://localhost:8000/v1/models >/dev/null 2>&1
if [ $? -eq 0 ]; then
echo "✅ API服务正常"
else
echo "❌ API服务异常"
fi
echo ""
echo "5. 系统资源:"
free -h | grep -E "^(Mem|Swap)"
echo ""
echo "监控完成于: $(date)"
EOF
chmod +x monitor_qwen.sh
# 每5分钟监控一次
watch -n 300 ./monitor_qwen.sh
📊 性能基准
在8×Tesla V100 32GB配置下的性能表现:
| 场景 | 配置 | 首次推理延迟 | 持续生成速度 | 最大并发 |
|---|---|---|---|---|
| 原生72B | 8卡并行,16384上下文 | 3-5秒 | 20-40 tokens/秒 | 16请求 |
| GPTQ-Int4 | 8卡并行,32768上下文 | 1-2秒 | 50-80 tokens/秒 | 32请求 |
| AWQ-Int4 | 8卡并行,32768上下文 | 1-2秒 | 40-70 tokens/秒 | 32请求 |
资源使用对比:
- 原生72B:每卡29GB显存,总计232GB
- GPTQ-Int4:每卡12GB显存,总计96GB
- AWQ-Int4:每卡10GB显存,总计80GB
🔧 维护与升级
1. 更新vLLM版本
# 备份当前环境
conda create --name qwen3_backup --clone qwen3
# 升级vLLM
conda activate qwen3
pip install --upgrade vllm
# 测试兼容性
python -c "from vllm import LLM; print('vLLM升级成功')"
2. 更新模型版本
# 下载新版模型
cd /home/mzt/models
mv Qwen2.5-72B-Instruct Qwen2.5-72B-Instruct_old
modelscope download --model Qwen/Qwen2.5-72B-Instruct --local_dir Qwen2.5-72B-Instruct
# 重启服务
sudo systemctl restart vllm-qwen
3. 日志管理
# 查看实时日志
sudo journalctl -u vllm-qwen -f
# 查看历史日志
sudo journalctl -u vllm-qwen --since "2025-12-27" --until "2025-12-28"
# 日志轮转配置
sudo tee /etc/logrotate.d/vllm << 'EOF'
/home/mzt/vllm_*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 644 mzt mzt
}
EOF
📝 总结
关键要点
- 硬件匹配:V100计算能力7.0,必须使用float16和eager模式
- 资源优化:8卡并行,合理分配显存和CPU资源
- 模型选择:根据需求选择原生或量化版本
- 参数调优:上下文长度、并发数需平衡性能与资源
- 生产就绪:使用systemd服务管理和监控脚本
推荐配置
对于生产环境,推荐配置:
# 使用量化模型以获得最佳性价比
modelscope download --model Qwen/Qwen2.5-72B-Instruct-GPTQ-Int4 --local_dir /home/mzt/models
# 启动命令
python -m vllm.entrypoints.api_server \
--model /home/mzt/models/Qwen2.5-72B-Instruct-GPTQ-Int4 \
--tensor-parallel-size 8 \
--gpu-memory-utilization 0.95 \
--dtype half \
--max-model-len 32768 \
--quantization gptq \
--port 8000 \
--host 0.0.0.0 \
--trust-remote-code \
--max-num-seqs 32
故障排查流程
- 检查GPU状态:
nvidia-smi - 检查服务进程:
pgrep -f vllm - 检查端口监听:
netstat -tlnp | grep :8000 - 检查API连通性:
curl http://localhost:8000/v1/models - 查看错误日志:
sudo journalctl -u vllm-qwen -n 100
更多推荐
所有评论(0)