如何在本地计算机上通过远程服务器运行 Jupyter Notebook?

32

我可以从我的大学远程访问另一个远程服务器,通过本地机器进行访问!然而,我的本地机器没有足够的内存来运行多个Jupyter笔记本。有没有办法通过远程服务器来运行它们,可能会加快任务的速度!尽管我不是很确定!

我在macOS终端中访问服务器。 谢谢!

7个回答

71

这里有一个相当不错的教程,在这里

实质上,您只需在无浏览器模式下在远程计算机上运行笔记本电脑即可。

jupyter notebook --no-browser --port=8080

接下来在本地机器上设置一个ssh隧道:

ssh -L 8080:localhost:8080 <REMOTE_USER>@<REMOTE_HOST>

然后在您的本地浏览器中转到:http://localhost:8080/

编辑:

在特定端口上运行不是必需的,--no-browser 标记是必需的。


1
这个 http://localhost:8080/ 对我来说无法打开。 - Parisa Khateri
1
我会添加一些链接,其中包含一些参考资料,因为到目前为止两个答案似乎都提出了很好的建议;然而,有时候如果有更多的解释和哪些部分可以变化的感觉会更容易。请参见这里这里这里 - Wayne
3
提一下第二步是在本地机器上会很有用,谢谢! - Matifou
1
谢谢你的回答。我还有个后续问题。这个运行在远程服务器上的Jupyter笔记本,它能访问我的本地虚拟环境吗?还是它需要在远程服务器上有自己的虚拟环境? - CodeAllDay
1
你与笔记本唯一的连接是通过在端口8080上设置的隧道通过浏览器进行的,因此是的,你也需要在远程计算机上管理你的环境。 - nihilok

13

我认为您可能正在寻找端口转发功能。

例如,在通过ssh登录到远程主机后,您可以:

  1. On the remote machine, start jupyter notebook from your current directory and specify the port:

    jupyter notebook --no-browser --port=9999
    
  2. On the local machine, catch the forwarded port:

    ssh -NfL localhost:9999:localhost:9999 your_user_name@remote_ip_address
    
  3. Go to http://localhost:9999. You should be able to select your notebook and you'll be good to go.


9

您可以在远程服务器终端上运行jupyter notebook --no-browser --ip="<remote server ip>",然后从本地机器的浏览器中使用http://:8888/?token=<>访问笔记本。


2
这正是我需要的,以便在 Windows 10 上运行 Haskell 内核,并在 WSL 中运行 Jupyter 笔记本。 - brian burnett

8
假设本地用户为 localuser,主机为 localhost,远程用户和远程主机为 remoteuserremotehost。要从本地计算机上运行远程服务器上的 Jupyter 笔记本,请按照以下步骤操作。
  1. On remote machine run Jupyter notebook with --no-browser with specifying a port

    jupyter notebook --no-browser --port=XXXX
    
  2. Forward it to your local machine via SSH

    ssh -N -f -L localhost:YYYY:localhost:XXXX remoteuser@remotehost
    
  3. Open a browser and go to http://localhost:YYYY

你可能需要关闭连接

  • Stop your running notebook with CTRL+C then y

  • Kill the process running on port YYYY, netstat returns you the process ID (PID)

     sudo netstat -lpn | grep :YYYY -> for LINUX
     sudo netstat -anv | grep YYYY -> for MacOS
    
     kill PROCESS_ID
    

1
你能解释一下端口YYYY和XXXX之间的区别吗? - JasonC

5

要通过浏览器访问远程机器,笔记本必须在外部端口上侦听(而不是localhost)。如果要在容器上运行Jupyter笔记本,您将需要相同的调用。在这种情况下,类似于这样:

jupyter notebook --no-browser --port=8080 --ip=0.0.0.0

只需在本地主机上进行侦听,您可以省略 IP 地址

jupyter notebook --no-browser --port=8080

要远程访问其他答案中的SSH隧道选项,您需要每个笔记本电脑一个SSH隧道。如果您需要运行多个笔记本电脑,另一种选择是使用sshuttle工具在SSH上模拟VPN,这样您就不必创建多个隧道。使用sshuttle选项运行,可以完全访问远程机器的网络(例如10.250.100.40/24),或者您可以将所有流量都通过远程机器转发(类似传统VPN)。
# forward all traffic to network of remote server over the SSH VPN
sshuttle --dns -NHr username@sshserver 10.250.100.40/24

# forward all traffic through the remote server over the SSH VPN
sshuttle --dns -NHr username@sshserver 0/0

注意:DNS标志对于能够使用远程机器的DNS进行名称解析非常重要。
然后执行笔记本以侦听外部端口。例如,运行3个笔记本。
jupyter notebook --no-browser --port=8080 --ip=0.0.0.0
jupyter notebook --no-browser --port=8081 --ip=0.0.0.0
jupyter notebook --no-browser --port=8082 --ip=0.0.0.0

你在运行笔记本进行身份验证时,将使用 Token。它将显示如下输出。
http://server.example.com:8080/tree?token=dd9024f1fb68434645d3902d161f41720650644dc5832f16

假设远程服务器没有阻止对这些端口的流量,那么在您的本地机器上只需简单地打开浏览器,就可以访问。
http://<name-of-remote-machine>:8080/tree?token=<your-token>
http://<name-of-remote-machine>:8081/tree?token=<your-token>
http://<name-of-remote-machine>:8082/tree?token=<your-token>

1

在无浏览器模式下使用您的自定义端口号运行jupyter笔记本

jupyter notebook --no-browser --port=8888

然后在本地机器上设置一个ssh隧道:

ssh -L 8888:localhost:8888 <REMOTE_USER>@<REMOTE_HOST>

0
没有一个答案对我有用。相反,有一个稍微变化的答案非常简单且有效。
在远程服务器上打开笔记本,使用命令jupyter notebook --no-browser --ip=<remote-host-ip>。然后在本地浏览器中复制远程终端中的链接,链接的格式为http://<remote-host-ip>:8888/tree?token=<>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接