本篇文章主要围绕解决深度神经网络模型在进行大型网络模型训练的时候,训练中断应该如何基于之前训练的模型继续训练,还有深度学习模型训练如何在中断服务器ssh连接之后,仍然能够继续保持训练。
问题一:ssh中断服务器连接,模型停止训练
针对如何解决远程服务器中断ssh连接停止模型训练问题,这里我们可以直接使用screen命令去解决。
方式1:
1.创建screen
screen -S [窗口名称]
新建窗口后可以在窗口里运行代码,即便断开连接也可以继续运行。
如果没有screen则需要安装,以下是安装命令:
sudo apt install screen
2.查看screen列表
如果忘了输入的窗口名是什么,输入以下命令可以查看存在的窗口有哪些。
screen -ls
3.进入screen窗口
输入以下命令可以重新进入运行窗口。
screen -r [窗口名称]
4.断开screen连接
但只能有一台机器进入窗口,如果有一台机器正查看screen窗口内容,其他机器将进入失败。必须将连接断开才能进入。
screen -d [窗口名称]
5.删除screen
screen -S [窗口名称] -X quit
方式2:
使用nohup命令
方法一中的screen命令并不是每个服务器都能使用的,如果你使用的服务器没有安装screen,而你又没有权限安装,那么可以使用nohup命令。
1.运行代码
首先进入到运行代码的目录中(python代码为例)
nohup python -u [python文件名] &
例如:
nohup python -u train.py &
一定要加上-u,不然在输出文件中看不到python的运行输出。
2.查看运行状态
步骤1执行之后代码就已经运行了,这时候就可以关上电脑走人了。如果想查看模型训练到哪里了则:
首先要重新进入到代码存放目录,输入以下命令(默认的输出文件是nohup.out)
tail -f nohup.out
这样就能实时查看代码的运行状态了。
问题二:关于中断训练后,如何根据保存的权重文件继续训练。
在进行网络训练时,特别是那些结构复杂、规模庞大的模型,通常需要较长时间才能获得令人满意的成果。如果从头开始训练,这个过程会更加漫长。在训练过程中,可能会遇到一些不可预见的意外,导致训练中断。因此,掌握如何利用已保存的权重文件,在训练中断后继续进行训练,是一项非常关键的技能。
1. 保存模型:
2. 加载模型
使用 torch.load函数
进行加载
model.load_state_dict(torch.load('权重文件所在的路径', map_location='要存放的设备'))
3. 保存权重文件
一般地,权重文件中需要保存:网络模型权重、优化器权重、以及epoch
,便于继续训练
我一般会设置条件保存权重文件,权重文件相对占用的空间比较大,可以设置 每间隔几个epoch 保存一次。
if epoch % 5 == 0:
checkpoint = {
"model":model.state_dict(),
"optimizer":optimizer.state_dict(),
"epoch":epoch
} # 要保存的权重文件内容
# 创建保存权重文件所在的文件夹
if not os.path.isdir('./checkpoint'):
os.makedirs("./checkpoint")
# 使用 torch.save() 函数保存权重文件到指定的路径下
torch.save(checkpoint, './checkpoint/ckpt_%d.pth' % int(epoch))
# 或者写成:torch.save(checkpoint, './checkpoint/ckpt_{}.pth '.format(int(epoch)))
# torch.save(checkpoint, f'./checkpoint/ckpt_{int(epoch)}.pth')
这样就可以在checkpoint文件夹下看到每间隔5个epoch保存的权重文件
4. 在断点处继续训练
注意 start_epoch
的设定,以保证再次训练时,epoch的次数匹配
start_epoch = 0 # strat_epoch的值一般默认为0,表示从头开始进行训练
# Resume = False # 用于指示是否继续训练 取值为逻辑值: False:初次训练; True:继续训练
Resume = True
# 判断是否继续训练
if Resume:
path_checkpoint = "./checkpoint/ckpt_5.pth" # 断点权重文件的所在路径
checkpoint = torch.load(path_checkpoint) # 加载保存的断点文件
model.load_state_dict(checkpoint['model']) # 加载模型可学习参数
optimizer.load_state_dict(checkpoint['optimizer']) # 加载优化器参数
start_epoch = checkpoint['epoch'] # 设置继续上次训练的epoch