EC2 GPU实例上的多进程无头OpenGL处理



我的核心问题是我需要在EC2 GPU实例上同时运行多个OpenGL可执行文件;在尝试这样做的时候,我观察到了不确定的segfault。同样的程序在我的Macbook Pro上运行良好(并发)。

该应用程序的工作原理如下:

  • python脚本启动多个工作可执行文件(即来自multiprocessing.pool.ThreadPool线程池的并发subprocess.call()调用)。python脚本提供一个JSON文件作为工作人员输入,工作人员将JSON写入文件
  • 每个工作程序都是一个C++程序,它使用片段着色器和渲染到纹理管道在OpenGL中进行一些无头图像渲染。我已经尝试过使用Glut和GLX渲染上下文

我相信python脚本和C++工作程序都没有重大错误,因为整个应用程序在以下情况下运行良好:

  • 在EC2 GPU实例上运行单个工作程序
  • 在我的Macbook上运行一个或多个工人(OSX 10.7.4)

我观察到的具体错误是,一个或多个工作程序在执行几分钟后会在OpenGL调用(例如glTexSubImage2DglDrawElements等)内发生segfault。有时我会在GLX上下文设置阶段看到失败(例如glXCreateNewContextglXChooseFBConfig)。如果我启动更多的工作程序(即更高的并发性),我会更快地看到错误。如果我开始减少工人数量,可能需要15-30分钟才能崩溃。

我相信我遇到了某种OpenGL上下文或驱动程序问题。我尝试过使用GLUT和GLX来设置上下文,但似乎都没有帮助。

我创建EC2实例的过程非常接近这里给出的说明:http://hpc.nomad-labs.com/archives/139。我安装的特定软件包是:

sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libegl1-mesa libglu1-mesa-dev mesa-utils mesa-utils-extra llvm-dev imagemagick libboost-all-dev python2.6 python-imaging python-matplotlib python-numpy python-scipy firefox clang python-setuptools python-scipy libatlas-dev ccache libpng12-dev libmagick++-dev glew-utils xvfb x11-utils qiv xinit

在OSX和Linux上,C++工作程序链接:GL GLU glut pthread m X11

我使用生成了xorg.conf

$ nvidia-xconfig -a --use-display-device=None --virtual=1280x1024

在运行我的程序之前,我运行:

$ startx &; export DISPLAY=:0

我试过一些非nvidia的驱动程序,但它们似乎也没有帮助。

我还查阅了有关OpenGL并行处理的常见问题解答:http://www.equalizergraphics.com/documentation/parallelOpenGLFAQ.html该指南建议Ubuntu上的多线程GLX不起作用(我个人已经证实了这一点…:),但似乎多进程GLX应该是可行和稳定的。

有人对有什么想法吗

  • 为什么OpenGL/GLX调用可能失败?我真的看到了司机的问题吗?Mac GPU驱动程序似乎有某种"神奇功能",有助于OpenGL的并发使用。有没有Ubuntu/Linux驱动程序具有相同的功能
  • 有没有在EC2 GPU实例(或任何无头Ubuntu/Linux机器)上同时运行多个OpenGL可执行文件的最佳实践?有人能给我指一下能做到这一点的开源软件吗

。。1年后。。

我发现很多时候gpu不会在无头机器上启用。先尝试vnc,看看这是否有帮助。

最新更新