笔者在最近训练模型时,使用wandb进行搜参,但由于运行时间较长,而且使用ssh远程连接服务器,显然不可能实时连接服务器进行训练。而且因为学校断网等原因,加上ssh连接的时候可能会存在网络抖动,此时训练时的bash就会出现中断,导致模型训练终止。

为了解决这个问题,显然需要一个可以实时在后台运行的进程用来进行训练,从而避免中断重训等问题,即进车守护。这个时候,screen显然是一个很好的工具。下面就讲解一下具体安装流程和使用方法。

安装流程

Linux下安装方法很简单,就一条命令:

1
sudo apt install screen # 适用Ubuntu,其它系统把apt换成对应的包管理器就行了

使用方法

启动一个新会话

  • 仅启动新会话,使用以下命令:

    1
    screen
  • 需要为新会话进行命名,如newScreen,则使用:

    1
    screen -S newScreen # -S后写想命名的名字

列出当前所有会话

1
screen -ls

会出现类似如下内容的输出:

1
2
3
4
(base) ~$ screen -ls
There is a screen on:
67512.newScreen (Detached)
1 Socket in /var/folders/f7/bxkzrv1163j5s267jpydb0_m0000gn/T/.screen.

重新连接到一个已经分离的Screen会话

1
2
3
screen -r session_name
# 例如
screen -r newScreen

分离当前会话

在screen会话中,你可以按下Ctrl+A后再按下d键,以将当前会话分离回后台。会话仍在后台运行。

关闭会话

1
screen -S session_name -X quit

其它有用指令

日志记录:可以通过Ctrl+A H启动和停止当前窗口的日志记录,日志文件会被保存在当前目录中。
屏幕分割:可以通过Ctrl+A S分割当前窗口,然后使用Ctrl+A TAB在各个区域间切换,使用Ctrl+A X关闭当前区域。
拷贝模式:使用Ctrl+A [进入拷贝模式,这允许你滚动并查看窗口的输出历史。

指令区别

screen -d **:连接一个screen进程,如果该进程是attached,就先踢掉远端用户再连接。

screen -D **:连接一个screen进程,如果该进程是attached,就先踢掉远端用户并让他logout再连接。

screen -r ** :恢复离线的screen进程,如果有多个断开的进程,需要指定完整name。

screen -R ** : 先试图恢复离线的作业。若找不到离线的进程,即建立新的screen进程。

其它指令

将所有会话调整为当前终端的大小

1
screen -A session_name

将指定的Screen进程离线

1
screen -d session_name

指定会话的缓冲区行数

1
screen -h session_name

即使已经有Screen作业在运行,仍强制建立新的Screen作业

1
screen -m session_name

先尝试恢复离线的作业,如果找不到则建立新的Screen作业

1
screen -R session_name

指定建立新会话时要执行的shell

1
screen -s session_name

显示版本信息

1
screen -v session_name

检查并删除无法使用的Screen作业

1
screen -wipe session_name