跑深度学习没算力怎么行,而没money哪来的算力,所以说深度学习是富人的游戏也就不足为怪了😭

简单记录一下实验室的服务器如何使用

SSH

​ 实验室服务器一般是X86构架、Linux系统。如果主机也是Linux,直接安装ssh服务通过命令连接,如果是windows系统,推荐使用开源的WindTerm,还有一些其他的ssh软件如mobaxTerm、XShell等。WindTerm集成SSH和SCP等主要用于连接服务器的协议,非常方便,界面优雅。如何使用WindTerm就不多介绍了。

常规操作

​ 一般通过WindTerm建立连接服务器的会话(IP+Port),然后就可以操作服务器终端,安装管理深度学习环境。WindTerm等众多软件均支持直接在服务器和主机之间通过拖拽方式传输文件,非常方便。

​ 安装好虚拟环境后,激活环境,cd到工程目录,通过python train.py训练。但是由于实验室的网实在是不稳定,所以经常遇到跑了好几个小时的代码快要出结果的时候却断网了,导致与服务器的连接中断,代码也就自然而然的停止运行了。这点真的让人很苦恼。同时,当你的ssh在执行一个代码时,你如果不新建一个连接,你在这个连接中是无法干其他的事情的,这一点也很不好。于是,考虑可以把代码放到服务器后台运行。

第一种 nohup

​ nohup方式会将代码放在服务器后台执行,终端看不到运行过程,期间运行结果会在一个生成的nohup.out文件中保存。直接断开SSH连接关闭VPN都不会影响训练过程。

​ 这就涉及out文件的存储位置。默认在train.py同级目录下生成nohup.out

nohup python3 train.py

​ 不输出nohup.out

nohup python3 -W ignore -m xxx.py

​ 指定nohup.out路径和文件名,下面将输出保存在my_out_file.txt中:

nohup python -u xxx.py >my_out_file.txt 2>&1 &

​ 实时查看输出文件内容:

tail -f nohup.out

第二种 screen

​ 可以简单的认为用这个命令你可以为不同的任务开不同的窗口,这个窗口之间是可以切换的,同时,窗口和你的会话连接基本上没有任何区别,这样你可以在开一个连接的时候同时干多件事情,并且在终端看得到运行过程的同时而不会由于断网而导致代码停止运行。其常用命令如下:

screen -S name # 创建一个窗口,并且为这个窗口命名

​ 当你执行完以上命令后,就会自动跳入名为name的窗口,在这个窗口里可以干你想干的事情。

​ 当你不想呆在这个窗口时,你可以通过快捷键Ctrl+a+D断开这个窗口的连接而回到连接会话界面。显示如下:

[detached from 28113.yolo]
user@ubuntu-Super-Server:~/code$

​ 说明从yolo这个窗口断开回到了会话界面。但是这个断开只是不显示那个窗口,而窗口对应的任务是在后台运行的。

screen ls # 可以查看已创建的所有窗口

​ 执行上述指令后,出现如下结果,说明创建了两个窗口,可以看到窗口的名字和id,Detached说明窗口是断开的,再次强调这里的断开是指没有让他显示,其对应的任务是在后台执行的。

user@ubuntu-Super-Server:~/code$ screen -ls
There are screens on:
28475.ssd (2017年11月27日 20时07分41秒) (Detached)
28113.yolo (2017年11月27日 19时57分26秒) (Detached)

​ 如果想看其中一个窗口任务的执行状态,可以通过如下指令:

screen -r ssd # 重新连接到ssd窗口,显示其运行过程

​ 如果想直接停止某个窗口任务的运行,可以直接通过杀死id的方式:

kill 28475 # 终止ssd窗口对应任务的运行,同时杀死该窗口

​ 总结一下,screen可以实现代码在后台运行时的可视化,同时,能在开一个会话连接时创建多个窗口处理不同的任务。用起来也很方便。

使用CUDA

​ 有一台服务器,服务器上有多块儿GPU可以供使用,但此时只希望使用第2块和第4块GPU,但是我们希望代码能看到的仍然是有两块GPU,分别编号为0,1,这个时候我们可以使用环境变量CUDA_VISIBLE_DEVICES来解决这个问题。
​ 比如:

CUDA_VISIBLE_DEVICES=1  只有编号为1的GPU对程序是可见的,在代码中gpu[0]指的就是这块儿GPU
CUDA_VISIBLE_DEVICES=0,2,3 只有编号为0,2,3的GPU对程序是可见的,在代码中gpu[0]指的是第0块儿,gpu[1]指的是第2块儿,gpu[2]指的是第3块儿
CUDA_VISIBLE_DEVICES=2,0,3 只有编号为0,2,3的GPU对程序是可见的,但是在代码中gpu[0]指的是第2块儿,gpu[1]指的是第0块儿,gpu[2]指的是第3块儿

实验室服务器连网

​ 参考:https://blog.csdn.net/weixin_44042453/article/details/127282404?spm=1001.2014.3001.5506

​ 在服务器未连接外网的情况下,上文操作的本质是端口转移。当服务器和主机处于同一局域网,通过SSH操作服务器终端访问外网,只能通过服务器走主机的代理端口访问外网,即给服务器配代理。非VPN情况使用主机以太网IP,VPN情况使用主机虚拟IP,代理端口查看主机的代理软件http端口,并设置代理软件允许局域网内的连接。

桌面

​ 关于可视化桌面,可以用VNC,向日葵等软件,向日葵比较简单,装上软件即可,VNC需要装服务并启动服务。