背景
连接服务器需要挂载vpn或要保持网络链接,这样网络异常的时候就会白白耗时,针对于此,我的两种解决方案是 1.增加断点续训的代码,2.使用tmux实现网络异常程序也不会中断。
Pytorch断点续训
说明
如果训练完成的话,就torch.save(model.state_dict(), path)
保存模型的参数值。state_dict()
它是一个字典,键是参数的名称,值是参数的张量。weight 和 bias,对应的张量是权重矩阵和偏置向量。
断点续训是在网络中断时,依据保存的信息,能够继续中断的训练,所以不仅保存当前模型的参数值,还有当前的epoch数,以及优化器。
优化器是什么?训练就是找模型中参数最优解,一般为一些矩阵,使得损失函数loss最小。寻找最优解的过程漫长且复杂,可以依据反向传播梯度优化寻找最优解的过程,实现这个优化的就是优化器。其他博客已经写得很清楚了。优化器需要一些参数比如学习率、动量等一系列超参,在训练过程中它们会不停变化,所以需要保存下来它们的状态。
训练设置
不同于一般训练过程,要实现续训就要设置开始的epoch和是否要断点续训的开关。(一般在命令行参数里设置)
startepoch:0
resume: True
保存内容
# 定义好model和optimizer
model = ...
optimizer = optim.Adam(model.parameters(), lr=0.001)
保存的内容:保存的时候每个epoch都保存,这样方便加载。
checkpoint = {
'epoch': epoch,
'model': model.state_dict(),
'optimizer': optimizer.state_dict(),
}
torch.save(checkpoint,'checkpoint')
续训
加载参数:
model= ...
optimizer = ...
if opt.resume:
checkpoint = torch.load('checkpoint')
start_epoch = checkpoint['epoch'] + 1
model.load_state_dict(checkpoint['model'])
optimizer.load_state_dict(checkpoint['optimizer'])
print("=> loaded checkpoint (epoch {})".format(checkpoint['epoch']))
else:
checkpoint = torch.load('checkpoint')
model.load_state_dict(checkpoint)
...
tmux下载与使用
Tmux是一个终端复用工具,允许你在单个终端窗口中同时运行多个终端会话或窗格。它允许用户在同一终端中运行多个独立的终端会话,并且可以在这些会话之间轻松切换。通过Tmux,你可以在同一个终端窗口中同时查看和操作多个命令行界面应用程序,比如终端编辑器、监视程序输出、交互式Shell会话等。
Tmux会话可以在本地网络断开的情况下继续运行。Tmux会话是在本地计算机上运行的,并且与网络连接无关。因此,即使本地网络断开,Tmux会话仍然会继续在本地计算机上运行,直到你手动关闭会话为止。
这里的操作都是在linux黑窗口里,比如你ssh到vscode的话,就是vscode的终端,也可以用xshell链接。
只是简单用法,不涉及原理,方便快速上手。详细教程 这个很详细。
- 首先没有sudo就下载sudo:
Ubuntu下载:
apt install sudo
- 下载tmux:
sudo apt-get install tmux
- 创建tmux会话:
tmux
这样就到一个新的窗口,这就是一个tmux会话,但这个是用默认序号来组织会话的,如果想在创建时带名字就:
tmux new -s name
就会创建带name的对话
- 分离会话与窗口:
当你进入这个会话所在的窗口时,想返回主窗口而不关闭会话,就可以使用这个命令,还可以再进入。
tmux detach
- 退出tmux会话:
exit
这样就返回原来的窗口了,这时这个会话和窗口就会被关闭!这个会话就会清除,如果想让它在后台运行就用tmux detach
。
- 查看已有的会话列表:
tmux ls
- 链接到后台运行的会话:
指定会话的num或者name,它们可以通过列表查看。
tmux attach -t num/name
- 清除指定会话:
tmux kill-session -t num/name
它的作用与exit
一样,只不过exit
是作用于当前会话的,而这个作用于指定会话。