如何在远程服务器上运行Jupyter Notebooks?
2019年07月04日 由 sunlei 发表
436025
0
Jupyter Notebook是许多数据科学家工具箱中的一个主要工具。作为一个工具,Jupyter Notebook可以通过交互方式简化数据分析、模型建模和实验,从而缩短从编码到查看结果的反馈循环,从而提高工作效率。
在很多情况下,在笔记本电脑或工作站上运行一个Jupyter Notebook就足够了。然而,如果您正在处理大型数据集、执行计算开销较大的数据处理或学习复杂模型,您可能需要比笔记本电脑更强大的额外功能。也许你在大型图形上运行图形卷积网络,或者在大型文本语料库上使用递归神经网络进行机器翻译,需要更多的CPU内核、RAM或几个GPU。幸运的是,您可能在远程服务器上有这些资源可用!
如果您的远程服务器具有图形用户界面(GUI),那么您就很幸运了。您可以使用远程桌面软件来访问远程服务器,或者像您的笔记本电脑一样使用Jupyter Notebook。
但是,许多服务器没有GUI。如果处于这种情况,可以通过在笔记本电脑上编写一个python脚本来设置实验,在数据的一小部分上运行它来验证它是否可以运行,将它复制到远程服务器,然后从命令行执行它。您甚至可以在笔记本中设置实验,并使用jupyter nbconvert将笔记本导出到脚本中——以编写您的“notebook.ipynb”脚本。尽管此工作流确实允许您在远程服务器上运行代码,但您不能再使用Jupyter Notebook来进行试验,例如,以交互方式显示结果。真可惜!
在本文中,我将向您展示如何在远程服务器上运行Jupyter Notebook,以及如何在您的笔记本上访问它。我还将演示如何设置两个bash命令以简化整个过程。
启动远程记事本服务器
我们将使用安全Shell协议(SSH)在远程服务器上启动Jupyter Notebook服务器。SSH允许我们向远程服务器发送命令。基本语法如下:
ssh username:password@remote_server_ip command
您应该发送的确切命令在一定程度上取决于您的上下文。在我的例子中,我与其他没有在共享环境中安装Jupyter的人共享一个远程服务器。因此,我的第一步是转到我的项目文件夹,激活虚拟环境,并启动notebook服务器。我特别想在远程服务器上执行以下三条命令:
cd project_folder
. virtual_environment/bin/activate
jupyter notebook --no-browser --port=8889
我使用—no-browser标志执行jupyter notebook命令,启动一个浏览器来启动jupyter notebook,因为如果远程服务器没有GUI,则无法显示浏览器。我还使用—port=8889标志将端口从默认端口8888更改为端口8889。这是个人偏好;将本地和远程笔记本放在不同的端口上,以便更容易地查看代码运行的位置。
要在远程服务器上执行命令,我们运行组合命令。
nohup ssh -f username:password@remote_server_ip "cd project_folder; . virtual_environment/bin/activate; jupyter notebook --no-browser --port=8889"
注意,我用一行代码将这三个命令分隔开来;而不是换行。执行此命令将启动端口8889上的Jupyter Notebook服务器,并让它在后台运行。最后,我在ssh命令中添加了-f标志,以将进程推送到后台,并在前面加上nohup命令,使进程的所有输出保持静默,以便您可以继续使用终端窗口。您可以在
这里阅读有关thenohup命令的更多信息。
访问笔记本
现在,您可以访问在URL中键入的笔记本
remote_server_ip:8889
此命令要求您记住IP地址或为网页加书签。但是,我们可以使用端口转发使远程笔记本像本地笔记本一样容易访问:
nohup ssh -N -f -L localhost:8889:localhost:8889 username:password@remote_server_ip
-N标志告诉ssh不会执行任何远程命令。此时,我们不需要执行任何远程命令。如前所述,-f标志将ssh进程推到后台。最后,-L标志使用语法local_server:local_port:remote_server:remote_port指定端口转发配置。该配置指定所有发送到本地计算机上的端口8889(例如,您的笔记本电脑)的请求都要发送到远程计算机上的端口8889(用户名:password@remote_server_ip)。与前面一样,nohup命令的前缀是使输出静默。
上述命令的效果是,您现在可以访问浏览器中的远程木星笔记本服务器
localhost:8889
就像你在本地运行笔记本一样。
停止远程笔记本服务器
原则上,您可以让notebook服务器无限期地运行在远程服务器上(除非重启或崩溃),但是您可能需要停止服务器,例如升级您的jupyter版本。如果您需要停止它,有两种方法:通过浏览器或通过命令行。
通过浏览器窗口
在Jupyter Notebook的最新版本中,您可以在浏览器窗口右上角找到一个退出按钮,如下图中箭头所示。如果Jupyter Notebook您按下它,您将必须使用我们之前看到的启动命令重新启动服务器。
[caption id="attachment_41778" align="aligncenter" width="1540"]
退出按钮[/caption]
通过命令行
如果无法升级到具有退出按钮的新版本Jupyter,或者只是更喜欢通过终端工作,也可以从命令行停止服务器。Jupyter有一个shell命令停止笔记本:
jupyter notebook stop 8889
其中8889是端口号。您可以使用命令在远程服务器上执行它
ssh username:password@remote_server_ip "jupyter notebook stop 8889"
不幸的是,这个命令目前存在bug,但是我将它包含在这里,希望它将来能够工作。但是,作为一种解决方法,您可以使用以下命令来终止jupyter进程:
ssh username:password@remote_server_ip "pkill -u username jupyter"
其中-u用户名表示只有由用户名启动的Jupyter进程应该被终止。这样做的缺点是,如果一次运行多个笔记本服务器,您将关闭所有的笔记本服务器。最后,您当然可以通过登录到远程服务器、启动notebook服务器并保持终端窗口打开来手动管理服务器。这允许您使用常用的CTRL+C键盘命令关闭笔记本服务器。
梳理你的工作流程
记住所有这些命令可能非常麻烦。幸运的是,我们可以通过为每个命令创建bash别名来简化工作。在~/.bashrc文件中添加以下行:
alias port_forward='nohup ssh -N -f -L localhost:8889:localhost:8889 username:password@remote_server_ip'
alias remote_notebook_start='nohup ssh -f username:password@remote_server_ip "cd rne; . virtual_environment/bin/activate; jupyter notebook --no-browser --port=8889"; port_forward'
alias remote_notebook_stop='ssh username:password@remote_server_ip "pkill -u username jupyter"'
通过在终端中键入source.bashrc来加载命令。现在,您可以使用终端中的“远程笔记本启动”和“远程笔记本停止”命令分别启动远程笔记本服务器(和设置端口转发)并将其关闭。
总结
在这篇文章中,我向您展示了如何使用bash命令在远程服务器上启动、访问和停止Jupyter Notebook,并展示了如何创建bash别名来简化操作。
我希望这些命令可以提高您的数据科学生产力,几乎无缝地允许您从Jupyter Notebook和远程服务器上可用的任何计算资源中获益。