vllm多卡部署Qwen2.5-72B-Instruct

📋 概述

本文详细记录在浪潮NF5468M5服务器上部署Qwen2.5-72B-Instruct大模型的完整过程。服务器配备8张NVIDIA Tesla V100 32GB显卡,通过vLLM框架实现高效推理服务。

🖥️ 硬件配置

组件规格说明
服务器型号浪潮NF5468M52U机架式服务器
GPU8×NVIDIA Tesla V100 SXM2 32GBVolta架构,总计256GB显存
CPU2×Intel Xeon Gold 6248R48核96线程
内存384GB DDR4-2933 ECC REG16-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-size8张量并行度,8张V100并行处理72B模型
--gpu-memory-utilization0.9显存利用率,90%显存用于模型,留10%缓冲
--dtypehalf精度设置,V100使用float16,A100/H100可用bfloat16
--max-model-len16384最大上下文长度,V100建议16384,A100可设32768
--trust-remote-code(无值)必需,Qwen使用自定义模型代码
--enforce-eager(无值)V100必需,计算能力7.0需要禁用CUDA Graph
--swap-space1CPU交换空间,GB单位,减少OOM风险
--max-num-seqs16最大并发数,控制同时处理的请求数
--cpu-offload-gb0禁用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

原因:显存不足。
解决

  1. 降低--max-model-len(如从32768降到8192)
  2. 降低--gpu-memory-utilization(如从0.9降到0.85)
  3. 使用量化模型版本
  4. 减少--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配置下的性能表现:

场景配置首次推理延迟持续生成速度最大并发
原生72B8卡并行,16384上下文3-5秒20-40 tokens/秒16请求
GPTQ-Int48卡并行,32768上下文1-2秒50-80 tokens/秒32请求
AWQ-Int48卡并行,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

📝 总结

关键要点

  1. 硬件匹配:V100计算能力7.0,必须使用float16和eager模式
  2. 资源优化:8卡并行,合理分配显存和CPU资源
  3. 模型选择:根据需求选择原生或量化版本
  4. 参数调优:上下文长度、并发数需平衡性能与资源
  5. 生产就绪:使用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

故障排查流程

  1. 检查GPU状态:nvidia-smi
  2. 检查服务进程:pgrep -f vllm
  3. 检查端口监听:netstat -tlnp | grep :8000
  4. 检查API连通性:curl http://localhost:8000/v1/models
  5. 查看错误日志:sudo journalctl -u vllm-qwen -n 100
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐