服务器使用 tmux 保持 vLLM 后台运行笔记

前言

在服务器上部署大模型时,经常会遇到一个很实际的问题:

  1. 我用 Termius / SSH 连接服务器
  2. 然后在终端里启动vLLM
  3. 模型服务正常运行
  4. 但是本地电脑休眠、网络断开、Termius 关闭后
  5. vLLM 服务可能也停止了

比如直接在普通 SSH 终端里运行:

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

这种方式看起来可以运行,但它和当前 SSH 会话绑定得很紧。

一旦 Termius 断开、网络波动、本地电脑休眠,普通 SSH 前台进程可能收到 SIGHUP 信号,然后 vLLM 服务就可能被关闭。

可以把普通 SSH 理解成一个“临时窗口”:

  1. 窗口开着,程序就在前台运行
  2. 窗口关了,前台程序可能跟着消失

tmux 可以理解成服务器上的“后台终端房间”:

  1. 你进入房间启动 vLLM
  2. 然后可以离开房间
  3. 但是房间还在
  4. vLLM 继续在服务器上运行

所以,长时间在服务器运行 vLLM 模型服务或者其他程序时时,推荐使用 tmux


一、为什么 vLLM 需要放到 tmux

1.1 普通 SSH 运行 vLLM 的问题

普通 SSH 连接的流程可以理解为:

本地电脑 Termius –> SSH 会话 —> 服务器终端 —> 前台运行 vLLM

如果你直接在这个终端里运行 vLLM,那么 vLLM 就是这个 SSH 会话里的前台任务。

当 SSH 断开时,可能出现:

  1. vLLM 服务停止
  2. GPU 显存释放
  3. 8002 端口不再监听
  4. 本地或其他程序无法继续调用模型

重新登录服务器时,如果看到:

1
2
Welcome to Ubuntu...
Last login: ...

这只能说明你进入了一个新的 SSH 会话。
它不能证明之前的 vLLM 还在运行。

要确认 vLLM 是否还在,需要检查:

1
nvidia-smi

或者测试接口:

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

如果 GPU 没有 vLLM 进程,接口也访问不了,就说明服务已经停止。

1.2 tmux 如何解决这个问题

tmux 的核心作用是:在服务器内部创建一个独立的终端会话。

普通 SSHtmux 的区别是:

普通 SSHTermius 断开 —> SSH 会话结束 —> 前台任务可能停止

tmuxTermius断开 —> 只是你离开 tmux 会话 —-> tmux 会话仍然在服务器上 —> vLLM 继续运行

因此,只要服务器本身没有重启、vLLM 没有报错退出、你没有手动杀掉进程,tmux 里的vLLM 通常会继续运行。


二、tmux 常用命令讲解

2.1 创建 vLLM 会话

创建一个专门用于 vLLMtmux 会话:

1
tmux new -s vllm_qwen7b_128k

这条命令可以拆开理解:

1
2
3
4
tmux  :表示使用 tmux 工具
new : 表示新建一个会话
-s : 表示指定 session name,也就是会话名
vllm_qwen7b_128k : 这是会话名字,表示这个会话用来运行 Qwen7B 的 128K vLLM 服务

这里的会话名可以自己取,但建议有含义。

2.2 进入已有会话

如果会话已经存在,再执行:

1
tmux new -s vllm_qwen7b_128k

可能会报:

1
duplicate session: vllm_qwen7b_128k

意思是:

1
这个 tmux 会话已经存在,不能重复创建

这不是坏事,反而说明之前的 tmux 会话可能还在。

这时应该使用:

1
tmux attach -t vllm_qwen7b_128k

参数含义:

1
2
3
attach : 表示进入一个已经存在的 tmux 会话
-t : 表示 target,指定目标会话
vllm_qwen7b_128k : 目标会话名

所以:

1
tmux attach -t vllm_qwen7b_128k

意思就是:进入已经存在的 vllm_qwen7b_128k 会话

可以用下面命令查看当前有哪些 tmux 会话:

1
tmux ls

2.3 离开会话但不停止 vLLM

进入 tmux 后,如果 vLLM 已经启动成功,不要直接关闭窗口,也不要按 Ctrl + C

如果想离开 tmux,但让 vLLM 继续运行,需要按:

1
2
Ctrl + B
然后按 D

这个操作叫 detach

可以理解成:

1
2
Ctrl + B:告诉 tmux,我接下来要输入 tmux 指令
D:detach,离开当前会话

离开后,你可以关闭 Termius
vLLM 仍然在服务器的 tmux 会话里继续运行。

如果之后想重新查看 vLLM 日志:

1
tmux attach -t vllm_qwen7b_128k

三、在 tmux 中启动 vLLM

3.1 进入 tmux 会话

第一次启动 vLLM 时,先新建会话:

1
tmux new -s vllm_qwen7b_128k

如果已经存在这个会话,则进入它:

1
tmux attach -t vllm_qwen7b_128k

实际使用时可以先查看:

1
tmux ls

如果没有 vllm_qwen7b_128k,就用 new
如果已经有,就用 attach

3.2 加载 conda

进入 tmux 后,需要先加载 conda:

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

这条命令的作用是:让当前终端认识 conda 命令。

其中:

1
2
3
source : 表示在当前 shell 中执行这个脚本

/data2/like/miniconda3/etc/profile.d/conda.sh : 这是 conda 的初始化脚本

如果不执行这一步,可能会出现:

1
conda: command not found

3.3 激活 vLLM 环境

加载 conda 后,激活 vLLM 环境:

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

这条命令表示:

1
进入 /data2/like/envs/vllm-cu121 这个 conda 环境

这个环境中安装了 vLLM 需要的依赖。

激活成功后,命令行前面一般会出现类似:

1
(vllm-cu121)

这说明当前终端已经切换到了 vLLM 环境。

3.4 启动 Qwen7B 模型服务

然后启动 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

这条命令比较长,可以分开理解。


四、如何确认 vLLM 还在运行

4.1 查看 tmux 会话

重新登录服务器后,先查看 tmux:

1
tmux ls

如果看到:

1
vllm_qwen7b_128k: 1 windows

说明这个会话还存在。

可以进入查看:

1
tmux attach -t vllm_qwen7b_128k

4.2 查看 GPU 占用

可以执行:

1
nvidia-smi

如果 vLLM 还在运行,通常能看到 GPU 显存有明显占用,并且进程中可能出现:

1
2
VLLM::EngineCore
python

如果显存几乎为空,就说明模型大概率已经停止。

4.3 测试 API 接口

可以测试:

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

如果返回中包含:

1
qwen-7B

说明 vLLM 服务正常。

也可以测试对话接口:

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
}'

如果能返回模型回复,说明服务可以正常使用。


总结

tmux 的核心作用是让 vLLM 这种长时间运行的服务不依赖普通 SSH 前台终端。

普通 SSH 像一个临时窗口,窗口关闭后,里面的前台任务可能停止。
tmux 像服务器内部的后台房间,你可以进去启动 vLLM,也可以离开房间,让 vLLM 继续运行。

使用时记住三条命令即可:

1
2
3
tmux new -s vllm_qwen7b_128k
tmux attach -t vllm_qwen7b_128k
tmux ls

再记住一个快捷键:

1
2
Ctrl + B
然后按 D

它表示离开 tmux 会话,但不停止里面的 vLLM 服务。

如果以后重新登录服务器,发现:

1
duplicate session: vllm_qwen7b_128k

说明这个会话已经存在,不要重新创建,直接进入即可:

1
tmux attach -t vllm_qwen7b_128k

这样就能比较稳定地保持 Qwen7BvLLM服务在服务器后台持续运行。