服务器使用 tmux 保持 vLLM 后台运行笔记
服务器使用 tmux 保持 vLLM 后台运行笔记
前言
在服务器上部署大模型时,经常会遇到一个很实际的问题:
- 我用
Termius / SSH连接服务器 - 然后在终端里启动
vLLM - 模型服务正常运行
- 但是本地电脑休眠、网络断开、
Termius关闭后 vLLM服务可能也停止了
比如直接在普通 SSH 终端里运行:
1 | CUDA_VISIBLE_DEVICES=0,1 vllm serve /data2/like/models/Qwen2.5-Coder-7B-CL \ |
这种方式看起来可以运行,但它和当前 SSH 会话绑定得很紧。
一旦 Termius 断开、网络波动、本地电脑休眠,普通 SSH 前台进程可能收到 SIGHUP 信号,然后 vLLM 服务就可能被关闭。
可以把普通 SSH 理解成一个“临时窗口”:
- 窗口开着,程序就在前台运行
- 窗口关了,前台程序可能跟着消失
而 tmux 可以理解成服务器上的“后台终端房间”:
- 你进入房间启动
vLLM - 然后可以离开房间
- 但是房间还在
vLLM继续在服务器上运行
所以,长时间在服务器运行 vLLM 模型服务或者其他程序时时,推荐使用 tmux。
一、为什么 vLLM 需要放到 tmux 里
1.1 普通 SSH 运行 vLLM 的问题
普通 SSH 连接的流程可以理解为:
本地电脑 Termius –> SSH 会话 —> 服务器终端 —> 前台运行 vLLM。
如果你直接在这个终端里运行 vLLM,那么 vLLM 就是这个 SSH 会话里的前台任务。
当 SSH 断开时,可能出现:
vLLM服务停止GPU显存释放- 8002 端口不再监听
- 本地或其他程序无法继续调用模型
重新登录服务器时,如果看到:
1 | Welcome to Ubuntu... |
这只能说明你进入了一个新的 SSH 会话。
它不能证明之前的 vLLM 还在运行。
要确认 vLLM 是否还在,需要检查:
1 | nvidia-smi |
或者测试接口:
1 | curl http://127.0.0.1:8002/v1/models |
如果 GPU 没有 vLLM 进程,接口也访问不了,就说明服务已经停止。
1.2 tmux 如何解决这个问题
tmux 的核心作用是:在服务器内部创建一个独立的终端会话。
普通 SSH 和 tmux 的区别是:
普通 SSH:Termius 断开 —> SSH 会话结束 —> 前台任务可能停止
tmux:Termius断开 —> 只是你离开 tmux 会话 —-> tmux 会话仍然在服务器上 —> vLLM 继续运行
因此,只要服务器本身没有重启、vLLM 没有报错退出、你没有手动杀掉进程,tmux 里的vLLM 通常会继续运行。
二、tmux 常用命令讲解
2.1 创建 vLLM 会话
创建一个专门用于 vLLM 的 tmux 会话:
1 | tmux new -s vllm_qwen7b_128k |
这条命令可以拆开理解:
1 | tmux :表示使用 tmux 工具 |
这里的会话名可以自己取,但建议有含义。
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 | attach : 表示进入一个已经存在的 tmux 会话 |
所以:
1 | tmux attach -t vllm_qwen7b_128k |
意思就是:进入已经存在的 vllm_qwen7b_128k 会话
可以用下面命令查看当前有哪些 tmux 会话:
1 | tmux ls |
2.3 离开会话但不停止 vLLM
进入 tmux 后,如果 vLLM 已经启动成功,不要直接关闭窗口,也不要按 Ctrl + C。
如果想离开 tmux,但让 vLLM 继续运行,需要按:
1 | Ctrl + B |
这个操作叫 detach。
可以理解成:
1 | Ctrl + B:告诉 tmux,我接下来要输入 tmux 指令 |
离开后,你可以关闭 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 | source : 表示在当前 shell 中执行这个脚本 |
如果不执行这一步,可能会出现:
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 | CUDA_VISIBLE_DEVICES=0,1 vllm serve /data2/like/models/Qwen2.5-Coder-7B-CL \ |
这条命令比较长,可以分开理解。
四、如何确认 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 | VLLM::EngineCore |
如果显存几乎为空,就说明模型大概率已经停止。
4.3 测试 API 接口
可以测试:
1 | curl http://127.0.0.1:8002/v1/models |
如果返回中包含:
1 | qwen-7B |
说明 vLLM 服务正常。
也可以测试对话接口:
1 | curl http://127.0.0.1:8002/v1/chat/completions \ |
如果能返回模型回复,说明服务可以正常使用。
总结
tmux 的核心作用是让 vLLM 这种长时间运行的服务不依赖普通 SSH 前台终端。
普通 SSH 像一个临时窗口,窗口关闭后,里面的前台任务可能停止。tmux 像服务器内部的后台房间,你可以进去启动 vLLM,也可以离开房间,让 vLLM 继续运行。
使用时记住三条命令即可:
1 | tmux new -s vllm_qwen7b_128k |
再记住一个快捷键:
1 | Ctrl + B |
它表示离开 tmux 会话,但不停止里面的 vLLM 服务。
如果以后重新登录服务器,发现:
1 | duplicate session: vllm_qwen7b_128k |
说明这个会话已经存在,不要重新创建,直接进入即可:
1 | tmux attach -t vllm_qwen7b_128k |
这样就能比较稳定地保持 Qwen7B 的 vLLM服务在服务器后台持续运行。