远程离屏渲染

远程离屏渲染

我的研究实验室最近添加了一台配备强大 NVIDIA 显卡的服务器,我们想用它来进行科学计算。由于它不是工作站,因此我们必须通过 ssh 连接远程运行我们的作业。我们的大多数应用程序都需要对屏幕外缓冲区进行 opengl 渲染,然后在 CUDA 中对结果进行图像分析。

我最初的调查表明,X11 转发不是一个好主意,因为 opengl 渲染将发生在客户端机器上(或者更确切地说是 X11 服务器——多么令人困惑的命名约定!),并且在发送大量纹理时会遭遇网络瓶颈。我们永远不需要显示输出,因此似乎不需要 X11 转发,但 Opengl 需要将 $DISPLAY 设置为有效值,否则我们的应用程序将无法运行。我确信存在可以做到这一点的渲染农场,但它是如何实现的?我认为这可能是一个简单的 X11 配置问题,但我对它太不熟悉了,不知道从哪里开始。

我们运行的是 Ubuntu 服务器 10.04,没有安装 gdm、gnome 等。但是,安装了 xserver-xorg 包。

答案1

我问这个问题已经有一段时间了,所以我想提一下我们最终使用的解决方案。

劫持本地 X 屏幕

最后,我只是在服务器的本地 X 屏幕上运行远程 opengl 程序。该机器运行的是 Ubuntu 服务器版本,默认情况下没有运行 xserver,因此我必须设置一个 xserver 以在启动时运行(我刚刚安装了 Ubuntu 的 ubuntu-desktop 包,用大锤打死了一只蚊子),然后以 root 身份使用以下命令授予自己访问 X 屏幕的权限:“export DISPLAY=:0.0; xhost + local:”。然后我可以 ssh 进入机器,调用“export DISPLAY=:0.0”,然后正常运行我的 opengl 程序。坐在远程机器旁的任何人都会看到一个弹出窗口并观看我的程序的运行,但我们没有连接显示器,所以这不是问题。

使用某种形式的屏幕外渲染非常重要,因为如果窗口被另一个窗口遮挡,直接从屏幕颜色缓冲区读取像素可能会导致垃圾数据。由于您看不到 X 屏幕,因此很难知道是否发生了这种情况。屏幕外渲染(例如 Framebuffer 对象 (fbo) 或 pbuffers)不存在此问题。

劫持服务器的本地 Xscreen 并不是一个理想的解决方案,因此这里是我在此过程中找到的一些替代方法:

虚拟帧缓冲区

Xvfb 是一个选项,但对我来说不起作用,因为 OpenGL 无法从硬件加速中获益,并且不支持帧缓冲区对象,而帧缓冲区对象是 CUDA 与 OpenGL 互操作所必需的。尽管如此,当劫持本地屏幕不可接受或用户无法获得 xhost 权限时,这可能是一个可行的选择。

虚拟GL

来自 VirtualGL 网站:

VirtualGL 是一个开源软件包,它使任何 Unix 或 Linux 远程显示软件能够运行具有完整 3D 硬件加速的 OpenGL 应用程序。

这正是我想要的,而且看起来很有前途,但我没有时间处理新的库依赖项,所以我没有测试它。我猜一旦我可以编译、安装和配置它,这就是理想的解决方案。这是 VirtualBox 和一些 VNC 服务器用来支持硬件加速 3D 的方法。

答案2

您可以在机器上运行 vfb 虚拟帧缓冲区,它就像一个虚拟 X11。我们过去运行的应用程序必须打开一个我们从未查看过的 Xwindow,只需安装 vfb 并将 $DISPLAY 导出到其中 - 有点像 cli HTH 上的屏幕

相关内容