Remote-Offscreen-Rendering

10

Mein Forschungslabor hat kürzlich einen Server mit einer leistungsstarken NVIDIA-Grafikkarte hinzugefügt, mit der wir wissenschaftliche Berechnungen durchführen möchten. Da es sich nicht um eine Workstation handelt, müssen wir unsere Jobs über eine SSH-Verbindung remote ausführen. Die meisten unserer Anwendungen erfordern OpenGL-Rendering in einem Offscreen-Puffer und anschließend eine Bildanalyse des Ergebnisses in CUDA.

Meine erste Untersuchung ergab, dass die X11-Weiterleitung eine schlechte Idee ist, da das OpenGL-Rendering auf dem Client-Computer (oder besser gesagt auf dem X11-Server - was für eine verwirrende Namenskonvention!) Stattfindet und beim Senden unserer massiven Texturen unter Netzwerktengpässen leidet. Wir werden die Ausgabe niemals anzeigen müssen, daher scheint es, dass eine X11-Weiterleitung nicht erforderlich sein sollte, aber Opengl benötigt das $ DISPLAY, um auf etwas Gültiges gesetzt zu werden, oder unsere Anwendungen werden nicht ausgeführt. Ich bin sicher, dass es Renderfarmen gibt, die dies tun, aber wie wird dies erreicht? Ich denke, dies ist wahrscheinlich ein einfaches X11-Konfigurationsproblem, aber ich bin damit nicht vertraut, um zu wissen, wo ich anfangen soll.

Wir verwenden Ubuntu Server 10.04, ohne dass GDM, Gnome usw. installiert sind. Das xserver-xorg-Paket ist jedoch installiert.

Redmoskito
quelle
Ich würde versuchen, <code> x11vnc </ code>, aber es ist eher unwahrscheinlich, dass es funktioniert
Hubert Kario

Antworten:

6

Es ist schon eine Weile her, dass ich diese Frage gestellt habe, also dachte ich, ich würde die Lösung erwähnen, die wir letztendlich verwendet haben.

Entführung des lokalen X-Bildschirms

Am Ende habe ich nur die Remote-OpenGL-Programme auf dem lokalen X-Bildschirm des Servers ausgeführt. Auf dem Computer wurde die Ubuntu-Server-Edition ausgeführt, und es wurde standardmäßig kein xserver ausgeführt. Daher musste ich beim Start einen xserver einrichten (ich habe gerade Ubuntus Ubuntu-Desktop-Paket installiert und eine Mücke mit einem Vorschlaghammer getötet) gab mir Zugriff auf den X-Bildschirm mit diesen Befehlen als root: "export DISPLAY =: 0.0; xhost + local:". Dann könnte ich ssh in die Maschine, "export DISPLAY =: 0.0" aufrufen und dann meine opengl-Programme wie gewohnt ausführen. Jeder, der am Remote-Computer sitzt, sieht ein Fenster und sieht, wie mein Programm ausgeführt wird. Wir haben jedoch keinen Monitor angeschlossen, sodass dies kein Problem darstellt.

Es ist wichtig, eine Form des Offscreen-Renderns zu verwenden, da das Lesen von Pixeln direkt aus dem Bildschirmfarbpuffer zu Mülldaten führen kann, wenn das Fenster durch ein anderes Fenster verdeckt wird. Da Sie den X-Bildschirm nicht sehen können, ist es schwierig zu wissen, ob dies geschehen ist. Offscreen-Rendering (z. B. Framebuffer-Objekte (fbo) oder pbuffer) hat dieses Problem nicht.

Die Entführung des lokalen Xscreen des Servers ist keine ideale Lösung. Hier sind einige Alternativen, die ich auf dem Weg gefunden habe:

Virtuelle Framebuffer

Xvfb ist eine Option, aber es hat bei mir nicht funktioniert, da OpenGL nicht von der Hardwarebeschleunigung profitierte und Framebuffer-Objekte nicht unterstützt wurden, die für die CUDA-Interoperabilität mit OpenGL erforderlich sind. Dies kann jedoch eine praktikable Option sein, wenn die Entführung des lokalen Bildschirms nicht akzeptabel ist oder wenn Benutzer keine xhost-Berechtigungen erhalten können.

VirtualGL

Von der VirtualGL-Website:

VirtualGL ist ein Open Source-Paket, mit dem jede Unix- oder Linux-Remote-Display-Software OpenGL-Anwendungen mit vollständiger 3D-Hardwarebeschleunigung ausführen kann.

Dies ist genau das, was ich will, und es sieht sehr vielversprechend aus, aber ich hatte keine Zeit, mich mit einer neuen Bibliotheksabhängigkeit zu befassen, also habe ich sie nicht getestet. Ich vermute, dass dies die ideale Lösung ist, sobald ich sie kompilieren, installieren und konfigurieren kann. Dies ist, was VirtualBox und einige VNC-Server verwenden, um hardwarebeschleunigtes 3D zu unterstützen.

Redmoskito
quelle
0

Sie können einen virtuellen vfb-Frame-Puffer auf dem Computer ausführen, der einem Dummy X11 ähnelt. Früher haben wir Apps ausgeführt, die ein Xwindow öffnen mussten, das wir uns nie angesehen haben, und nur vfb installiert und $ DISPLAY darauf exportiert - ein bisschen wie ein Bildschirm auf dem cli HTH

Chris
quelle
2
Danke für den Tipp! Ich habe angefangen, mich mit xvfb zu beschäftigen, und es sieht so aus, als würde beim Rendern keine Grafikhardware verwendet, sondern in den virtuellen Speicher gerendert. Kann jemand dies bestätigen / leugnen? In diesem Fall ist diese Lösung meiner Meinung nach nicht gut, da wir die Leistung unserer Grafikkarte nutzen möchten.
Redmoskito