服务器使用 vLLM 部署 Qwen2.5-Coder-7B-CL 笔记
服务器使用 vLLM 部署 Qwen2.5-Coder-7B-CL 笔记
前言
这篇笔记记录一次在实验室服务器上使用 vLLM 部署本地 Qwen2.5-Coder-7B-CL 模型的完整过程。
这次部署并不是简单执行一条命令就完成,中间遇到了很多真实问题:
- 服务器磁盘很多,不知道模型和环境应该放哪里
- 服务器没有 conda,需要手动安装 Miniconda
- conda 默认源慢,需要配置国内镜像
- vLLM 最新版和服务器 NVIDIA 驱动不兼容
- torch / vLLM / transformers 版本不匹配
- SSH 断开后服务可能停止,需要 tmux 保活
最终我们成功在服务器上用两张 RTX A6000 部署了 Qwen2.5-Coder-7B-CL,并提供 OpenAI 兼容 API 接口。
本文将从服务器环境检查开始,逐步整理模型下载、环境配置、vLLM 安装、模型启动、接口测试和常见问题处理。
一、部署目标与服务器基本情况
1.1 部署目标
本次要部署的模型是:
1 | czlll/Qwen2.5-Coder-7B-CL |
服务器本地模型路径是:
1 | /data2/like/models/Qwen2.5-Coder-7B-CL |
目标是用 vLLM 启动一个 OpenAI 兼容接口:
1 | API Base: http://127.0.0.1:8002/v1 |
后续 就可以像调用 OpenAI API 一样调用这个本地模型。
1.2 服务器硬件配置
服务器主要配置如下:
1 | CPU: Intel Xeon Silver 4210,40 逻辑核心 |
GPU 配置非常适合部署 7B 模型,尤其是两张 RTX A6000,每张 48GB,适合尝试:
1 | 双卡张量并行 |
二、先选对磁盘目录
2.1 为什么不能把模型放到 /home/user
使用服务器前,首先要看磁盘空间:
1 | df -h |
命令含义:
1 | df = disk free,查看磁盘空间 |
服务器磁盘大致情况如下:
1 | / 388G,已用 357G,只剩 11G,98% |
结论很明确:
1 | / 和 /home/user 不适合放大模型 |
所以所有大文件都放到:
1 | /data2/like |
2.2 推荐目录结构
创建自己的工作目录:
1 | mkdir -p /data2/like/models |
各目录作用:
1 | /data2/like/models 放模型文件 |
2.3 处理目录权限
如果创建目录时出现:
1 | mkdir: cannot create directory ‘models’: Permission denied |
说明当前用户没有写权限。
有时用:
1 | sudo mkdir models |
可以创建成功,但会导致目录属于 root,后面普通用户下载模型时又会遇到:
1 | PermissionError: [Errno 13] Permission denied |
正确做法是把自己的工作目录改成当前用户拥有:
1 | sudo chown -R user:user /data2/like |
命令含义:
1 | sudo = 用管理员权限执行 |
检查权限:
1 | ls -ld /data2/like |
如果看到:
1 | drwxr-xr-x 4 user user ... /data2/like |
说明权限已经正常。
三、准备 Hugging Face 模型文件
3.1 安装 Hugging Face 命令行工具
如果服务器没有:
1 | hf |
可以安装:
1 | pip install -U huggingface_hub -i https://pypi.tuna.tsinghua.edu.cn/simple |
如果安装后提示:
1 | hf, huggingface-cli are installed in '/home/user/.local/bin' which is not on PATH |
说明命令已经安装,但终端找不到。
临时加入 PATH:
1 | export PATH="$HOME/.local/bin:$PATH" |
永久加入:
1 | echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc |
检查:
1 | which hf |
3.2 配置 Hugging Face 镜像
如果服务器访问 Hugging Face 慢,可以设置镜像:
1 | export HF_ENDPOINT=https://hf-mirror.com |
永久生效:
1 | echo 'export HF_ENDPOINT=https://hf-mirror.com' >> ~/.bashrc |
注意:
HF_ENDPOINT 只影响 Hugging Face 模型下载,它不影响 conda,也不影响 pip
3.3 下载模型
推荐用新版命令:
1 | hf download czlll/Qwen2.5-Coder-7B-CL \ |
下载完成后检查:
1 | ls -lh /data2/like/models/Qwen2.5-Coder-7B-CL |
正常应该能看到:
1 | config.json |
四、为什么不能直接安装最新版 vLLM
4.1 第一次失败的原因
最开始直接安装最新版 vLLM 后,启动模型时报错:
1 | RuntimeError: The NVIDIA driver on your system is too old |
服务器驱动信息是:
1 | NVIDIA Driver 535.261.03 |
而最新版 vLLM / PyTorch 可能依赖更新的 CUDA 运行时,例如 CUDA 12.8 或 12.9。这样就会出现:
1 | 服务器驱动较旧 |
可以理解成:
1 | 服务器驱动 = 老插座 |
所以我们不能继续用最新版 vLLM,而要安装适配 CUDA 12.1 的旧版本组合。
4.2 最终选择的版本组合
最终采用:
1 | Python 3.10 |
这里的 cu121 表示 CUDA 12.1,对当前服务器 CUDA 12.2 驱动更友好。
五、安装 Miniconda 到 /data2
5.1 为什么要自己安装 Miniconda
服务器当前没有可用的 conda:
1 | conda: command not found |
所以需要自己安装 Miniconda。
不要装到 /home/user,因为系统盘快满了。统一装到:
1 | /data2/like/miniconda3 |
5.2 下载 Miniconda
1 | mkdir -p /data2/like/software |
命令含义:
1 | wget = 从网络下载文件 |
如果 wget 不可用,也可以用:
1 | curl -L -o Miniconda3-latest-Linux-x86_64.sh \ |
5.3 安装 Miniconda
1 | bash Miniconda3-latest-Linux-x86_64.sh -b -p /data2/like/miniconda3 |
命令含义:
1 | bash = 执行 shell 脚本 |
加载 conda:
1 | source /data2/like/miniconda3/etc/profile.d/conda.sh |
检查:
1 | conda --version |
永久生效:
1 | echo 'source /data2/like/miniconda3/etc/profile.d/conda.sh' >> ~/.bashrc |
六、配置 conda 和 pip 镜像源
6.1 conda 配置文件在哪里
虽然 Miniconda 装在:
1 | /data2/like/miniconda3 |
但 conda 的用户配置文件默认在:
1 | ~/.condarc |
也就是:
1 | /home/user/.condarc |
这很正常。
可以理解为:
1 | /data2/like/miniconda3 = conda 程序本体 |
6.2 配置 conda 清华镜像
备份旧配置:
1 | cp ~/.condarc ~/.condarc.bak 2>/dev/null || true |
写入新配置:
1 | cat > ~/.condarc <<'EOF' |
这个配置做了三件事:
1 | 1. conda create / conda install 走清华镜像 |
创建缓存目录:
1 | mkdir -p /data2/like/envs |
清理旧索引:
1 | conda clean -i -y |
检查配置:
1 | conda config --show-sources |
如果看到 mirrors.tuna.tsinghua.edu.cn,说明镜像配置成功。
6.3 配置 pip 镜像
1 | mkdir -p ~/.pip |
检查:
1 | pip config list |
注意:
1 | conda 镜像用于 conda create / conda install |
它们是三套不同的配置。
七、创建 vLLM 兼容环境
7.1 创建环境
1 | conda create -p /data2/like/envs/vllm-cu121 python=3.10 -y |
命令含义:
1 | conda create = 创建 conda 环境 |
激活环境:
1 | conda activate /data2/like/envs/vllm-cu121 |
检查:
1 | which python |
正常输出类似:
1 | /data2/like/envs/vllm-cu121/bin/python |
7.2 设置缓存目录
1 | export TMPDIR=/data2/like/tmp |
这些目录可以防止 pip、临时文件、Hugging Face 缓存占用系统盘。
八、安装 torch、vLLM 和 transformers
8.1 安装基础工具
1 | python -m pip install -U pip setuptools wheel |
命令含义:
1 | python -m pip = 使用当前环境的 pip |
8.2 安装 CUDA 12.1 版 PyTorch
1 | python -m pip install torch==2.5.1 torchvision==0.20.1 torchaudio==2.5.1 \ |
这里:
1 | cu121 = CUDA 12.1 |
如果官方源下载慢,可以尝试 PyTorch 国内镜像。但核心原则不变:要安装 cu121 版本。
安装完成后检查:
1 | python -c "import torch; print(torch.__version__, torch.version.cuda, torch.cuda.is_available())" |
期望输出:
1 | 2.5.1+cu121 12.1 True |
8.3 安装 vLLM 旧版
1 | python -m pip install vllm==0.6.6.post1 \ |
不要执行:
1 | python -m pip install -U vllm |
因为 -U 可能会把 vLLM 或相关依赖升级到不兼容的新版本。
8.4 处理 transformers 版本不匹配
安装后出现过:
1 | AttributeError: module 'torch' has no attribute 'float8_e8m0fnu' |
原因是:
1 | torch = 2.5.1 |
新版 transformers 调用了 torch 2.5.1 没有的属性,所以需要降级 transformers。
执行:
1 | python -m pip uninstall -y transformers tokenizers |
安装兼容版本:
1 | python -m pip install "transformers==4.46.3" "tokenizers==0.20.3" \ |
然后检查:
1 | python -c "import torch; print(torch.__version__, torch.version.cuda, torch.cuda.is_available())" |
期望结果:
1 | torch: 2.5.1+cu121,cuda available True |
九、使用 tmux 保持 vLLM 后台运行
9.1 为什么要用 tmux
如果直接在 SSH 终端里运行:
1 | vllm serve ... |
一旦本地 SSH 工具关闭、网络断开、电脑关机,vLLM 服务可能会一起停止。
tmux 可以理解为服务器里的“后台终端房间”。
1 | 普通 SSH: |
9.2 创建 tmux 会话
1 | tmux new -s vllm_qwen7b_128k |
命令含义:
1 | tmux = 终端复用工具 |
进入 tmux 后重新激活环境:
1 | source /data2/like/miniconda3/etc/profile.d/conda.sh |
9.3 离开 tmux 但不停止服务
vLLM 启动成功后,如果想离开:
1 | Ctrl + B |
这叫 detach。
重新进入:
1 | tmux attach -t vllm_qwen7b_128k |
查看会话:
1 | tmux ls |
停止服务:
1 | 进入 tmux 后按 Ctrl + C |
十、启动 Qwen2.5-Coder-7B-CL
10.1 vLLM 启动命令
最终使用的启动命令是:
1 | CUDA_VISIBLE_DEVICES=0,1 vllm serve /data2/like/models/Qwen2.5-Coder-7B-CL \ |
10.2 参数解释
1 | CUDA_VISIBLE_DEVICES=0,1 |
使用第 0、1 两张 GPU。
1 | vllm serve /data2/like/models/Qwen2.5-Coder-7B-CL |
用 vLLM 启动本地模型目录。
1 | --tensor-parallel-size 2 |
使用双卡张量并行,把模型切到两张 GPU 上运行。
1 | --host 0.0.0.0 |
监听所有网卡。这样服务器内部和其他机器都有机会访问。
1 | --port 8002 |
服务端口是 8002。
之前 8001 被占用,所以换成 8002。
1 | --served-model-name qwen-7B |
对外暴露的模型名叫 qwen-7B。
后面请求 API 时,model 字段就写:
1 | "model": "qwen-7B" |
让 vLLM 自动选择模型精度。
1 | --gpu-memory-utilization 0.92 |
允许 vLLM 使用每张 GPU 大约 92% 的显存。
1 | --max-model-len 131072 |
最大上下文长度是 131072 token,也就是 128K。
1 | --max-num-seqs 1 |
低并发,同一时间最多处理 1 个请求序列。因为 128K 上下文非常吃 KV Cache,所以先低并发最稳。
10.3 启动成功标志
如果日志出现:
1 | Application startup complete. |
说明 vLLM 已经成功启动。
这时不要按 Ctrl + C,否则服务会停止。
十一、测试 vLLM 服务
11.1 测试模型列表
另开一个终端,执行:
1 | curl http://127.0.0.1:8002/v1/models |
如果返回中有:
1 | "id": "qwen-7B" |
说明服务正常。
11.2 测试对话接口
1 | curl http://127.0.0.1:8002/v1/chat/completions \ |
如果返回模型回复,说明部署成功。
11.3 查看 GPU 占用
1 | nvidia-smi |
如果两张 GPU 都有明显显存占用,说明模型已经加载到 GPU 上。
十二、API 地址和 API Key 怎么填
12.1 服务器本机调用
如果 LocAgent 和 vLLM 在同一台服务器上:
1 | export OPENAI_API_BASE="http://127.0.0.1:8002/v1" |
模型名:
1 | --model openai/qwen-7B |
这里的 qwen-7B 必须和启动 vLLM 时的:
1 | --served-model-name qwen-7B |
一致。
12.2 其他机器访问
如果要从本地电脑访问服务器,可以用服务器 IP
前提是:
1 | 你的电脑能访问这台服务器 |
12.3 是否需要 API Key
如果启动 vLLM 时没有加 --api-key,通常可以用:
1 | API Key: EMPTY |
如果想加 API Key,可以启动时加:
1 | --api-key like-qwen7b-key |
然后请求时添加:
1 | -H "Authorization: Bearer like-qwen7b-key" |
LocAgent 中对应:
1 | export OPENAI_API_KEY="like-qwen7b-key" |
十三、常见问题总结
13.1 conda: command not found
原因:
1 | 当前服务器没有 conda |
解决:
1 | source /data2/like/miniconda3/etc/profile.d/conda.sh |
如果 Miniconda 不存在,就先安装。
13.2 CondaToSNonInteractiveError
原因:
1 | conda 默认访问 Anaconda 官方源,需要接受服务条款 |
解决方式一:接受条款。
1 | conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main |
解决方式二:配置国内镜像源,减少访问官方源。
13.3 Permission denied
原因:
1 | 目录属于 root,当前用户没有写权限 |
解决:
1 | sudo chown -R user:user /data2/like |
13.4 The NVIDIA driver on your system is too old
原因:
1 | 最新版 vLLM / PyTorch 需要更高版本 NVIDIA 驱动 |
解决:
1 | 不用最新版 vLLM |
13.5 torch has no attribute float8_e8m0fnu
原因:
1 | transformers 太新,和 torch 2.5.1 不兼容 |
解决:
1 | python -m pip install "transformers==4.46.3" "tokenizers==0.20.3" \ |
13.6 Address already in use
原因:
1 | 端口已经被占用 |
解决:
1 | ss -ltnp | grep 8001 |
或者直接换端口:
1 | --port 8002 |
总结
这次服务器部署 Qwen2.5-Coder-7B-CL 的核心流程可以总结为:
1 | 第一,选择正确磁盘:所有大文件放到 /data2/like。 |
最终启动命令是:
1 | # ============================================================ |
服务启动成功后,使用:
1 | API Base: http://127.0.0.1:8002/v1 |
如果给其他地方使用,则配置环境:
1 | export OPENAI_API_BASE="http://127.0.0.1:8002/v1" |
模型参数写:
1 | --model openai/qwen-7B |
这次部署最大的经验是:部署大模型不只是 GPU 够不够,还要看磁盘路径、权限、conda 环境、PyTorch CUDA 版本、vLLM 版本、transformers 版本、服务保活方式和调用协议兼容性。