跳转至

tmux 和运行实验

本节介绍如何用 tmux 在服务器上运行长时间实验。

tmux 的作用不是让程序变快,而是让服务器上的终端会话不依赖你的 SSH 窗口。即使网络断开、笔记本睡眠、VS Code Remote SSH 断开,tmux 里的程序仍然可以继续运行。之后你重新登录服务器,就可以回到同一个会话。

1. 为什么需要 tmux

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

python train.py

一旦 SSH 断开或终端窗口关闭,程序可能会跟着结束。对于训练模型、长时间预处理、下载数据、解压文件等任务,如果中断就会浪费几个小时甚至几天。

使用 tmux 后,程序运行在服务器端的 tmux 会话里。你可以先离开,之后再回来查看。

2. 运行前先检查

进入服务器后,不要立刻启动训练。先确认自己在哪台机器、哪个目录:

whoami
hostname
pwd

查看 GPU:

nvidia-smi

查看当前登录用户:

who

查看当前目录占用:

du -sh .

这几个检查是标准流程,可以避免很多常见的事故:连错服务器、抢占别人 GPU、把输出写进错误目录或已经很满的目录。

3. 最小 tmux 命令

先检查服务器是否安装了 tmux

tmux -V

相信网络管理员,他肯定会提前安装好的 :)

创建一个名为 exp1 的会话:

tmux new -s exp1

进入 tmux 后,底部通常会出现状态栏。此时就可以运行实验:

python train.py

暂时离开 tmux,但让程序继续运行:

Ctrl + B,然后按 D

注意:不是同时按三个键。先按 Ctrl + B,松开后再按 D

查看已有 tmux 会话:

tmux ls

重新进入会话:

tmux attach -t exp1

实验结束后,在 tmux 里输入:

exit

即可关闭不再需要的会话。

4. 推荐的实验启动方式

不建议只运行:

python train.py

这样虽然能跑,但之后不方便回看日志。更推荐每次实验都保存输出。

先创建日志目录:

mkdir -p logs

先激活 Miniforge / conda 环境:

source ~/opt/miniforge3/etc/profile.d/conda.sh
conda activate your-env-name

运行实验并保存日志:

python train.py 2>&1 | tee logs/exp1.log

如果同一个实验会跑多次,可以把时间写进日志名:

python train.py 2>&1 | tee "logs/exp1_$(date +%Y%m%d_%H%M%S).log"

tee 的作用是:终端里能看到输出,同时也把输出写进日志文件。

5. 查看实验运行状态

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

tmux ls

进入会话:

tmux attach -t exp1

如果只想看日志:

tail -f logs/exp1.log

查看自己的进程:

ps -u "$USER" -o pid,ppid,etime,cmd

6. 停止实验

最推荐的停止方式是回到 tmux 会话,然后按:

Ctrl + C

如果程序没有响应,可以查自己的进程:

ps -u "$USER" -o pid,ppid,cmd | grep python

找到对应 PID 后,先尝试:

kill PID

例如:

kill 123456

如果仍然无法停止,最后再考虑:

kill -9 PID

不要乱 kill

只停止自己的进程。kill -9 是强制终止,程序可能来不及保存 checkpoint、日志或临时文件。优先使用 Ctrl + C 或普通 kill

7. 多实验命名规范

如果同时有多个实验,建议给 tmux 会话起清楚的名字:

tmux new -s mnist_lr1e-3
tmux new -s nerf_room1
tmux new -s preprocess_data

查看会话:

tmux ls

进入指定会话:

tmux attach -t nerf_room1

不要全部叫 testexpnew。过几天之后你会忘记它们分别在跑什么。

8. nohup 可以用吗

nohup 也可以让程序在退出终端后继续运行,例如:

nohup python train.py > logs/exp1.log 2>&1 &

tmux 不同之处在于,它不能回到原来的终端界面。比较适合那种“跑完就行”的命令。

但对新手来说,tmux 更直观:你可以回到原来的终端会话,继续看输出和操作。建议刚开始优先使用 tmux,等你明确知道自己需要什么时,再考虑 nohup

参考