如何在远程服务器上运行Jupyter Notebooks?

2019年07月04日 由 sunlei 发表 939700 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和远程服务器上可用的任何计算资源中获益。
欢迎关注ATYUN官方公众号
商务合作及内容投稿请联系邮箱:bd@atyun.com
评论 登录
写评论取消
回复取消