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

前言

这篇笔记记录一次在实验室服务器上使用 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 部署目标

本次要部署的模型是:

1
czlll/Qwen2.5-Coder-7B-CL

服务器本地模型路径是:

1
/data2/like/models/Qwen2.5-Coder-7B-CL

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

1
2
3
API Base: http://127.0.0.1:8002/v1
Model: qwen-7B
API Key: EMPTY

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

1.2 服务器硬件配置

服务器主要配置如下:

1
2
3
4
5
6
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,适合尝试:

1
2
3
双卡张量并行
128K 上下文
低并发推理

二、先选对磁盘目录

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

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

1
df -h

命令含义:

1
2
df = disk free,查看磁盘空间
-h = human-readable,用 GB、TB 等易读单位显示

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

1
2
3
/          388G,已用 357G,只剩 11G,98%
/ssd_data 1.8T,已用 1.7T,只剩 15G,100%
/data2 3.6T,已用 2.5T,还剩 942G,73%

结论很明确:

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

所以所有大文件都放到:

1
/data2/like

2.2 推荐目录结构

创建自己的工作目录:

1
2
3
4
5
6
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

各目录作用:

1
2
3
4
5
6
/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 处理目录权限

如果创建目录时出现:

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
2
3
4
5
sudo = 用管理员权限执行
chown = change owner,修改所有者
-R = recursive,递归修改所有子目录和文件
user:user = 用户名:用户组
/data2/like = 要修改的目录

检查权限:

1
2
ls -ld /data2/like
ls -ld /data2/like/models

如果看到:

1
2
drwxr-xr-x 4 user user ... /data2/like
drwxr-xr-x 2 user user ... /data2/like/models

说明权限已经正常。

三、准备 Hugging Face 模型文件

3.1 安装 Hugging Face 命令行工具

如果服务器没有:

1
2
hf
huggingface-cli

可以安装:

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
2
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

检查:

1
2
which hf
which huggingface-cli

3.2 配置 Hugging Face 镜像

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

1
export HF_ENDPOINT=https://hf-mirror.com

永久生效:

1
2
echo 'export HF_ENDPOINT=https://hf-mirror.com' >> ~/.bashrc
source ~/.bashrc

注意:

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

3.3 下载模型

推荐用新版命令:

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

下载完成后检查:

1
2
ls -lh /data2/like/models/Qwen2.5-Coder-7B-CL
du -sh /data2/like/models/Qwen2.5-Coder-7B-CL

正常应该能看到:

1
2
3
4
5
6
config.json
generation_config.json
tokenizer.json
tokenizer_config.json
model.safetensors.index.json
*.safetensors

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

4.1 第一次失败的原因

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

1
RuntimeError: The NVIDIA driver on your system is too old

服务器驱动信息是:

1
2
NVIDIA Driver 535.261.03
CUDA Version 12.2

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

1
2
3
服务器驱动较旧
新版 PyTorch / vLLM 要求更高
GPU 初始化失败

可以理解成:

1
2
3
服务器驱动 = 老插座
最新版 vLLM = 新电器
规格对不上,插上就报错

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

4.2 最终选择的版本组合

最终采用:

1
2
3
4
5
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:

1
conda: command not found

所以需要自己安装 Miniconda。

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

1
/data2/like/miniconda3

5.2 下载 Miniconda

1
2
3
4
5
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

命令含义:

1
2
wget = 从网络下载文件
-O = output,指定保存文件名

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

1
2
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

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

命令含义:

1
2
3
bash = 执行 shell 脚本
-b = batch,静默安装
-p = prefix,指定安装路径

加载 conda:

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

检查:

1
conda --version

永久生效:

1
2
echo 'source /data2/like/miniconda3/etc/profile.d/conda.sh' >> ~/.bashrc
source ~/.bashrc

六、配置 conda 和 pip 镜像源

6.1 conda 配置文件在哪里

虽然 Miniconda 装在:

1
/data2/like/miniconda3

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

1
~/.condarc

也就是:

1
/home/user/.condarc

这很正常。

可以理解为:

1
2
/data2/like/miniconda3 = conda 程序本体
~/.condarc = 当前用户的 conda 配置文件

6.2 配置 conda 清华镜像

备份旧配置:

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

写入新配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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

这个配置做了三件事:

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

创建缓存目录:

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

清理旧索引:

1
conda clean -i -y

检查配置:

1
conda config --show-sources

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

6.3 配置 pip 镜像

1
2
3
4
5
6
7
8
9
10
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

检查:

1
pip config list

注意:

1
2
3
conda 镜像用于 conda create / conda install
pip 镜像用于 pip install
HF_ENDPOINT 用于 Hugging Face 模型下载

它们是三套不同的配置。

七、创建 vLLM 兼容环境

7.1 创建环境

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

命令含义:

1
2
3
4
conda create = 创建 conda 环境
-p = prefix,指定环境路径
python=3.10 = 使用 Python 3.10
-y = 自动确认

激活环境:

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

检查:

1
2
which python
python --version

正常输出类似:

1
2
/data2/like/envs/vllm-cu121/bin/python
Python 3.10.x

7.2 设置缓存目录

1
2
3
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 安装基础工具

1
python -m pip install -U pip setuptools wheel

命令含义:

1
2
3
4
python -m pip = 使用当前环境的 pip
install = 安装
-U = upgrade,升级
pip setuptools wheel = Python 包安装基础工具

8.2 安装 CUDA 12.1 版 PyTorch

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

这里:

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
2
python -m pip install vllm==0.6.6.post1 \
--extra-index-url https://download.pytorch.org/whl/cu121

不要执行:

1
python -m pip install -U vllm

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

8.4 处理 transformers 版本不匹配

安装后出现过:

1
AttributeError: module 'torch' has no attribute 'float8_e8m0fnu'

原因是:

1
2
torch = 2.5.1
transformers = 太新

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

执行:

1
python -m pip uninstall -y transformers tokenizers

安装兼容版本:

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

然后检查:

1
2
3
4
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__)"

期望结果:

1
2
3
4
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 终端里运行:

1
vllm serve ...

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

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

1
2
3
4
5
6
7
普通 SSH:
你关闭连接,终端可能没了,程序可能停了

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

9.2 创建 tmux 会话

1
tmux new -s vllm_qwen7b_128k

命令含义:

1
2
3
4
tmux = 终端复用工具
new = 新建会话
-s = session name,指定会话名字
vllm_qwen7b_128k = 会话名

进入 tmux 后重新激活环境:

1
2
source /data2/like/miniconda3/etc/profile.d/conda.sh
conda activate /data2/like/envs/vllm-cu121

9.3 离开 tmux 但不停止服务

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

1
2
Ctrl + B
然后按 D

这叫 detach

重新进入:

1
tmux attach -t vllm_qwen7b_128k

查看会话:

1
tmux ls

停止服务:

1
进入 tmux 后按 Ctrl + C

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

10.1 vLLM 启动命令

最终使用的启动命令是:

1
2
3
4
5
6
7
8
9
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 参数解释

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
2
"model": "qwen-7B"
--dtype auto

让 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
2
Application startup complete.
Uvicorn running on http://0.0.0.0:8002

说明 vLLM 已经成功启动。

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

十一、测试 vLLM 服务

11.1 测试模型列表

另开一个终端,执行:

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

如果返回中有:

1
"id": "qwen-7B"

说明服务正常。

11.2 测试对话接口

1
2
3
4
5
6
7
8
9
10
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 占用

1
nvidia-smi

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

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

12.1 服务器本机调用

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

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

模型名:

1
--model openai/qwen-7B

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

1
--served-model-name qwen-7B

一致。

12.2 其他机器访问

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

前提是:

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

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
2
当前服务器没有 conda
或者 conda 没有加入当前 shell

解决:

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

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

13.2 CondaToSNonInteractiveError

原因:

1
conda 默认访问 Anaconda 官方源,需要接受服务条款

解决方式一:接受条款。

1
2
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

原因:

1
目录属于 root,当前用户没有写权限

解决:

1
sudo chown -R user:user /data2/like

13.4 The NVIDIA driver on your system is too old

原因:

1
2
最新版 vLLM / PyTorch 需要更高版本 NVIDIA 驱动
当前服务器驱动只适合 CUDA 12.2 左右

解决:

1
2
不用最新版 vLLM
改用 torch 2.5.1+cu121 + vLLM 0.6.6.post1

13.5 torch has no attribute float8_e8m0fnu

原因:

1
transformers 太新,和 torch 2.5.1 不兼容

解决:

1
2
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

原因:

1
端口已经被占用

解决:

1
ss -ltnp | grep 8001

或者直接换端口:

1
--port 8002

总结

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

1
2
3
4
5
6
7
第一,选择正确磁盘:所有大文件放到 /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 断开导致服务停止。

最终启动命令是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
# ============================================================
# 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"


服务启动成功后,使用:

1
2
3
API Base: http://127.0.0.1:8002/v1
API Key: EMPTY
Model: qwen-7B

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

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

模型参数写:

1
--model openai/qwen-7B

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