在云服务器上或者SSH远程服务器后台运行深度学习训练任务
在云服务器上训练深度学习模型时,我们经常会遇到这样的问题:当在终端中直接运行训练程序时,如果断开终端连接,或者在Jupyter Notebook中运行程序后关闭网页,训练进程会直接被杀死。为了避免这种情况,我们需要将训练任务转为后台运行,并确保即使关闭终端或网页,进程也能继续执行。本文将介绍如何使用setsid
命令来实现这一功能。
使用setsid
一、使用setsid
命令后台运行程序
setsid
命令可以创建一个新的会话,并将指定的程序在这个新的会话中运行。这样,即使关闭终端或网页,程序也会在新的会话中继续运行,不会受到终端关闭的影响。
命令格式如下:
setsid bash train.sh 2 --model nextvit_small --batch-size 1024 --lr 5e-4 --warmup-epochs 30 --weight-decay 0.1 --data-path ImageNet/ >log.out 2>1&
参数说明:
setsid
:创建一个新的会话,并启动指定的程序。python filename.py
:执行指定的Python训练脚本。> /tmp/log1
:将标准输出(STDOUT)重定向到/tmp/log1
文件中。2>&1
:将标准错误(STDERR)重定向到标准输出(STDOUT),这样错误信息也会写入到/tmp/log1
文件中。&
:将程序放到后台运行。
二、重定向日志和错误输出
在上面的命令中,>
和 2>&1
用于重定向程序的输出和错误信息。>
将标准输出重定向到指定的文件中,而 2>&1
则将标准错误重定向到标准输出,这样两者都会写入到同一个文件中。
重定向的好处是,即使程序在后台运行,我们也可以通过查看日志文件来了解程序的运行状态和可能出现的错误。
三、后台运行程序的监控和管理
使用setsid
命令启动后台程序后,我们可以使用ps
、top
或htop
等命令来查看正在运行的进程。如果需要终止进程,可以使用kill
命令,并指定进程的PID(进程ID)。
如果使用了setsid
命令,进程会成为新的会话的领头进程,这意味着它不会接收任何来自终端的信号(如HUP信号)。因此,即使关闭终端或网页,进程也不会被杀死。
但是,如果你确实需要终止这个进程,可以使用killall
命令来杀死所有指定名称的进程。例如,使用killall -9 python
可以杀死所有正在运行的Python进程(注意:这可能会影响到其他不相关的Python进程,因此使用时需要谨慎)。
更精确的方法是使用ps
命令找到进程的PID,然后使用kill
命令来终止它。例如:
ps aux | grep python | grep filename.py
kill -9 [PID]
其中[PID]
是你要终止的进程的PID。
四、注意事项
- 资源限制:在云服务器上运行深度学习训练任务时,需要注意资源的限制(如CPU、内存和GPU等)。确保你的训练任务不会超过服务器的资源限制,否则可能会导致服务器性能下降或崩溃。
- 日志管理:定期查看和管理日志文件,以避免日志文件占用过多的磁盘空间。你可以使用日志轮转工具(如
logrotate
)来自动管理日志文件。 - 安全性:确保你的云服务器和训练脚本的安全性。使用强密码、防火墙和定期更新等措施来保护你的服务器免受攻击。
使用tmux
1. 安装 tmux
首先,通过 SSH 连接到你的远程服务器。然后使用以下命令安装 tmux
:
sudo apt-get update
sudo apt-get install tmux
2. 启动 tmux
会话并运行程序
安装完成后,输入 tmux
启动一个新的 tmux
会话:
tmux
你会看到一个新的终端界面,这个界面就是 tmux
会话。在这个会话中,你可以运行你的网络训练程序。例如,假设你有一个 Python 脚本 train.py
需要运行:
python train.py
3. 分离 tmux
会话
现在,你的训练程序正在 tmux
会话中运行。如果你想要断开这个会话而不中断程序的运行,你可以按下 Ctrl+b
,然后按下 d
。这样会分离(detach)当前的 tmux
会话,你的训练程序将继续在后台运行。
4. 重新连接到 tmux
会话
当你再次登录到远程服务器时,你可以使用以下命令查看当前所有的 tmux
会话:
tmux ls
你会看到类似如下的输出:
0: 1 windows (created Thu Oct 12 10:00:00 2023) [80x24]
这里的 0
是会话的 ID。要重新连接到这个会话,你可以使用:
tmux attach -t 0
你将会重新看到之前的 tmux
会话界面,并且你的训练程序仍然在运行。
5. 其他有用的 tmux
命令
-
创建命名会话:你可以创建一个带有特定名称的
tmux
会话,以便更容易识别。tmux new -s mysession
要重新连接到这个命名会话:
tmux attach -t mysession
-
杀死会话:如果你不再需要某个
tmux
会话,可以杀死它。首先列出所有会话:
tmux ls
然后杀死特定会话(例如会话 ID 为
0
):tmux kill-session -t 0
-
在会话中打开新窗口:在
tmux
会话中,你可以按下Ctrl+b
,然后按c
来创建一个新的窗口。 -
在会话中切换窗口:你可以按下
Ctrl+b
,然后按p
切换到上一个窗口,或者按n
切换到下一个窗口。
使用 screen
1. 创建一个新的 screen
会话
使用 screen -S
选项可以为你的会话指定一个描述性的名称,便于后续管理。
screen -S mysession
这里的 mysession
是自定义的会话名称,可以是任何你喜欢的字符串。
2. 在 screen
会话中运行任务
进入 screen
会话后,你可以像在普通终端中一样运行任何命令。例如,运行一个 Python 脚本:
python myscript.py
3. 分离 screen
会话(放到后台)
要暂时离开 screen
会话但保持任务运行,按下 Ctrl + A
,然后按 D
。这会将 screen
会话分离,并返回到你的原始终端。分离后的会话会继续在后台运行。
4. 查看所有 screen
会话
使用 screen -ls
命令可以查看当前所有正在运行的 screen
会话及其状态(附加或分离)。
screen -ls
输出示例:
There are screens on:
12345.mysession (Detached)
67890.anothersession (Attached)
2 Sockets in /var/run/screen/S-username.
注意,如果有多个会话,输出将列出所有会话及其状态。
5. 重新连接到 screen
会话
要重新连接到之前分离的 screen
会话,使用 -r
选项并指定会话名称。如果名称唯一,则可以直接使用:
screen -r mysession
如果有多个同名会话,你可能需要指定会话的 PID(从 screen -ls
输出中获取):
screen -r 12345
6. 退出并终止 screen
会话
在 screen
会话内部,你可以通过以下方式之一来关闭并终止会话:
- 按下
Ctrl + D
:这会关闭当前screen
会话,并终止其中运行的所有任务(如果任务在前台运行且未被捕获到后台)。 - 运行
exit
命令:这也会关闭screen
会话。
注意:如果 screen
会话中有多个窗口(通过 Ctrl + A
然后按 C
创建新窗口),你需要确保关闭所有窗口或切换到要关闭的窗口上,然后再执行上述操作。
完善建议
- 会话管理:定期查看并清理不再需要的
screen
会话,以释放系统资源。 - 日志记录:如果需要记录
screen
会话中的输出,可以将输出重定向到文件或使用screen
的日志功能(例如,使用-L
选项启动会话以记录日志)。 - 安全性:虽然
screen
本身不提供会话锁定功能,但你可以通过设置密码来增强安全性(使用screen -X
命令设置密码)。然而,请注意,这并不能完全防止未经授权的访问;更安全的做法是使用支持锁定功能的终端多路复用器(如tmux
)。 - 持久性:
screen
会话是持久的,直到你显式关闭它们。如果系统重启,你可能需要采取额外步骤来恢复会话(例如,通过保存会话状态或使用类似autostart
的配置)。然而,请注意,在某些情况下(如系统崩溃或突然断电),screen
会话可能无法恢复。因此,建议定期保存重要数据并备份会话日志。