跑深度学习代码在linux服务器上的常用操作(ssh,screen,tensorboard,jupyter notebook)

跑深度学习代码在linux服务器上的常用操作(ssh,screen,tensorboard,jupyter notebook)

做深度学习有一段时间了,看了一些论文,跑了一些代码,挖了不少坑,也填了不少坑。在这里先总结一下在服务器上跑深度学习代码时常用的一些操作吧。

  • 如何连上远程服务器

连上服务器

首先,当然得是要用自己的PC连接上服务器。如果你的PC是linux系统,那么可以直接通过ssh指令进行远程访问,这里不详细说明。接下来我们主要说PC是windows上的操作。首先,我们要下一个用于ssh连接的工具,个人推荐的是Xshell。其打开后的界面如下图所示:

然后我们依次文件->新建得到下图:

按图中红色字操作,注意一下,以上的应用场景主要是在你的PC和你的服务器是在同一个局域网下的(通俗说连的是同一个wifi),如果不在同一个局域网下,本文不做叙述。

确定之后,会弹出一个会话框,选中你新建的会话名称然后点击连接,就会让你先输入你在服务器上的用户名和密码,确定之后显示如下界面就表示连接成功了。

服务器与本地电脑之间传输文件

如果想往服务器上传文件,可以点击下图红色方框中的按钮。

得到

左侧是本地文件,右侧是服务器文件,两边文件拖动就可以实现文件互传了。真的很方便。


  • 如何让代码在后台运行

由于实验室的网实在是不稳定,所以经常遇到跑了好几个小时的代码快要出结果的时候却断网了,导致与服务器的连接中断,代码也就自然而然的停止运行了(至于其中的具体原因可以自行百度)。这点真的让人很苦恼。同时,当你的ssh在执行一个代码时,你如果不新建一个连接,你在这个连接中是无法干其他的事情的,这一点也很不好。于是,考虑可以把代码放到服务器后台运行。

第一种 nohup

最开始的做法是

$ nohup python test.py

这样执行的时候会将代码放在服务器后台执行,你的终端是看不到运行过程的,期间运行的结果(代码运行过程中打印出来的)会在一个生成的nohup.out文件中保存。

第二种 screen

后来接触到了screen命令,觉得着实好用,在这里极力推荐。

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

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

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

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

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

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

$screen -S 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 #重新连接到yolo窗口,显示其运行过程

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

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

执行完以上指令再看存在的窗口时后会发现只剩名为yolo的窗口了

user@ubuntu-Super-Server:~/code$ screen -ls
There is a screen on:
	28113.yolo	(2017年11月27日 19时57分26秒)	(Detached)

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


  • 服务器上tensorboard的使用

对于使用tensorflow的同学,tensorboard是个很好的工具。通过以下的命令可以打开tensorboard,这个port可以自己改,默认的是6006。

$tensorboard --logdir=log --port=6006

尴尬的是,当你在服务器上执行上段指令时,他会给你个地址让你在浏览器上打开。但是,使用服务器上的浏览器基本是件不可能的事情!我怎么将服务器上的信息转到自己的电脑上呢?这时就需要用到端口转发。我们最近实现这个有两种方式:

第一种 针对win10用户

想必大家都知道2017年win10系统内嵌了一个linux的子系统。首先我们要启用这个子系统。具体步骤是:打开 所有设置->更新与安全->针对开发人员然后选择下图中的开发人员模式。

执行完上述步骤win10会自动下载相关库和包,下载完后在控制面板中找到程序和功能然后选择启用或关闭Windows功能,出现下图菜单:

勾选适用于Linux的Windows子系统(Beta),然后重启电脑。

重启电脑后win+R输入cmd,然后在dos界面输入bash之后就会下载对应的组件,这个时间可能比较长需要耐心等待。下载完成后,输入相应的用户名和密码就好了。这样,我们就完成了win10上的linux子系统的安装。下次打开时,直接通过win+R输入bash即可。

接下来就是用自己电脑的linux与服务器进行ssh连接并进行端口转发。具体步骤是:

首先win+R 输入bash打开win10自带的linux的子系统,在命令行输入以下指令

$ ssh -L 16006:127.0.0.1:6006 usr@192.168.1.115

解释下上面的指令,127.0.0.1是自己PC的本地地址(localhost),16006代表的本地的16006端口,192.168.1.115是服务器的ip地址(同样服务器和PC在一个局域网下)usr是在服务器上想登陆的用户名,6006是服务器上的6006端口,上面的指令就可以实现将服务器上6006端口的信息转发到本地主机的16006端口上。

当你建立了以上连接后,在你的xshell建立的会话连接中输入打开tensorboard的指令后,我们在自己的电脑浏览器上输入127.0.0.1:16006或者localhost:16006就可以访问到服务器上的tensorboard的信息了。

第二种 依然是使用xshell

具体做法是当你用xshell建立好连接后,点击下图红框中的属性按钮

然后点击属性中的SSH下的隧道,得到如下界面

点击添加:

将侦听端口改为16006(当然也可以是其他的,就是本机的端口),目标主机和源主机保持localhost不变,目标端口就是服务器上打开tensorboard对应的端口6006然后点击确定之后,就建立好了服务器端口16006与自己电脑端口6006的转发。然后按之前的步骤打开tensorboard,在本地浏览器中输入127.0.0.1:16006或者localhost:16006就可以访问到服务器上的tensorboard的信息了,所以说xshell真的特别好用!


  • 远程服务器上jupyter notebook的使用

在服务器上jupyter notebook也是经常被用到的,一般输入如下命令便可以打开

$ jupyter notebook --port=8888

这里的port默认是8888。同样,在不能使用服务器浏览器的情况下想本地PC能读到服务器8888端口的信息,也需要建立端口转发。整个过程同tensorboard的设置类似,不过是把端口号更改就好。当端口转发建立后。我们在服务器输入上述指令,会得到以下输出:

[I 23:17:08.227 NotebookApp] Writing notebook server cookie secret to /run/user/1002/jupyter/notebook_cookie_secret
[I 23:17:08.275 NotebookApp] JupyterLab alpha preview extension loaded from /home/yuwei/anaconda3/lib/python3.6/site-packages/jupyterlab
JupyterLab v0.27.0
Known labextensions:
[I 23:17:08.277 NotebookApp] Running the core application with no additional extensions or settings
[I 23:17:08.280 NotebookApp] Serving notebooks from local directory: /home/yuwei
[I 23:17:08.280 NotebookApp] 0 active kernels 
[I 23:17:08.280 NotebookApp] The Jupyter Notebook is running at: http://localhost:8888/?token=d4846a751b41bb288ac8c38b1da7976c0677b6aa51430705
[I 23:17:08.280 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).
[C 23:17:08.280 NotebookApp] 
    
    Copy/paste this URL into your browser when you connect for the first time,
    to login with a token:
        http://localhost:8888/?token=d4846a751b41bb288ac8c38b1da7976c0677b6aa51430705

需要做的只是将最后一行的地址复制到本地浏览器然后将8888(服务器端口)改为转发的本地端口(如:16006或8888)就可以了。这样我们在自己的电脑上也可以使用服务器上的jupyter notebook了,如下图所示。

当然还有一种方法,详细见这篇文章吧。

如何在window访问ubuntu服务器的jupyter notebook


  • 其他常用命令

使用如下指令的前提是安装好了NVIDIA的驱动(cuda。。)。

$ CUDA_VISIBLE_DEVICES=2 python test.py

在使用gpu版本的tensorflow时,跑对应的代码(如果代码中没有明确指定用哪个gpu跑)默认会调用所有的gpu,使用如上命令后可以指定所使用的gpu。

$ nvidia-smi

执行上述指执行上述指执行上述指执行上述指执行上述指令可以查看服务器上gpu的使用状况。

Tue Nov 28 09:20:42 2017       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.90                 Driver Version: 384.90                    |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX TIT...  Off  | 00000000:05:00.0  On |                  N/A |
| 22%   45C    P8    17W / 250W |    443MiB / 12204MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  GeForce GTX TIT...  Off  | 00000000:06:00.0 Off |                  N/A |
| 22%   46C    P8    16W / 250W |      2MiB / 12207MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  GeForce GTX TIT...  Off  | 00000000:09:00.0 Off |                  N/A |
| 22%   42C    P8    15W / 250W |      2MiB / 12207MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   3  GeForce GTX TIT...  Off  | 00000000:0A:00.0 Off |                  N/A |
| 22%   35C    P8    14W / 250W |      2MiB / 12207MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

总结一下,上述的种种操作是我反复使用的操作,还是比较实用的。但是本文中的关于ssh和端口转发的内容都有一个前提是自己的PC和服务器都在同一个局域网下,如果不在同一个局域网里上述的操作可能不太适用,需要进行其他的操作,这些是本文中没有提到的。

以上纯属经验之谈,如有错误之处,望大家批评指正。

如有转载请注明出处。

编辑于 2017-11-29