【问题标题】:View Tensorboard on Docker on Google Cloud在 Google Cloud 上查看 Docker 上的 Tensorboard
【发布时间】:2016-02-23 12:48:41
【问题描述】:

我正在尝试在 Google Cloud 上的 Docker 上显示来自 TensorFlow 的 TensorBoard。

http://tensorflow.org/how_tos/summaries_and_tensorboard/index.md

tensorboard --logdir ./

我在 Google Cloud 上运行 Apache(它可能在我的第一个容器“ai-unicorn”中,Docker 制作了自己的容器“docker-playground”)。 我可以在 http://104.197.119.57/ 看到来自 Google Cloud 的默认页面。

我这样在 Google Cloud 上启动 TensorBoard:

root@6cf64fd299f0:/# tensorboard --logdir ./ Starting TensorBoard on port 6006 (You can navigate to http://localhost:6006)

我使用端口 6006 尝试了名为“在自定义端口上的浏览器窗口中打开”的 Google Cloud SSH 选项。

它显示: “我们无法连接到端口 6006 上的 VM。”

从 Google Cloud 查看 TensorBoard 的正确方法是什么?

【问题讨论】:

    标签: docker google-cloud-platform tensorflow tensorboard


    【解决方案1】:

    通过default,TensorBoard 为127.0.0.1 上的请求提供服务,只有在同一台机器上运行的进程才能访问该请求。如果您使用--host 0.0.0.0 启动 TensorBoard,它还将为远程接口上的请求提供服务,因此您应该能够远程连接到它:

    $ tensorboard --logdir ./ --host 0.0.0.0
    

    请注意,“在自定义端口上的浏览器窗口中打开”不会将您连接到 TensorBoard 服务器 - 此选项用于连接到非标准端口上的 SSH 服务器。 Google Cloud Platform docs 包含有关如何从 VM 公开端口的信息。您需要允许 TCP 端口 6006 上的连接才能远程访问您的 VM。您可能还需要通过 instructions here 来从 Docker 容器中公开端口 6006。

    编辑:添加了一些分步说明来帮助您进行 Docker 配置。这里有几个问题,无法判断哪一个失败了。

    1. 在启动 Docker 容器时配置端口转发:

      (vm)$ docker run -p 0.0.0.0:7007:6006 -it b.gcr.io/tensorflow/tensorflow
      

      这会将连接从 VM 上的端口 7007 转发到 Docker 容器中的 6006。 (其他值也是可能的。)

    2. 确保您可以从 Docker 容器内连接到 TensorBoard:

      (container)$ tensorboard --logdir ./ --host 0.0.0.0 --port 6006 &
      (container)$ curl http://localhost:6006/
      

      第二个命令应该打印一些 HTML 到控制台。

    3. 在 VM 上的 shell 中,确保您可以连接到容器中运行的 TensorBoard 实例:

      (vm)$ curl http://localhost:7007/
      

      该命令应将相同的 HTML 打印到控制台。

    4. 配置 Google Cloud 防火墙以允许您的本地客户端连接到 VM 上的端口 7007。

      (client)$ gcloud compute firewall-rules create tensorboard --allow tcp:7007
      

      您现在应该可以在客户端的网络浏览器中连接到 TensorBoard。

    【讨论】:

    • gcloud auth login sudo gcloud components update gcloud compute firewall-rules create firewall_rule --allow tcp:80,tcp:443,tcp:6006 docker images docker run -p 127.0.0.1:$HOSTPORT:$6006 --name ai-unicorn -t XXXXXXXX tensorboard --logdir ./ --host 0.0.0.0 外部 IP 23.251.146.83 内部 IP 10.240.0.3 防火墙 允许 HTTP 流量(未选择) 允许 HTTPS 流量(未选择) ) 退出谷歌云后开始,我这样做:docker run b.gcr.io/tensorflow/tensorflow-fulltensorboard --logdir ./ --host 0.0.0.0 去哪个地址查看 TensorBoard?
    • 我试过这个23.251.146.83:0 并得到“这个地址使用的网络端口通常用于网页浏览以外的目的。Firefox 已取消对您的保护请求。”
    • 在谷歌开发者控制台看防火墙规则 firewall-rule 0.0.0.0/0 tcp:80; tcp:443; tcp:6006 适用于所有目标所以我尝试了23.251.146.83 但它确实 ping ping -c 1 23.251.146.83 PING 23.251.146.83 (23.251.146.83) 56(84) 字节的数据。来自 23.251.146.83 的 64 个字节:icmp_seq=1 ttl=45 time=189 ms --- 23.251.146.83 ping 统计 --- 1 个数据包传输,1 个接收,0% 数据包丢失,时间 0ms rtt min/avg/max/mdev = 189.694/189.694/189.694/0.000 毫秒
    • 我还没有找到如何从服务器显示 Tensorboard。 TensorFlow 提供在端口 6006 上打开的消息,并在外部地址上 ping。应该是 http 还是 https 地址?
    • 我在评论中添加了更多内容 - 很难说出您的配置到底是什么,但请尝试这些步骤,让我知道您卡在哪里。
    【解决方案2】:

    您不必使用 Docker 来显示 TensorBoard。但是,如果您确实想使用 Docker,只需在 Docker 映像中运行 TensorBoard。

    诀窍是允许外部访问默认的 TensorBoard tcp 端口 6006。

    我尝试了以下可行的解决方案来在我的 Google Cloud VM 中显示 TensorBoard。

    1. 确保您通过了 gcloud 身份验证:

      gcloud 认证登录

    2. 允许公共访问 tcp 端口 6006

      gcloud compute firewall-rules create tensorboard-port --allow tcp:6006

    3. 在你的虚拟机上运行 TensorBoard

      张量板 --logdir=workspace/train/

    4. 使用外部 IP 地址访问 VM 外部的 TensorBoard:

      打开地址http://your_vm_externalIP:6006/,

      例如http://104.196.140.145:6006/,其中 104.196.140.145 是我的 VM 的外部 IP 地址。

    【讨论】:

      【解决方案3】:

      另一种选择是使用ngrok 建立隧道。见:Can I use Tensorboard with Google Colab?

      $ from jupyter notebook
      ps = !ps -ax
      is_tensorboard_running = len([f for f in ps if "tensorboard" in f ]) > 0
      
      is_ngrok_running = len([f for f in ps if "ngrok" in f ]) > 0
      print("tensorbord={}, ngrok={}".format(is_tensorboard_running, is_ngrok_running))
      
      if not is_ngrok_running:  
      #    grok should be installed in /content/ngrok
        get_ipython().system_raw('/content/ngrok http 6006 &')
        is_ngrok_running = True
      
      # get public url for tensorboard
      tensorboard_url = !curl -s http://localhost:4040/api/tunnels | python3 -c \
          "import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"    
      print("tensorboard url=", tensorboard_url)
      

      【讨论】:

        猜你喜欢
        • 2016-03-02
        • 1970-01-01
        • 1970-01-01
        • 2017-04-11
        • 1970-01-01
        • 2020-07-17
        • 2019-12-02
        • 2020-05-08
        • 2021-11-27
        相关资源
        最近更新 更多