pyrender icon indicating copy to clipboard operation
pyrender copied to clipboard

Can't select GPU for EGL headless rendering

Open guy4261 opened this issue 5 years ago • 10 comments

TL;DR - how can I select the GPU that the EGL headless rendering runs on? I want to use /dev/nvidia2 but it seems only /dev/nvidia0 is supported.

===

I have two machines in the cloud that are Docker containers of the same image (Ubuntu). When I run the code from the EGL offscreen rendering colab notebook as a Python script, one renders the bottle well, while the other gives me the error below. The working machine has its GPU mounted on /dev/nvidia0 while on the faulty machine it is on /dev/nvidia2.

It seems that egl_display = egl.eglGetDisplay(egl.EGL_DEFAULT_DISPLAY) tries picking on /dev/nvidia0 and fails if it is not available. Since I can't control where will the GPU get mounted on my machine, is there a way to make OpenGL/EGL pick the other device? I tried multiple solutions found around the web, from different environment variables to creating a symlink, but to no avail.

The error:

Traceback (most recent call last):
  File "colab", line 30, in <module>
    r = pyrender.OffscreenRenderer(640, 480)
  File "/miniconda/envs/foo/lib/python3.6/site-packages/pyrender/offscreen.py", line 31, in __init__
    self._create()
  File "/miniconda/envs/foo/lib/python3.6/site-packages/pyrender/offscreen.py", line 134, in _create
    self._platform.init_context()
  File "/miniconda/envs/foo/lib/python3.6/site-packages/pyrender/platforms/egl.py", line 177, in init_context
    assert eglInitialize(self._egl_display, major, minor)
  File "/miniconda/envs/foo/lib/python3.6/site-packages/OpenGL/platform/baseplatform.py", line 402, in __call__
    return self( *args, **named )
  File "/miniconda/envs/foo/lib/python3.6/site-packages/OpenGL/error.py", line 232, in glCheckError
    baseOperation = baseOperation,
OpenGL.error.GLError: GLError(
	err = 12290,
	baseOperation = eglInitialize,
	cArguments = (
		<OpenGL._opaque.EGLDisplay_pointer object at 0x7f7c9f107400>,
		c_long(0),
		c_long(0),
	),
	result = 0
)

guy4261 avatar Dec 09 '19 21:12 guy4261

Does it make sense that if my nvidia device is /dev/nvidia1 or /dev/nvidia2 then it doesn't get picked up as the egl.EGL_DEFAULT_DISPLAY? Is there an environment variable I should set for this case? (Like I'm setting PYOPENGL_PLATFORM=egl before import pyrender?)

guy4261 avatar Dec 12 '19 09:12 guy4261

@guy4261 Hi, I'm meeting the same issue. Have you resolve it? On my machine I indeed have /dev/nvidia0 but still get that error. Are you sure your two machines have the only difference in that /dev/nvidia id?

Guptajakala avatar Jan 07 '20 21:01 Guptajakala

@Guptajakala sorry - 1. I didn't solve this, 2. I do believe that on my machine it's the /dev/nvidiaN issue, perhaps you are experiencing something else I can't help with :(

guy4261 avatar Jan 08 '20 10:01 guy4261

I submitted a PR (https://github.com/mmatl/pyrender/pull/60) a couple months ago that does this.

Just set the environment variable EGL_DEVICE_ID e.g.

export EGL_DEVICE_ID=1
python run.py

keunhong avatar Jan 15 '20 09:01 keunhong

Great @keunhong !!! Thanks!!! Does this mean I should for now build from master rather then install with pip?

guy4261 avatar Jan 15 '20 13:01 guy4261

@guy4261 I dont think you need. Just run export EGL_DEVICE_ID=1 before you run your python file. However, it still doesn't work in my case, maybe my server has some wierd things. Please let me know if it works for you.

Guptajakala avatar Jan 15 '20 14:01 Guptajakala

Great @keunhong !!! Thanks!!! Does this mean I should for now build from master rather then install with pip?

Looks like the commit should be in 0.1.33 so shouldn't be necessary.

keunhong avatar Jan 15 '20 20:01 keunhong

I also had the following issue:

OpenGL.error.GLError: GLError( err = 12290,

It was related to incompatible versions of pyrender and PyOpenGL.

However, is not working for me using headless rendering with EGL. I now have the following error

oarriaga avatar Feb 21 '20 10:02 oarriaga

@oarriaga What was the incompatibility issue and what was eventually the compatible versions that you used?

grgkopanas avatar Mar 17 '21 21:03 grgkopanas

I submitted a PR (#60) a couple months ago that does this.

Just set the environment variable EGL_DEVICE_ID e.g.

export EGL_DEVICE_ID=1
python run.py

How do I do this on Windows 11?

vstadnytskyi-FDA avatar Nov 30 '22 19:11 vstadnytskyi-FDA