服务器使用 vLLM 部署 Qwen2.5-Coder-7B-CL 笔记

文章目录

    • 前言
    • 一、部署目标与服务器基本情况
      • [1.1 部署目标](#1.1 部署目标)
      • [1.2 服务器硬件配置](#1.2 服务器硬件配置)
    • 二、先选对磁盘目录
      • [2.1 为什么不能把模型放到 `/home/user`](#2.1 为什么不能把模型放到 /home/user)
      • [2.2 推荐目录结构](#2.2 推荐目录结构)
      • [2.3 处理目录权限](#2.3 处理目录权限)
    • [三、准备 Hugging Face 模型文件](#三、准备 Hugging Face 模型文件)
      • [3.1 安装 Hugging Face 命令行工具](#3.1 安装 Hugging Face 命令行工具)
      • [3.2 配置 Hugging Face 镜像](#3.2 配置 Hugging Face 镜像)
      • [3.3 下载模型](#3.3 下载模型)
    • [四、为什么不能直接安装最新版 vLLM](#四、为什么不能直接安装最新版 vLLM)
      • [4.1 第一次失败的原因](#4.1 第一次失败的原因)
      • [4.2 最终选择的版本组合](#4.2 最终选择的版本组合)
    • [五、安装 Miniconda 到 `/data2`](#五、安装 Miniconda 到 /data2)
      • [5.1 为什么要自己安装 Miniconda](#5.1 为什么要自己安装 Miniconda)
      • [5.2 下载 Miniconda](#5.2 下载 Miniconda)
      • [5.3 安装 Miniconda](#5.3 安装 Miniconda)
    • [六、配置 conda 和 pip 镜像源](#六、配置 conda 和 pip 镜像源)
      • [6.1 conda 配置文件在哪里](#6.1 conda 配置文件在哪里)
      • [6.2 配置 conda 清华镜像](#6.2 配置 conda 清华镜像)
      • [6.3 配置 pip 镜像](#6.3 配置 pip 镜像)
    • [七、创建 vLLM 兼容环境](#七、创建 vLLM 兼容环境)
      • [7.1 创建环境](#7.1 创建环境)
      • [7.2 设置缓存目录](#7.2 设置缓存目录)
    • [八、安装 torch、vLLM 和 transformers](#八、安装 torch、vLLM 和 transformers)
      • [8.1 安装基础工具](#8.1 安装基础工具)
      • [8.2 安装 CUDA 12.1 版 PyTorch](#8.2 安装 CUDA 12.1 版 PyTorch)
      • [8.3 安装 vLLM 旧版](#8.3 安装 vLLM 旧版)
      • [8.4 处理 transformers 版本不匹配](#8.4 处理 transformers 版本不匹配)
    • [九、使用 tmux 保持 vLLM 后台运行](#九、使用 tmux 保持 vLLM 后台运行)
      • [9.1 为什么要用 tmux](#9.1 为什么要用 tmux)
      • [9.2 创建 tmux 会话](#9.2 创建 tmux 会话)
      • [9.3 离开 tmux 但不停止服务](#9.3 离开 tmux 但不停止服务)
    • [十、启动 Qwen2.5-Coder-7B-CL](#十、启动 Qwen2.5-Coder-7B-CL)
      • [10.1 vLLM 启动命令](#10.1 vLLM 启动命令)
      • [10.2 参数解释](#10.2 参数解释)
      • [10.3 启动成功标志](#10.3 启动成功标志)
    • [十一、测试 vLLM 服务](#十一、测试 vLLM 服务)
      • [11.1 测试模型列表](#11.1 测试模型列表)
      • [11.2 测试对话接口](#11.2 测试对话接口)
      • [11.3 查看 GPU 占用](#11.3 查看 GPU 占用)
    • [十二、API 地址和 API Key 怎么填](#十二、API 地址和 API Key 怎么填)
      • [12.1 服务器本机调用](#12.1 服务器本机调用)
      • [12.2 其他机器访问](#12.2 其他机器访问)
      • [12.3 是否需要 API Key](#12.3 是否需要 API Key)
    • 十三、常见问题总结
      • [13.1 `conda: command not found`](#13.1 conda: command not found)
      • [13.2 `CondaToSNonInteractiveError`](#13.2 CondaToSNonInteractiveError)
      • [13.3 `Permission denied`](#13.3 Permission denied)
      • [13.4 `The NVIDIA driver on your system is too old`](#13.4 The NVIDIA driver on your system is too old)
      • [13.5 `torch has no attribute float8_e8m0fnu`](#13.5 torch has no attribute float8_e8m0fnu)
      • [13.6 `Address already in use`](#13.6 Address already in use)
    • 总结

前言

这篇笔记记录一次在实验室服务器上使用 vLLM 部署本地 Qwen2.5-Coder-7B-CL 模型的完整过程。

这次部署并不是简单执行一条命令就完成,中间遇到了很多真实问题:

  1. 服务器磁盘很多,不知道模型和环境应该放哪里
  2. 服务器没有 conda,需要手动安装 Miniconda
  3. conda 默认源慢,需要配置国内镜像
  4. vLLM 最新版和服务器 NVIDIA 驱动不兼容
  5. torch / vLLM / transformers 版本不匹配
  6. SSH 断开后服务可能停止,需要 tmux 保活

最终我们成功在服务器上用两张 RTX A6000 部署了 Qwen2.5-Coder-7B-CL,并提供 OpenAI 兼容 API 接口。

本文将从服务器环境检查开始,逐步整理模型下载、环境配置、vLLM 安装、模型启动、接口测试和常见问题处理。

一、部署目标与服务器基本情况

1.1 部署目标

本次要部署的模型是:

text 复制代码
czlll/Qwen2.5-Coder-7B-CL

服务器本地模型路径是:

bash 复制代码
/data2/like/models/Qwen2.5-Coder-7B-CL

目标是用 vLLM 启动一个 OpenAI 兼容接口:

text 复制代码
API Base: http://127.0.0.1:8002/v1
Model: qwen-7B
API Key: EMPTY

后续 就可以像调用 OpenAI API 一样调用这个本地模型。

1.2 服务器硬件配置

服务器主要配置如下:

text 复制代码
CPU: Intel Xeon Silver 4210,40 逻辑核心
内存: 157GB
GPU: 2 × NVIDIA RTX A6000,每张 48GB
驱动: NVIDIA Driver 535.261.03
CUDA: 12.2
系统: Ubuntu 20.04

GPU 配置非常适合部署 7B 模型,尤其是两张 RTX A6000,每张 48GB,适合尝试:

text 复制代码
双卡张量并行
128K 上下文
低并发推理

二、先选对磁盘目录

2.1 为什么不能把模型放到 /home/user

使用服务器前,首先要看磁盘空间:

bash 复制代码
df -h

命令含义:

text 复制代码
df = disk free,查看磁盘空间
-h = human-readable,用 GB、TB 等易读单位显示

服务器磁盘大致情况如下:

text 复制代码
/          388G,已用 357G,只剩 11G,98%
/ssd_data  1.8T,已用 1.7T,只剩 15G,100%
/data2     3.6T,已用 2.5T,还剩 942G,73%

结论很明确:

text 复制代码
/ 和 /home/user 不适合放大模型
/ssd_data 已经满了,也不适合
/data2 还有将近 1TB 空间,最适合

所以所有大文件都放到:

bash 复制代码
/data2/like

2.2 推荐目录结构

创建自己的工作目录:

bash 复制代码
mkdir -p /data2/like/models
mkdir -p /data2/like/envs
mkdir -p /data2/like/tmp
mkdir -p /data2/like/pip-cache
mkdir -p /data2/like/hf-cache
mkdir -p /data2/like/conda-pkgs

各目录作用:

text 复制代码
/data2/like/models      放模型文件
/data2/like/envs        放 conda 虚拟环境
/data2/like/tmp         放临时文件
/data2/like/pip-cache   放 pip 缓存
/data2/like/hf-cache    放 Hugging Face 缓存
/data2/like/conda-pkgs  放 conda 包缓存

2.3 处理目录权限

如果创建目录时出现:

bash 复制代码
mkdir: cannot create directory 'models': Permission denied

说明当前用户没有写权限。

有时用:

bash 复制代码
sudo mkdir models

可以创建成功,但会导致目录属于 root,后面普通用户下载模型时又会遇到:

text 复制代码
PermissionError: [Errno 13] Permission denied

正确做法是把自己的工作目录改成当前用户拥有:

bash 复制代码
sudo chown -R user:user /data2/like

命令含义:

text 复制代码
sudo = 用管理员权限执行
chown = change owner,修改所有者
-R = recursive,递归修改所有子目录和文件
user:user = 用户名:用户组
/data2/like = 要修改的目录

检查权限:

bash 复制代码
ls -ld /data2/like
ls -ld /data2/like/models

如果看到:

text 复制代码
drwxr-xr-x 4 user user ... /data2/like
drwxr-xr-x 2 user user ... /data2/like/models

说明权限已经正常。

三、准备 Hugging Face 模型文件

3.1 安装 Hugging Face 命令行工具

如果服务器没有:

bash 复制代码
hf
huggingface-cli

可以安装:

bash 复制代码
pip install -U huggingface_hub -i https://pypi.tuna.tsinghua.edu.cn/simple

如果安装后提示:

text 复制代码
hf, huggingface-cli are installed in '/home/user/.local/bin' which is not on PATH

说明命令已经安装,但终端找不到。

临时加入 PATH:

bash 复制代码
export PATH="$HOME/.local/bin:$PATH"

永久加入:

bash 复制代码
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

检查:

bash 复制代码
which hf
which huggingface-cli

3.2 配置 Hugging Face 镜像

如果服务器访问 Hugging Face 慢,可以设置镜像:

bash 复制代码
export HF_ENDPOINT=https://hf-mirror.com

永久生效:

bash 复制代码
echo 'export HF_ENDPOINT=https://hf-mirror.com' >> ~/.bashrc
source ~/.bashrc

注意:

HF_ENDPOINT 只影响 Hugging Face 模型下载,它不影响 conda,也不影响 pip

3.3 下载模型

推荐用新版命令:

bash 复制代码
hf download czlll/Qwen2.5-Coder-7B-CL \
  --local-dir /data2/like/models/Qwen2.5-Coder-7B-CL

下载完成后检查:

bash 复制代码
ls -lh /data2/like/models/Qwen2.5-Coder-7B-CL
du -sh /data2/like/models/Qwen2.5-Coder-7B-CL

正常应该能看到:

text 复制代码
config.json
generation_config.json
tokenizer.json
tokenizer_config.json
model.safetensors.index.json
*.safetensors

四、为什么不能直接安装最新版 vLLM

4.1 第一次失败的原因

最开始直接安装最新版 vLLM 后,启动模型时报错:

text 复制代码
RuntimeError: The NVIDIA driver on your system is too old

服务器驱动信息是:

text 复制代码
NVIDIA Driver 535.261.03
CUDA Version 12.2

而最新版 vLLM / PyTorch 可能依赖更新的 CUDA 运行时,例如 CUDA 12.8 或 12.9。这样就会出现:

text 复制代码
服务器驱动较旧
新版 PyTorch / vLLM 要求更高
GPU 初始化失败

可以理解成:

text 复制代码
服务器驱动 = 老插座
最新版 vLLM = 新电器
规格对不上,插上就报错

所以我们不能继续用最新版 vLLM,而要安装适配 CUDA 12.1 的旧版本组合。

4.2 最终选择的版本组合

最终采用:

text 复制代码
Python 3.10
torch 2.5.1 + cu121
vLLM 0.6.6.post1
transformers 4.46.3
tokenizers 0.20.3

这里的 cu121 表示 CUDA 12.1,对当前服务器 CUDA 12.2 驱动更友好。

五、安装 Miniconda 到 /data2

5.1 为什么要自己安装 Miniconda

服务器当前没有可用的 conda:

bash 复制代码
conda: command not found

所以需要自己安装 Miniconda。

不要装到 /home/user,因为系统盘快满了。统一装到:

bash 复制代码
/data2/like/miniconda3

5.2 下载 Miniconda

bash 复制代码
mkdir -p /data2/like/software
cd /data2/like/software

wget -O Miniconda3-latest-Linux-x86_64.sh \
  https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh

命令含义:

text 复制代码
wget = 从网络下载文件
-O = output,指定保存文件名

如果 wget 不可用,也可以用:

bash 复制代码
curl -L -o Miniconda3-latest-Linux-x86_64.sh \
  https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh

5.3 安装 Miniconda

bash 复制代码
bash Miniconda3-latest-Linux-x86_64.sh -b -p /data2/like/miniconda3

命令含义:

text 复制代码
bash = 执行 shell 脚本
-b = batch,静默安装
-p = prefix,指定安装路径

加载 conda:

bash 复制代码
source /data2/like/miniconda3/etc/profile.d/conda.sh

检查:

bash 复制代码
conda --version

永久生效:

bash 复制代码
echo 'source /data2/like/miniconda3/etc/profile.d/conda.sh' >> ~/.bashrc
source ~/.bashrc

六、配置 conda 和 pip 镜像源

6.1 conda 配置文件在哪里

虽然 Miniconda 装在:

bash 复制代码
/data2/like/miniconda3

但 conda 的用户配置文件默认在:

bash 复制代码
~/.condarc

也就是:

bash 复制代码
/home/user/.condarc

这很正常。

可以理解为:

text 复制代码
/data2/like/miniconda3 = conda 程序本体
~/.condarc = 当前用户的 conda 配置文件

6.2 配置 conda 清华镜像

备份旧配置:

bash 复制代码
cp ~/.condarc ~/.condarc.bak 2>/dev/null || true

写入新配置:

bash 复制代码
cat > ~/.condarc <<'EOF'
channels:
  - defaults

show_channel_urls: true

default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r

custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  nvidia: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

envs_dirs:
  - /data2/like/envs

pkgs_dirs:
  - /data2/like/conda-pkgs
EOF

这个配置做了三件事:

text 复制代码
1. conda create / conda install 走清华镜像
2. 虚拟环境默认放到 /data2/like/envs
3. conda 包缓存放到 /data2/like/conda-pkgs

创建缓存目录:

bash 复制代码
mkdir -p /data2/like/envs
mkdir -p /data2/like/conda-pkgs

清理旧索引:

bash 复制代码
conda clean -i -y

检查配置:

bash 复制代码
conda config --show-sources

如果看到 mirrors.tuna.tsinghua.edu.cn,说明镜像配置成功。

6.3 配置 pip 镜像

bash 复制代码
mkdir -p ~/.pip

cat > ~/.pip/pip.conf <<'EOF'
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
timeout = 120

[install]
trusted-host = pypi.tuna.tsinghua.edu.cn
EOF

检查:

bash 复制代码
pip config list

注意:

text 复制代码
conda 镜像用于 conda create / conda install
pip 镜像用于 pip install
HF_ENDPOINT 用于 Hugging Face 模型下载

它们是三套不同的配置。

七、创建 vLLM 兼容环境

7.1 创建环境

bash 复制代码
conda create -p /data2/like/envs/vllm-cu121 python=3.10 -y

命令含义:

text 复制代码
conda create = 创建 conda 环境
-p = prefix,指定环境路径
python=3.10 = 使用 Python 3.10
-y = 自动确认

激活环境:

bash 复制代码
conda activate /data2/like/envs/vllm-cu121

检查:

bash 复制代码
which python
python --version

正常输出类似:

text 复制代码
/data2/like/envs/vllm-cu121/bin/python
Python 3.10.x

7.2 设置缓存目录

bash 复制代码
export TMPDIR=/data2/like/tmp
export PIP_CACHE_DIR=/data2/like/pip-cache
export HF_HOME=/data2/like/hf-cache

这些目录可以防止 pip、临时文件、Hugging Face 缓存占用系统盘。

八、安装 torch、vLLM 和 transformers

8.1 安装基础工具

bash 复制代码
python -m pip install -U pip setuptools wheel

命令含义:

text 复制代码
python -m pip = 使用当前环境的 pip
install = 安装
-U = upgrade,升级
pip setuptools wheel = Python 包安装基础工具

8.2 安装 CUDA 12.1 版 PyTorch

bash 复制代码
python -m pip install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 \
  --index-url https://download.pytorch.org/whl/cu121

这里:

text 复制代码
cu121 = CUDA 12.1

如果官方源下载慢,可以尝试 PyTorch 国内镜像。但核心原则不变:要安装 cu121 版本。

安装完成后检查:

bash 复制代码
python -c "import torch; print(torch.__version__, torch.version.cuda, torch.cuda.is_available())"

期望输出:

text 复制代码
2.5.1+cu121 12.1 True

8.3 安装 vLLM 旧版

bash 复制代码
python -m pip install vllm==0.6.6.post1 \
  --extra-index-url https://download.pytorch.org/whl/cu121

不要执行:

bash 复制代码
python -m pip install -U vllm

因为 -U 可能会把 vLLM 或相关依赖升级到不兼容的新版本。

8.4 处理 transformers 版本不匹配

安装后出现过:

text 复制代码
AttributeError: module 'torch' has no attribute 'float8_e8m0fnu'

原因是:

text 复制代码
torch = 2.5.1
transformers = 太新

新版 transformers 调用了 torch 2.5.1 没有的属性,所以需要降级 transformers。

执行:

bash 复制代码
python -m pip uninstall -y transformers tokenizers

安装兼容版本:

bash 复制代码
python -m pip install "transformers==4.46.3" "tokenizers==0.20.3" \
  -i https://pypi.tuna.tsinghua.edu.cn/simple

然后检查:

bash 复制代码
python -c "import torch; print(torch.__version__, torch.version.cuda, torch.cuda.is_available())"
python -c "import transformers; print(transformers.__version__)"
python -c "import tokenizers; print(tokenizers.__version__)"
python -c "import vllm; print(vllm.__version__)"

期望结果:

text 复制代码
torch: 2.5.1+cu121,cuda available True
transformers: 4.46.3
tokenizers: 0.20.3
vllm: 0.6.6.post1

九、使用 tmux 保持 vLLM 后台运行

9.1 为什么要用 tmux

如果直接在 SSH 终端里运行:

bash 复制代码
vllm serve ...

一旦本地 SSH 工具关闭、网络断开、电脑关机,vLLM 服务可能会一起停止。

tmux 可以理解为服务器里的"后台终端房间"。

text 复制代码
普通 SSH:
你关闭连接,终端可能没了,程序可能停了

tmux:
终端房间开在服务器内部
你断开 SSH,只是离开房间
里面的 vLLM 继续运行

9.2 创建 tmux 会话

bash 复制代码
tmux new -s vllm_qwen7b_128k

命令含义:

text 复制代码
tmux = 终端复用工具
new = 新建会话
-s = session name,指定会话名字
vllm_qwen7b_128k = 会话名

进入 tmux 后重新激活环境:

bash 复制代码
source /data2/like/miniconda3/etc/profile.d/conda.sh
conda activate /data2/like/envs/vllm-cu121

9.3 离开 tmux 但不停止服务

vLLM 启动成功后,如果想离开:

text 复制代码
Ctrl + B
然后按 D

这叫 detach

重新进入:

bash 复制代码
tmux attach -t vllm_qwen7b_128k

查看会话:

bash 复制代码
tmux ls

停止服务:

text 复制代码
进入 tmux 后按 Ctrl + C

十、启动 Qwen2.5-Coder-7B-CL

10.1 vLLM 启动命令

最终使用的启动命令是:

bash 复制代码
CUDA_VISIBLE_DEVICES=0,1 vllm serve /data2/like/models/Qwen2.5-Coder-7B-CL \
  --tensor-parallel-size 2 \
  --host 0.0.0.0 \
  --port 8002 \
  --served-model-name qwen-7B \
  --dtype auto \
  --gpu-memory-utilization 0.92 \
  --max-model-len 131072 \
  --max-num-seqs 1

10.2 参数解释

text 复制代码
CUDA_VISIBLE_DEVICES=0,1

使用第 0、1 两张 GPU。

text 复制代码
vllm serve /data2/like/models/Qwen2.5-Coder-7B-CL

用 vLLM 启动本地模型目录。

text 复制代码
--tensor-parallel-size 2

使用双卡张量并行,把模型切到两张 GPU 上运行。

text 复制代码
--host 0.0.0.0

监听所有网卡。这样服务器内部和其他机器都有机会访问。

text 复制代码
--port 8002

服务端口是 8002。

之前 8001 被占用,所以换成 8002。

text 复制代码
--served-model-name qwen-7B

对外暴露的模型名叫 qwen-7B

后面请求 API 时,model 字段就写:

json 复制代码
"model": "qwen-7B"
--dtype auto

让 vLLM 自动选择模型精度。

text 复制代码
--gpu-memory-utilization 0.92

允许 vLLM 使用每张 GPU 大约 92% 的显存。

text 复制代码
--max-model-len 131072

最大上下文长度是 131072 token,也就是 128K。

text 复制代码
--max-num-seqs 1

低并发,同一时间最多处理 1 个请求序列。因为 128K 上下文非常吃 KV Cache,所以先低并发最稳。

10.3 启动成功标志

如果日志出现:

text 复制代码
Application startup complete.
Uvicorn running on http://0.0.0.0:8002

说明 vLLM 已经成功启动。

这时不要按 Ctrl + C,否则服务会停止。

十一、测试 vLLM 服务

11.1 测试模型列表

另开一个终端,执行:

bash 复制代码
curl http://127.0.0.1:8002/v1/models

如果返回中有:

json 复制代码
"id": "qwen-7B"

说明服务正常。

11.2 测试对话接口

bash 复制代码
curl http://127.0.0.1:8002/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen-7B",
    "messages": [
      {"role": "user", "content": "你好,请用一句话介绍你自己。"}
    ],
    "temperature": 0.2,
    "max_tokens": 128
  }'

如果返回模型回复,说明部署成功。

11.3 查看 GPU 占用

bash 复制代码
nvidia-smi

如果两张 GPU 都有明显显存占用,说明模型已经加载到 GPU 上。

十二、API 地址和 API Key 怎么填

12.1 服务器本机调用

如果 LocAgent 和 vLLM 在同一台服务器上:

bash 复制代码
export OPENAI_API_BASE="http://127.0.0.1:8002/v1"
export OPENAI_API_KEY="EMPTY"

模型名:

bash 复制代码
--model openai/qwen-7B

这里的 qwen-7B 必须和启动 vLLM 时的:

bash 复制代码
--served-model-name qwen-7B

一致。

12.2 其他机器访问

如果要从本地电脑访问服务器,可以用服务器 IP

前提是:

text 复制代码
你的电脑能访问这台服务器
服务器 8002 端口没有被防火墙拦截
你和服务器在同一个内网或有可达网络

12.3 是否需要 API Key

如果启动 vLLM 时没有加 --api-key,通常可以用:

text 复制代码
API Key: EMPTY

如果想加 API Key,可以启动时加:

bash 复制代码
--api-key like-qwen7b-key

然后请求时添加:

bash 复制代码
-H "Authorization: Bearer like-qwen7b-key"

LocAgent 中对应:

bash 复制代码
export OPENAI_API_KEY="like-qwen7b-key"

十三、常见问题总结

13.1 conda: command not found

原因:

text 复制代码
当前服务器没有 conda
或者 conda 没有加入当前 shell

解决:

bash 复制代码
source /data2/like/miniconda3/etc/profile.d/conda.sh

如果 Miniconda 不存在,就先安装。

13.2 CondaToSNonInteractiveError

原因:

text 复制代码
conda 默认访问 Anaconda 官方源,需要接受服务条款

解决方式一:接受条款。

bash 复制代码
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r

解决方式二:配置国内镜像源,减少访问官方源。

13.3 Permission denied

原因:

text 复制代码
目录属于 root,当前用户没有写权限

解决:

bash 复制代码
sudo chown -R user:user /data2/like

13.4 The NVIDIA driver on your system is too old

原因:

text 复制代码
最新版 vLLM / PyTorch 需要更高版本 NVIDIA 驱动
当前服务器驱动只适合 CUDA 12.2 左右

解决:

text 复制代码
不用最新版 vLLM
改用 torch 2.5.1+cu121 + vLLM 0.6.6.post1

13.5 torch has no attribute float8_e8m0fnu

原因:

text 复制代码
transformers 太新,和 torch 2.5.1 不兼容

解决:

bash 复制代码
python -m pip install "transformers==4.46.3" "tokenizers==0.20.3" \
  -i https://pypi.tuna.tsinghua.edu.cn/simple

13.6 Address already in use

原因:

text 复制代码
端口已经被占用

解决:

bash 复制代码
ss -ltnp | grep 8001

或者直接换端口:

bash 复制代码
--port 8002

总结

这次服务器部署 Qwen2.5-Coder-7B-CL 的核心流程可以总结为:

text 复制代码
第一,选择正确磁盘:所有大文件放到 /data2/like。
第二,安装 Miniconda:不要占用 /home/user,安装到 /data2/like/miniconda3。
第三,配置镜像源:conda、pip、Hugging Face 分别配置。
第四,创建兼容环境:vllm-cu121,使用 Python 3.10。
第五,安装兼容版本:torch 2.5.1+cu121、vLLM 0.6.6.post1。
第六,修复依赖问题:transformers 降级到 4.46.3。
第七,用 tmux 启动 vLLM,避免 SSH 断开导致服务停止。

最终启动命令是:

bash 复制代码
# ============================================================
# 0. 基础路径约定
# ============================================================

# 模型目录
MODEL_DIR=/data2/like/models/Qwen2.5-Coder-7B-CL

# 工作目录
WORK_DIR=/data2/like

# Miniconda 安装目录
CONDA_DIR=/data2/like/miniconda3

# vLLM 虚拟环境目录
VLLM_ENV=/data2/like/envs/vllm-cu121

# vLLM 服务端口
PORT=8002

# vLLM 对外暴露的模型名
MODEL_NAME=qwen-7B


# ============================================================
# 1. 检查磁盘与 GPU
# ============================================================

df -h
nvidia-smi


# ============================================================
# 2. 创建工作目录
# ============================================================

mkdir -p /data2/like/models
mkdir -p /data2/like/envs
mkdir -p /data2/like/tmp
mkdir -p /data2/like/pip-cache
mkdir -p /data2/like/hf-cache
mkdir -p /data2/like/conda-pkgs
mkdir -p /data2/like/software


# 如果 /data2/like 是自己使用的目录,但权限异常,可以修复权限
sudo chown -R user:user /data2/like

# 检查权限
ls -ld /data2/like
ls -ld /data2/like/models


# ============================================================
# 3. 安装 Hugging Face 命令行工具
# ============================================================

pip install -U huggingface_hub -i https://pypi.tuna.tsinghua.edu.cn/simple

# 如果 hf / huggingface-cli 安装到了 ~/.local/bin,但命令找不到
export PATH="$HOME/.local/bin:$PATH"

# 永久加入 PATH
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc

# 设置 Hugging Face 镜像源
export HF_ENDPOINT=https://hf-mirror.com

# 永久设置 Hugging Face 镜像源
echo 'export HF_ENDPOINT=https://hf-mirror.com' >> ~/.bashrc

# 检查命令
which hf
which huggingface-cli


# ============================================================
# 4. 下载 Qwen2.5-Coder-7B-CL 模型
# ============================================================

hf download czlll/Qwen2.5-Coder-7B-CL \
  --local-dir /data2/like/models/Qwen2.5-Coder-7B-CL

# 检查模型文件
ls -lh /data2/like/models/Qwen2.5-Coder-7B-CL
du -sh /data2/like/models/Qwen2.5-Coder-7B-CL


# ============================================================
# 5. 安装 Miniconda 到 /data2
# ============================================================

cd /data2/like/software

wget -O Miniconda3-latest-Linux-x86_64.sh \
  https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh

# 如果 wget 不可用,可以用 curl
# curl -L -o Miniconda3-latest-Linux-x86_64.sh \
#   https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-Linux-x86_64.sh

bash Miniconda3-latest-Linux-x86_64.sh -b -p /data2/like/miniconda3

# 加载 conda
source /data2/like/miniconda3/etc/profile.d/conda.sh

# 永久加载 conda
echo 'source /data2/like/miniconda3/etc/profile.d/conda.sh' >> ~/.bashrc

# 检查 conda
conda --version


# ============================================================
# 6. 配置 conda 清华镜像源
# ============================================================

cp ~/.condarc ~/.condarc.bak 2>/dev/null || true

cat > ~/.condarc <<'EOF'
channels:
  - defaults

show_channel_urls: true

default_channels:
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
  - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r

custom_channels:
  conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  nvidia: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud

envs_dirs:
  - /data2/like/envs

pkgs_dirs:
  - /data2/like/conda-pkgs
EOF

mkdir -p /data2/like/envs
mkdir -p /data2/like/conda-pkgs

# 清理旧索引缓存
conda clean -i -y

# 检查配置
conda config --show-sources


# ============================================================
# 7. 配置 pip 清华镜像源
# ============================================================

mkdir -p ~/.pip

cat > ~/.pip/pip.conf <<'EOF'
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
timeout = 120

[install]
trusted-host = pypi.tuna.tsinghua.edu.cn
EOF

# 检查 pip 配置
pip config list


# ============================================================
# 8. 创建 vLLM 兼容环境
# ============================================================

source /data2/like/miniconda3/etc/profile.d/conda.sh

conda create -p /data2/like/envs/vllm-cu121 python=3.10 -y

conda activate /data2/like/envs/vllm-cu121

# 检查 Python 路径
which python
python --version


# ============================================================
# 9. 设置缓存目录,避免占用系统盘
# ============================================================

export TMPDIR=/data2/like/tmp
export PIP_CACHE_DIR=/data2/like/pip-cache
export HF_HOME=/data2/like/hf-cache


# ============================================================
# 10. 安装基础工具
# ============================================================

python -m pip install -U pip setuptools wheel


# ============================================================
# 11. 安装 CUDA 12.1 版 PyTorch
# ============================================================

python -m pip install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 \
  --index-url https://download.pytorch.org/whl/cu121

# 检查 PyTorch 和 GPU
python - <<'PY'
import torch

print("torch:", torch.__version__)
print("torch cuda:", torch.version.cuda)
print("cuda available:", torch.cuda.is_available())
print("gpu count:", torch.cuda.device_count())

if torch.cuda.is_available():
    for i in range(torch.cuda.device_count()):
        print(i, torch.cuda.get_device_name(i))
PY


# ============================================================
# 12. 安装 vLLM 兼容版本
# ============================================================

python -m pip install vllm==0.6.6.post1 \
  --extra-index-url https://download.pytorch.org/whl/cu121


# ============================================================
# 13. 修复 transformers 版本不匹配问题
# ============================================================

python -m pip uninstall -y transformers tokenizers

python -m pip install "transformers==4.46.3" "tokenizers==0.20.3" \
  -i https://pypi.tuna.tsinghua.edu.cn/simple

# 检查关键依赖版本
python -c "import torch; print(torch.__version__, torch.version.cuda, torch.cuda.is_available())"
python -c "import transformers; print(transformers.__version__)"
python -c "import tokenizers; print(tokenizers.__version__)"
python -c "import vllm; print(vllm.__version__)"


# ============================================================
# 14. 使用 tmux 创建后台会话
# ============================================================

tmux new -s vllm_qwen7b_128k

# 进入 tmux 后,重新加载 conda 并激活环境
source /data2/like/miniconda3/etc/profile.d/conda.sh
conda activate /data2/like/envs/vllm-cu121


# ============================================================
# 15. 启动 vLLM 部署 Qwen2.5-Coder-7B-CL
# ============================================================

CUDA_VISIBLE_DEVICES=0,1 vllm serve /data2/like/models/Qwen2.5-Coder-7B-CL \
  --tensor-parallel-size 2 \
  --host 0.0.0.0 \
  --port 8002 \
  --served-model-name qwen-7B \
  --dtype auto \
  --gpu-memory-utilization 0.92 \
  --max-model-len 131072 \
  --max-num-seqs 1

# 启动成功标志:
# Application startup complete.
# Uvicorn running on http://0.0.0.0:8002

# 在 tmux 中离开但不停止服务:
# Ctrl + B,然后按 D

# 重新进入 tmux:
# tmux attach -t vllm_qwen7b_128k

# 查看 tmux 会话:
# tmux ls


# ============================================================
# 16. 另开终端测试 vLLM 服务
# ============================================================

curl http://127.0.0.1:8002/v1/models

curl http://127.0.0.1:8002/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qwen-7B",
    "messages": [
      {"role": "user", "content": "你好,请用一句话介绍你自己。"}
    ],
    "temperature": 0.2,
    "max_tokens": 128
  }'


# ============================================================
# 17. 查看 GPU 占用
# ============================================================

nvidia-smi


# ============================================================
# 18. 给 LocAgent 或其他 OpenAI 兼容客户端使用
# ============================================================

export OPENAI_API_BASE="http://127.0.0.1:8002/v1"
export OPENAI_API_KEY="EMPTY"

服务启动成功后,使用:

text 复制代码
API Base: http://127.0.0.1:8002/v1
API Key: EMPTY
Model: qwen-7B

如果给其他地方使用,则配置环境:

bash 复制代码
export OPENAI_API_BASE="http://127.0.0.1:8002/v1"
export OPENAI_API_KEY="EMPTY"

模型参数写:

bash 复制代码
--model openai/qwen-7B

这次部署最大的经验是:部署大模型不只是 GPU 够不够,还要看磁盘路径、权限、conda 环境、PyTorch CUDA 版本、vLLM 版本、transformers 版本、服务保活方式和调用协议兼容性。

相关推荐
Upsy-Daisy1 小时前
Hermes Agent 学习笔记 01:一个会记忆、会学习、能长期运行的 AI Agent
人工智能·笔记·学习
一只努力的微服务1 小时前
vLLM vs SGLang 深度技术对比
vllm·sglang
ZFSS1 小时前
BYOK(自带密钥)使用指南
运维·服务器·前端·人工智能·midjourney
遇事不決洛必達1 小时前
【数据库系列】本地映射云服务器Mysql的方法
服务器·数据库·mysql·定时任务
LuminousCPP1 小时前
从零开始学 C++|系列开篇:从 C 到 C++ 的衔接之路
开发语言·c++·笔记
星恒随风1 小时前
C++ 类和对象入门(一):从 class、访问限定符到 this 指针
开发语言·c++·笔记·学习·状态模式
AIMath~1 小时前
hermes agent安装在Linux centos中
linux·运维·服务器
cjp5601 小时前
001.Web Api_服务器,新建api
运维·服务器
ai_xiaogui2 小时前
PanelAI应用市场跑通!一键部署容器 + 服务器迁移宝塔面板安装全记录
服务器·宝塔面板安装教程2026·服务器重装系统迁移·panelai应用市场·轻量服务器优化swap·ai项目一键部署·panelai部署容器