Follow-up questions:

- Are your 3D applications purely non-interactive?  That is, is it important for users to be able to interact with or see the output of the applications in real time?  If the answer is "never", then that simplifies the solution.

- Do these applications use GLX?  EGL?  Vulkan?  Do they have X11 GUIs or need to use X11 for anything other than accessing the GPU?


If the applications are sometimes or always interactive, have X11 GUIs, and use GLX or EGL to access a GPU, then ideally you would use TurboVNC with VirtualGL and the VirtualGL EGL back end.  The way that would work is:

1. The user submits a batch job.

2. The job scheduler picks an execution node and a GPU on that node.

3. The job scheduler starts a new TurboVNC session on the execution node.  (Note that some job schedulers require the -fg switch to be passed to /opt/TurboVNC/bin/vncserver in order to prevent TurboVNC from immediately backgrounding itself.)

4. The job scheduler temporarily changes the permissions and ownership for the devices (/dev/dri/card*, /dev/dri/render*, /dev/nvidia*) corresponding to the chosen GPU so that only the submitting user can access the GPU.

5. The job scheduler executes the 3D application with DISPLAY pointed to the newly-created TurboVNC session and VGL_DISPLAY pointed to the chosen GPU's DRI device.

There are multiple ways in which TurboVNC sessions can be managed:

- Some sites use custom web portals that create a new TurboVNC session through a job scheduler; populate a VNC "connection info" file with the TurboVNC session's hostname, display number, and one-time password; and download the connection info file to the user's browser, where it can be opened with the TurboVNC Viewer. Re-connecting to the TurboVNC session involves much the same process, except that the job scheduler simply generates a new OTP for the existing session rather than starting a new session.

- Some sites do basically the same thing without the web portal. In that case, the job scheduler prints the hostname and display number of the newly-created TurboVNC session, and users are required to enter that information into the TurboVNC Viewer manually and authenticate with the TurboVNC session using an authentication mechanism of the SysAdmin's choosing.  (TurboVNC supports static VNC passwords, Unix login credentials or any other PAM-based authentication mechanism, one-time passwords, time-based one-time passwords, X.509 certificates, and SSH, and SysAdmins can force a particular authentication and encryption mechanism to be used on a system-wide basis.)

- If the users have direct SSH access to the execution nodes, then they could also use the TurboVNC Session Manager, which handles authentication, encryption, and session management through SSH.  (In that case, a user would only need to know the hostname of the execution node on which their session is running.)

Potential wrinkles:

- The VirtualGL EGL back end generally works fine with straightforward OpenGL applications, but there are a couple of esoteric application behaviors (generally related to complex X11/OpenGL interactions) that still trip it up.  You would need to test your applications and make sure that they all work properly with the EGL back end before declaring that a 3D X server will never be necessary.

-If you are dealing with multi-GPU applications that expect to be able to directly connect to separate GPU-attached X servers/screens in order to access GPUs for the secondary rendering processes (e.g. ParaView "back in the days" before it supported EGL), then that complicates things.  It should still be possible to use VirtualGL as a GLX-to-EGL translator in that case.  It would just require special values of the VGL_DISPLAY and VGL_READBACK environment variables to be set for each rendering process.


If the 3D applications are purely non-interactive, then you wouldn't necessarily need VirtualGL.  VirtualGL is basically only useful for displaying to a remote system, because the two most common Un*x remote display use cases are:  (1) remote X11 (client-side physical X display), in which case you need VirtualGL in order to avoid sending OpenGL primitives and data over the network, and (2) an X proxy (server-side virtual X display), in which case you need VirtualGL because X proxies lack GPU acceleration.  You generally only need VGL if a 3D application is displaying something that a user needs to see or interact with in real time.  However, you could still use VirtualGL as a GLX-to-EGL translator if your non-interactive 3D applications use GLX to access a GPU.  If the non-interactive 3D application needs an X server for some purpose, such as creating a dummy window or a Pixmap, then you could start an Xvfb instance instead of TurboVNC, since the user would never need to see or interact with the application's output in real time.


tl;dr: I don't actually know how to start independent 3D X servers using a job scheduler, and I'm not sure if starting GPU-attached Xorg instances under non-root accounts is even possible.  (Someone else please correct me if I'm wrong.)  Sites that use job schedulers and need to use the VirtualGL GLX back end will typically run a full-time 3D X server with a dedicated screen for each GPU.  In that case, everything I said above applies, except that you would point VGL_DISPLAY to the GPU's screen rather than its DRI device.  The full-time 3D X server shouldn't use any GPU compute resources when it is idle, but it will use some GPU memory (not a lot, though-- like 32-64 MB if the GPU is configured for headless operation.)  However, the security situation is less palatable, since nothing would technically prevent another user from pointing VGL_DISPLAY to a screen attached to a GPU that has been allocated for another user.  I really think that the EGL back end is your best bet, if you can make it work.

DRC

On 9/21/22 1:37 PM, Doug O'Neal wrote:

The cluster has nodes containing 3-8 nvidia GPUs each with slurm as the scheduler. The gpus are used mainly for AI and image processing. Display to a remote system is a secondary use. requirements will include

  * Only the user submitting the batch job has access to the gpu and
    the user has access only to the gpu(s) allocated through the batch
    system.
  * Ideal situation is for Xorg or an equivalent daemon to be started
    when the batch job starts and is killed when the job exits. Daemon
    should run as the user, possibly with /dev/nvidia? owned by the
    user. A chown can be included in the slurm prolog script.
  * If Xorg has to be running continuously, it should not take
    resources (gpu system time or memory) away from the non-display
    jobs when they have the gpu allocated. Do we need one daemon per
    gpu and how to we restrict access based on slurm resource requests?
  * More minor but still a problem. Running Xorg headless still blocks
    access to the virtual consoles using HPE servers and iLO to connect


--
You received this message because you are subscribed to the Google Groups "VirtualGL 
User Discussion/Support" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/virtualgl-users/fbd6771f-df33-7960-47ab-468086fcf144%40virtualgl.org.

Reply via email to