【问题标题】:How to run py-faster-rcnn with X11 forwarding如何使用 X11 转发运行 py-faster-rcnn
【发布时间】:2016-10-06 09:32:36
【问题描述】:

我正在使用 Ubuntu 14.04 操作系统的 g2.8xlarge EC-2 实例上运行启用了 cuDNN 的 py-faster-rcnn。一切都已编译,似乎工作正常。我通过以下方式登录远程实例:

ssh -X -i "<key.pem>" ubuntu@<IP address>

我也输入命令:export DISPLAY=:0

运行./tools/demo.py 输出看起来不错:

Loaded network /home/ubuntu/py-faster-rcnn/data/faster_rcnn_models/VGG16_faster_rcnn_final.caffemodel
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo for data/demo/000456.jpg
Detection took 0.543s for 300 object proposals 
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo for data/demo/000542.jpg
Detection took 0.506s for 161 object proposals
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo for data/demo/001150.jpg
Detection took 0.507s for 194 object proposals
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo for data/demo/001763.jpg
Detection took 0.507s for 196 object proposals
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Demo for data/demo/004545.jpg
Detection took 0.541s for 300 object proposals

但图形输出没有在我的 XQuartz 窗口中呈现。

其他人解决了这个问题吗?需要弄清楚如何使用 AWS 硬件但具有本地可视化功能。在这里检查,但我无法解决我的问题:BVLC/caffe#861

编辑

这里是我的远程sshd_config 和本地ssh_config 文件的链接。

以下是远程 AWS 服务器环境中请求的测试结果:

$ echo $DISPLAY 
localhost:10.0

$ DISPLAY=localhost:10.0 xhost && echo success
access control enabled, only authorized clients can connect
success

更新

应用上述步骤后,在远程机器上运行命令xeyesxcalc 会在本地客户端上产生预期的输出(首先是眼睛,其次是计算器)。这可能是一个python问题。打算开始找那里。

解决方案——更新 Python 库

在回复这篇文章的人的指导下验证我的系统设置为支持 X11 转发后,我专注于在 python 中运行一系列测试,看看matplotlib 是否与 X11 兼容。您可以通过运行this script interactively 自行检查。如果xcalcxeyes 按预期工作,但此脚本产生错误,则问题出在python/matplotlib

我已经解决了这个问题,所以我手头没有这个产生的错误,但是在 Ubuntu 14.04、g2.8xlarge EC2 上修复的步骤如下:

  • 安装python gobject:sudo apt-get install python-gobject-dev
  • 安装python-tk:sudo apt-get install python-tk
  • 安装 pygtk:
    • wget http://ftp.gnome.org/pub/GNOME/sources/pygtk/2.24/pygtk-2.24.0.tar.gz
    • tar -xvzf pygtk-2.24.0.tar.gz
    • cd pygtk-2.24.0
    • ./configure
    • make
    • sudo make install
    • cd
  • 如果 matplotlib 是使用包管理器安装的,例如pip,卸载它并从源重新安装:
    • sudo pip uninstall matplotlib
    • git clone https://github.com/matplotlib/matplotlib.git
    • cd matplotlib
    • sudo python setup.py install
    • cd
  • 不确定这是否有必要,但运行 sudo apt-get install xorg openbox 以获得良好的效果。

经过上述步骤后,python ./tools/demo.pypy-faster-rcnn 根目录返回边界框和类概率的图像,如预期的那样。

【问题讨论】:

  • 啊伙计,这是一个令人讨厌的错字。除了语法不正确之外,它还缺少一个单词——图形输出not 在 X11 窗口中呈现。所以终端进程运行良好,但生成的 matplotlib 图都没有出现在 X11 中。我在以前的安装中成功运行了它。不知道这次发生了什么变化。现在任何地方都没有图形输出。
  • xhost 测试表明X没问题。在您的语言环境 Xserver 和在远程接口上运行的 x 客户端之间建立了通信。如果您尝试xeyesxcalc,会打开一个窗口对吗?
  • 没有错误信息,所以问题可能出在其他地方。也许 demo.py 在编译时或运行时需要 exta 选项?当然我们也可能会错过一些东西...希望其他人可以在这里提供帮助...
  • 好看——当我在终端输入xcalc 时,我确实在本地获得了计算器 GUI。这表明这与 demo.py 有关,不是吗?
  • 回答已接受,感谢您的帮助!如果您对这件事的 python 部分有任何提示,我会欢迎,但我会继续自己研究。

标签: ssh x11 caffe pycaffe


【解决方案1】:

我假设你的本地主机上运行着 X 服务器,对吧?

有 2 个文件需要考虑:

  • /etc/ssh/ssh_config:它位于你的本地主机上;它与客户端命令一起使用:ssh
  • /etc/ssh/sshd_config:位于远程实例上;它与远程实例上运行的sshd 服务器一起使用。

X11Forwarding yesX11DisplayOffset 10 是需要为sshd 设置的两个值:远程实例上运行的ssh 守护进程。编辑远程实例上的 /etc/ssh/sshd_config 文件。更改后,可能必须在远程实例上重新启动 sshd

再次与ssh -X ... 连接,并检查DISPLAY 变量的值。 下面的例子在设置X11DisplayOffset 10时是正确的:

# ssh -X -i "<key.pem>" ubuntu@<IP address>
# echo $DISPLAY
localhost:10.0

如果DISPLAY 变量未设置或设置为另一个值(.bashrc .profile 等中的某些内容在登录时更改了其值),那么这是一个问题。

另一种方法是用xhost测试,在同一行设置环境:

# ssh -X -i "<key.pem>" ubuntu@<IP address>
# DISPLAY=localhost:10.0 xhost && echo success

如果显示错误消息,这是一个需要解决的问题:编辑您的问题并添加错误消息。 否则,将打印状态行和 success 字,继​​续:

# DISPLAY=localhost:10.0 xcalc

应该在本地主机上打开一个窗口。最后继续:

# DISPLAY=localhost:10.0 ./tools/demo.py

【讨论】:

  • 更新了我的答案以包含您推荐的测试结果,以及指向我的远程和本地配置文件的链接。根据@Kenster 的建议,我将选项ExitOnForwardFailure 添加到我的位置ssh_config。一切看起来都不错,对吧?但是,当我运行您建议的行 DISPLAY=localhost:10.0 xhost &amp;&amp; echo success 时,在本地桌面上打开的 X11 应用程序中仍然没有得到图形输出。
  • xhost 与本地主机上的 Xserver 通信,但它没有图形界面。将其替换为 xeyesxcalc
【解决方案2】:

我也输入命令:export DISPLAY=:0

这一步可能是您的问题。当您通过 SSH 转发 X 时,几乎不需要在远程系统上手动设置 DISPLAY。

如果 ssh 成功转发 X,它会将远程会话中的 DISPLAY 环境变量设置为正确的值。如果远程系统上未设置 DISPLAY,则意味着 ssh 无法与服务器协商转发 X(或者您的 shell 启动中的某些内容正在删除该变量)。通过自己设置 DISPLAY,您可能会覆盖变量的正确值。至少,您设置的值对于通过 SSH 转发来说不太可能是正确的。

DISPLAY 值“:0”表示通过系统的 X 默认值进行连接,这可能涉及通过 unix 域套接字或 TCP 端口 6000 进行连接。这是为了让客户端访问运行在同一系统上的 X 服务器作为客户端(本例中为 EC2 服务器)。

对于 SSH 会话,正确的 DISPLAY 值通常类似于“localhost:10”,这意味着远程系统上的客户端应连接到 localhost 端口 6010 (6000 + 10)。如果端口 6010 已被使用或 SSH 服务器配置为使用不同的端口范围,则数字 10 可能不同。

如果您在使用“-X”或“-Y”选项运行 ssh 的情况下登录时发现未设置 DISPLAY,则可能是 ssh 服务器中禁用了 X11 转发。 OpenSSH 服务器有三个相关的选项,可以是set in sshd_config

X11DisplayOffset
指定可用于 sshd(8) 的 X11 转发的第一个显示编号。这可以防止 sshd 干扰真正​​的 X11 服务器。默认值为 10。

X11转发
指定是否允许 X11 转发。论据必须是“是”或“否”。默认为“否”。

启用 X11 转发后,如果 sshd(8) 代理显示配置为侦听通配符地址(请参阅下面的 X11UseLocalhost),则服务器和客户端显示可能会额外暴露,尽管这不是默认设置。此外,身份验证欺骗和身份验证数据验证和替换发生在客户端。使用 X11 转发的安全风险是当 SSH 客户端请求转发时,客户端的 X11 显示服务器可能会受到攻击(参见 ssh_config(5) 中的 ForwardX11 警告)。系统管理员可能有这样一种立场,即他们希望保护可能通过无意请求 X11 转发而使自己受到攻击的客户端,这可以保证设置为“否”。

请注意,禁用 X11 转发不会阻止用户转发 X11 流量,因为用户始终可以安装自己的转发器。如果启用 UseLogin,X11 转发将自动禁用。

X11UseLocalhost
指定 sshd(8) 是否应该将 X11 转发服务器绑定到环回地址或通配符地址。默认情况下,sshd 将转发服务器绑定到环回地址,并将 DISPLAY 环境变量的主机名部分设置为“localhost”。这可以防止远程主机连接到代理显示器。但是,某些较旧的 X11 客户端可能无法在此配置下运行。 X11UseLocalhost 可以设置为“no”来指定转发服务器应该绑定到通配符地址。论据必须是“是”或“否”。默认为“是”。

即使服务器拒绝转发,OpenSSH ssh 客户端也会正常连接到服务器。这可以隐藏您请求转发但服务器拒绝的事实。 ssh 有一个选项,您可以通过 set in ssh_config 来控制它:

ExitOnForwardFailure
指定如果 ssh(1) 无法设置所有请求的动态、隧道、本地和远程端口转发(例如,如果任一端无法绑定和侦听指定端口),是否应终止连接。请注意,ExitOnForwardFailure 不适用于通过端口转发建立的连接,例如,如果与最终转发目标的 TCP 连接失败,则不会导致 ssh(1) 退出。论据必须是“是”或“否”。默认为“否”。

【讨论】:

  • 感谢您提供的信息。因此,我将在不启用 export DISPLAY 命令的情况下重新运行它。我还编辑了我的 ssh_config,为与 X11 和远程转发相关的所有选项设置了 yes。现在,当我 ssh 进入我的亚马逊实例时,默认情况下会调用 Xquartz,无论我是否添加了 -X 命令。这可能与问题有关吗?将根据您的建议尝试一些修复,并告诉您进展如何。
  • X11Forwarding yesX11DisplayOffset 10 是需要为sshd 设置的两个值:远程实例上运行的ssh 守护进程。编辑远程实例上的/etc/ssh/sshd_config 文件。更改后,可能必须在远程实例上重新启动 sshd。使用始终可用的xeyes 测试新配置。
  • @Kenster:请参阅上面我对@Jay jargot 的回复。根据您的回答,我不再使用export DISPLAY=:0
猜你喜欢
  • 1970-01-01
  • 2016-09-23
  • 2018-11-24
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 2020-12-24
  • 1970-01-01
  • 2018-06-14
相关资源
最近更新 更多