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

207

我是Tensorflow的新手,希望能通过一些可视化方式更好地理解我正在做的事情。我知道Tensorboard是一个有用的可视化工具,但我该如何在我的远程Ubuntu机器上运行它呢?


1
一些可能的解决方案: (1)它可能与在本地机器上运行相同,尽管我还没有验证:运行后,它会提供一个端口号,您可以使用该端口号从本地机器上的浏览器访问它。 (2)您是否能够使用远程桌面软件,例如RealVNC? (3)我假设您也在同一台远程机器上运行tensorflow计算;您还可以将日志文件下载到本地机器上,并在本地机器上运行tensorboard。 - Yao Zhang
12个回答

317

以下是我避免让远程服务器接受本地外部IP问题的方法:

  • 当我通过ssh连接到服务器时,我使用-L选项将远程服务器的端口6006转移到我的机器上的端口16006(例如): ssh -L 16006:127.0.0.1:6006 olivier@my_server_ip

它的作用是将服务器上端口6006(在127.0.0.1:6006中)的所有内容转发到我的机器上的端口16006


  • 然后你可以在远程机器上使用标准的tensorboard --logdir log命令启动tensorboard,并使用默认的6006端口。
  • 在你的本地机器上,打开http://127.0.0.1:16006,享受远程TensorBoard。

1
同时在Safari浏览器上遇到了tensorboard图表全部变成黑色的问题,但在Chrome浏览器上可以正常显示(与#4856相关)。 - Olivier Moindrot
9
一个小提示:这里的127.0.0.1是指你的本地机器IP地址,所以你应该将其保留不变,不要改成你的远程IP地址。我因为这个浪费了10分钟时间。我真是太蠢了! - DarkZero
通过使用-4 ssh标志来强制使用IPv4解决了这个问题。阅读类似的问题,许多人在他们的服务器上遇到了IPv6地址的问题。 - Robert Parcus
1
看起来我必须留在ssh shell中。如果我关闭ssh shell,远程tensorboard就没有响应了。有没有一种方法可以在关闭ssh shell的同时仍然连接到tensorboard? - Fan
1
@Fan:请查看下面的另一个答案。基本上,您可以添加“-N”标志以避免打开ssh shell。添加“-f”将ssh连接放在后台。 - Olivier Moindrot
显示剩余4条评论

161
您可以使用另一个与连接服务器不相关的ssh命令进行端口转发(作为其他答案的替代方法)。因此,下面步骤的顺序是任意的。
  1. 从您的本地机器运行以下命令:
    ssh -N -f -L localhost:16006:localhost:6006 <user@remote>
  2. 远程机器上运行以下命令:
    tensorboard --logdir <path> --port 6006
  3. 然后,在本地机器上导航到(例如)http://localhost:16006
(SSH命令解释: -N:不执行远程命令 -f:将SSH放在后台运行 -L <machine1>:<portA>:<machine2>:<portB>
<machine1>:<portA>(本地范围)转发到<machine2>:<portB>(远程范围))

正如@0xcaff所提到的,你应该监听其他接口。 - mmohaveri
针对特定端口,ssh -p PORTNUMBER -N -f -L localhost:16006:localhost:6006 <user@remote>。 - Wey Shi
1
根据'man ssh'页面,-L选项将端口转发从本地范围到远程范围。但除此之外,答案很棒。 - Bon Ryu
@BonRyu 你说得对,谢谢!我已经修正了答案。 - eqzx
2
请问如何关闭这个链接?谢谢。 - ToughMind
1
第一步中的“user”是什么?第三步中的“path”又是什么? - haneulkim

136

你不需要做任何花哨的事情,只需运行:

tensorboard --host 0.0.0.0 <other args here>

并连接到您的服务器URL和端口。 --host 0.0.0.0告诉tensorflow在本地机器上监听所有IPv4地址的连接。


8
这应该是正确的答案..很可能是因为TensorBoard未绑定到对外可见的地址。 - Duane
1
它对于我来说在远程服务器上不起作用...我错过了什么? - Idan Azuri
1
如果您只想在公共IP上进行监听,可以执行以下操作: tensorboard --host $(hostname -I) <其他参数>然后,您可以复制并粘贴TensorBoard打印出的URL: TensorBoard 1.12.2 at http://10.0.50.42:6006 (按CTRL+C退出) - Morten
4
@Idanazuri,你能够通过HTTP访问你的远程计算机吗?或者它受到了防火墙的限制(例如:只能通过SSH连接访问)?如果只能通过SSH连接访问,那么这个答案对你无效。 - drevicko
1
这个答案特别适用于在私有 LAN 上训练系统并且只想对训练过程进行即席检查的情况。您需要指定您的日志目录(您可能会在检查点目录的子目录中找到它,其中包含一个类似于“events.out.tfevents.1604862122.blah.blah.blah”的文件)。 - James_SO
简单明了,却能像魔术一样奏效! - K. Symbol

28

如果由于某些原因无法使其正常工作,另一个选项是使用sshfs在文件系统上挂载logdir目录:

sshfs user@host:/home/user/project/summary_logs ~/summary_logs

然后在本地运行Tensorboard。


20

--bind_all 选项很有用。

$ tensorboard --logdir runs --bind_all

端口将会自动从6006开始递增选择。(6006、6007、6008...)


15
您可以在远程服务器终端上直接运行以下命令来启动tensorboard:
tensorboard --logdir {tf_log directory path} --host "0.0.0.0" --port 6006

或者您也可以在您的IPython笔记本中启动TensorBoard:

%load_ext tensorboard
%tensorboard --logdir {tf_log directory path} --host "0.0.0.0" --port 6006

什么是“0.0.0.0”,我需要用其他东西替换它吗? - zheyuanWang
这是您本地机器的端口,如果您有不同的主机,可以更改它。 - Devendra Soni
这对我有用。我正在使用VSCode远程连接到一台机器。在远程机器的VSCode终端中,我输入了这个答案中的确切命令。VSCode提示我在浏览器中打开(我正在使用Microsoft Edge),我这样做了,然后Tensorboard出现了。 - user3731622

12
  1. 通过搜索 "whats my ip" 或者输入以下命令来查找您的本地外部IP地址:wget http://ipinfo.io/ip -qO -
  2. 确定您的远程外部IP地址。这可能是在ssh到远程服务器时出现在用户名后面的内容。您也可以再次从那里运行 wget http://ipinfo.io/ip -qO -
  3. 将您的远程服务器流量安全地限制为只接受您的本地外部IP地址
  4. 运行Tensorboard,注意它默认使用的端口:6006
  5. 在浏览器中输入您的远程外部IP地址,后跟端口:123.123.12.32:6006

如果您的远程服务器对来自本地IP地址的流量开放,您应该能够看到您的远程Tensorboard。

警告:如果所有互联网流量都可以访问您的系统(如果您没有指定单个IP地址可以访问它),任何人都可能查看您的TensorBoard结果并创建SkyNet。


9

您需要使用端口转发创建SSH连接:

ssh -L 16006:127.0.0.1:6006 user@host

然后您运行 tensorboard 命令:

tensorboard --logdir=/path/to/logs

然后您可以在浏览器中轻松访问tensorboard,网址为:

localhost:16006/

8
这不是一个正式的答案,而是一个故障排除程序,希望能帮助像我一样经验不足的网络用户。在我的情况下(firefox+ubuntu16),浏览器连接了,但显示了空白页面(标签上有tensorboard图标),并且没有任何日志活动显示。我仍然不知道原因是什么(没有深入研究,但如果有人知道,请告诉我!),但我通过切换到Ubuntu的默认浏览器来解决了这个问题。以下是确切的步骤,几乎与@Olivier Moindrot的答案相同:
1. 在服务器上启动tensorboard:tensorboard --logdir=. --host=localhost --port=6006 2. 在客户端上打开ssh隧道ssh -p 23 <USER>@<SERVER> -N -f -L localhost:16006:localhost:6006 3. 打开Ubuntu的浏览器并访问localhost:16006。 Tensorboard页面应该很快加载。

为了检查 SSH 隧道是否有效工作,可以使用类似于 this python script 的简单回显服务器:

  1. 将脚本放入服务器中的<ECHO>.py文件中,并使用python <ECHO>.py运行它。现在,服务器将在0.0.0.0:5555上监听回显脚本。
  2. 在客户端上,打开ssh隧道ssh -p <SSH_PORT> <USER>@<SERVER> -N -f -L localhost:12345:localhost:5555
  3. 在客户端上,在用于打开隧道的同一终端(步骤2)中,发出telnet localhost 12345将连接到在服务器上运行的回显脚本。键入hello并按Enter应该会打印hello。如果是这种情况,则您的SSH隧道正在工作。这就是我的情况,并导致我得出结论,问题涉及浏览器。尝试从不同的终端连接会导致终端冻结。

正如我所说,希望能帮到你!
干杯,
安德烈斯


我在Chromium+Ubuntu14上遇到了完全相同的问题,更糟糕的是,它可以在一个计算机上进行端口转发并正常工作,但对于另一个计算机却显示相同的空白页面(带有正确的favicon)。Firefox则没有问题。仍然没有找到解决方法,现在只能使用Firefox。 - LucasB
是的,有很多因素需要考虑,但只要它能正常工作...另一个需要注意的事情是,TF附带的TB版本与可以在此处找到的TB-standalone版本不同... https://github.com/dmlc/tensorboard 只是为了增加更多设置的选择。干杯 - fr_andres

5
另一种方法是使用反向代理,这样您就可以在任何连接互联网的设备上查看Tensorboard而无需SSH。例如,这种方法可以使在移动设备上查看Tensorboard变得更加容易/可行。
步骤:
1)在托管Tensorboard的远程计算机上下载反向代理Ngrok。请参见https://ngrok.com/download获取说明(大约需要5分钟设置时间)。
2)运行ngrok http 6006(假设您正在端口6006上托管Tensorboard)。
3)保存ngrok输出的URL:

enter image description here

4) 将此输入到任何浏览器中以查看TensorBoard:

enter image description here

特别感谢Sam Kirkiles


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