ssh免密快速登录
首先,将你的登录命令写入你的pc端的bash启动脚本中。Mac系统为 ~/.bash_profile ,linux系统为 ~/.bashrc 。例如你的服务器用户名为dlnlp,ip为102.10.60.23,那么就把这句登录命令写进去:
alias sshdlnlp="ssh dlnlp@102.10.60.23"
还有一种更科学强大的方法:将你的服务器信息写入PC端的ssh配置文件中,配置文件位于 ~/.ssh/config ,例如你的服务器用户名为dlnlp,ip为102.10.60.23,那么就把这句写进去:
Host dlnlp
[一个Tab]User dlnlp
[一个Tab]Hostname 102.10.60.23
[一个Tab]Port 22
(Host后面那个dlnlp是你起的名字,你也可以用更简短的名字) 这样可以 ssh dlnlp 也能快捷登录,注意中间的空格哈。而且scp也更加方便了。
保存后别忘 source ~/.bash_profile 或者source ~/.bashrc 激活一下启动脚本哦。
然后,经过第一步后,只需要再敲密码就可以进入啦。但是懒癌至深的我们怎么能容忍敲密码这么麻烦的事情呢!(划掉,应该是小仙女怎么能容忍敲密码这种事情呢)但是我们又不能牺牲服务器的安全性,那怎么办呢?考验大学里计算机网络基础的时候到了~
也很简单,把你PC端的ssh公钥写入服务器的ssh信任列表里就可以啦。首先用`ssh-keygen`命令生成rsa密钥对(生成一只私钥和一只公钥),一路enter即可,但是注意:
之前有已经生成过的同学在此处就选择n吧,没有生成过的同学就一路next~
然后去 ~/.ssh/ 文件夹下将公钥发送到服务器上的某文件夹里:
然后去服务器上,把你PC端的公钥丢进ssh信任列表:
cat id_rsa.pub >> ~/.ssh/authorized_keys
ssh会把你每个你访问过计算机的公钥(public key)都记录在~/.ssh/known_hosts。当下次访问相同计算机时,OpenSSH会核对公钥。如果公钥不同,OpenSSH会发出警告,如果我们重新安装系统,其公钥信息还在,连接会出现如下截图情况
解决方法: rm -rf ~/.ssh/known_hosts
关于jupyter notebook
jupyter notebook这个神器小夕在历史文章中写过啦,也是一个重量级调参神器!或者直接可以说深度学习神器!在服务器端依然犀利的无可替代,只需要如下的tricks。
1、服务器端开启jupyter notebook后
然后复制最后那一行的 token=xxx ,这个token就是远程访问的密码!同时记下 最后那行显示的端口号 8888(因为如果服务器上同时开多个的话,端口号就不一定是8888了哦),然后去PC端做一个端口映射!即通过ssh隧道来将服务器端的8888端口号映射到本地(PC端)的某个端口(如1234):
ssh -L 1234:localhost:8888 dlnlp@102.10.60.23
(这个操作同样可以用于远程监视服务器端tensorboard)
这时就可以在PC端的浏览器
http://localhost:1234
直接访问服务器上的jupyter notebook啦~当然,访问时会让你输入密码,这时就输入之前记下的那个token哦。
2、让jupyer notebook跟anaconda开发环境融合。
默认的情况下jupyter notebook是运行在系统默认环境里的,如果要让它运行在我们自己用ananconda创建的环境中,要进入那个环境中,然后安装 nb_conda 这个库:
conda install nb_conda
这时再开启jupyter notebook就能选择在我们这个环境里运行代码啦。
多任务管理(并行调参)
如果你的服务器上有多个GPU,或者你的任务消耗GPU资源不多,那么并行的训练模型调参数是极大提高开发效率的!这里小夕给出几种场景下的常用方案:
1、比如我们在服务器上除了训练还要接着干别的事情(比如还要捣鼓一下贪吃蛇什么的),那么我们就可以直接将训练任务挂后台。具体如下。
在linux中,在命令后面加上 & 符号可以将命令在后台执行,为了能看到训练日志,我们当时还需要输出重定向(否则会打印到屏幕上干扰正常工作的),所以比如我们调batchsize参数时可以这样:
dlnlp@ubuntu:~$ python train.py --batchsize=16 > log_batch16.txt &
当然再挂上其他batchsize大小,如:
dlnlp@ubuntu:~$ python train.py --batchsize=16 > log_batch16.txt &
dlnlp@ubuntu:~$ python train.py --batchsize=64 > log_batch64.txt &
dlnlp@ubuntu:~$ python train.py --batchsize=128 > log_batch128.txt &
通过 jobs 命令可以看到后台任务的运行状况(running、stopped等),通过 bg [任务号] 可以让后台stopped的命令继续running,通过 fg [任务号] 可以让后台的任务来前台执行。对于前台已经执行起来的任务,可以 ctrl+z 来丢进后台(丢后台时stop了的话用bg让其run起来)。
感谢微信用户A Bad Candy在微信订阅号后台留言提醒上面的丢后台方法会在ssh断开连接后进程终止,因此:
如果我们还不希望ssh断开后导致训练任务终止,那么需要再在命令前面加上 nohup 。如:
dlnlp@ubuntu:~$ nohup python train.py --batchsize=16 > log_batch16.txt &
2、如果我们特别着急,不仅要并行挂着很多训练任务,而且都要实时的监控它们的训练进展,那么使用 screen命令吧,这个命令就相当于可以让你同时开很多个窗口(就像桌面上那样,你可以开很多应用程序的很多窗口),而且多个窗口之间可以轻松切换,同样这种方法不会因为ssh的断开而停止训练任务。
具体的操作可以直接在linux下 man screen 来查看screen命令的帮助文档。英文恐惧症的童鞋可以看本文参考文献[1]。
睡觉调参模式(串行调参)
大部分场合下我们没有那么多充裕的GPU可以用,我们一般只能一次挂一个任务,但是我们又有很重的调参任务,那怎么办呢?
依然很简单啦,首先,装好python-fire这个工具。
它可以非常轻松的将你的python程序变成命令行程序,并且可以轻松的将你要调的参数封装成命令行参数的形式。
然后,写一个调参shell脚本,把你要调的参数全都写进去!比如就像这样:
(当然别忘在代码里将训练的summary写到某个文件里)
然后就可以挂上这个脚本去睡觉啦~睡到天亮发现各个最优参数都找到了,超级开心有木有。