X11 Forwarding over SSH for remote rendering to client machine

Problem that’s occurring.

I’ve been working with Pyvista for nearly a year now (it’s great), however I’ve noticed some limitations regarding its accessibility over ssh. I posted this issue on their repo and they recommended I reach out to you guys to see if you can provide any help.

I work for a research institute that deals with satellite data, and have been requested to build a product that displays this data in 3D. See here for an example of this. I’ve got this to work locally, however the data is stored on servers and it is largely inefficient to download the data each time you want to view a certain product.

For this reason, it would be amazing if Pyvista could Remotely-Render 3D objects, then transport them via X11 forwarding over SSH to be viewed on a client machine. I’ve got the code to run with a simple GUI, however when it’s time for the object to actually be displayed, I run into this error. I’ve ensured that we have the appropriate libraries installed on both the client and server machines. I also have another version to be displayed on the web, which works locally, but segfaults over a remote machine.

Here is the error:

2023-10-18 16:57:03.167 ( 60.580s) [ CE66B1C0]vtkOpenGLRenderWindow.c:517 ERR| vtkXOpenGLRenderWindow (0x4289710): Unable to find a valid OpenGL 3.2 or later implementation. Please update your video card driver to the latest version. If you are using Mesa please make sure you have version 11.2 or later and make sure your driver in Mesa supports OpenGL 3.2 such as llvmpipe or openswr. If you are on windows and using Microsoft remote desktop note that it only supports OpenGL 3.2 with nvidia quadro cards. You can use other remoting software such as nomachine to avoid this issue.

If anyone knows how to fix this, or if this is just a limitation of PyVista at the moment, any help would be appreciated.

Links to VTK Documentation, Examples, or Class Definitions.

No response

Pseudocode or Screenshots

Here is the error when hosted on the web:

And to prevent your browser from opening, add '--server' to your command line.

App running at:
 - Local:   http://localhost:8080/
 - Network: http://10.2.109.30:8080/

Note that for multi-users you need to use and configure a launcher.
Segmentation fault (core dumped)
1 Like

That looks like a trame app. But for 3D rendering, you don’t want to rely on X over ssh to do it.
A better approach is to have VTK render the data using the server GPU in an offscreen fashion (assuming you have a GPU there). And for that, you need a build of VTK with EGL.

But if you don’t need the rendering to happen on the server side, you can use vtk-osmesa and rely on the VtkLocalRendering of trame to exchange the surface mesh based on your VTK pipeline and filtering to the client.

I guess what I’m saying is that you have options. It depends on what you need or can use.

HTH,

Seb

2 Likes

@evrose54, FYI I have some CMake configurations and scripts to make this easy:

I think I mentioned that trame is probably the most elegant and user-friendly solution to this problem in the original issue: Server Based Rendering to View over X11 Forwarding with SSH · Issue #5105 · pyvista/pyvista · GitHub

@evrose54, are you married to the idea of using X11 forwarding? If not maybe @Sebastien_Jourdain or I could give you some pointers on how to use Trame for this so that the rendering is done server side and streamed to a web browser

Otherwise, maybe someone else more familiar with X11 can chime in

X Forwarding does not work well with OpenGL.

You can instead use nomachine
to run pyvista or other OpenGL applications from a remote computer.
nomachine (free version) is only single user.

An alternative (multi-user) is virtualgl + turbovnc
https://virtualgl.org/vgldoc/2_1_1/

This is guide we did a while back for another vtk based application

https://github.com/CDAT/cdat/wiki/Remote-server-setup-for-VNC

1 Like

Thanks for the response Bane. You really developed a great product! I’m not married to the idea at all. Essentially, I just want be able to host this code on a remote server that has access to the data, and that other scientists in my network can access it and display the data on their local machine to their own liking. If trame is able to do that, I’m more than happy to convert my code to use that instead. I’ll look at that link that you sent and get back to you if I make any progress. Thanks for the help again!

Hey Dan, thanks for the response. I really appreciate it. I’ve played around with no machine and have gotten similar results. Might be a configuration issue however, and I’ll need to talk to the IT people here to get that sorted out. I’ll make sure to check out those links you sent to see if they provide any guidance towards this. Thanks again for your time looking and responding to this issue!

I’ll have the IT people here look into making a build of VTK with EGL. Thanks for your response Sebastian; it’s really appreciated. I’m so close to getting this to work, and this is the last step. Hoping your suggestions fix this problem. I’ll be back once I have some results! Thanks again.

Side note, when I need a VTK/EGL I tend to use the ParaView/EGL runtime with a venv on the side. That skip the need to have to build VTK yourself assuming ParaView is not missing any VTK module that you may rely on.