GPUs in Servern ohne Monitor nutzen

Diesen Beitrag schrieb ich 9 Jahre und 11 Monate zuvor; die nachfolgenden Ausführungen müssen heute nicht unbedingt noch genau so funktionieren. Behalte das beim Lesen (und vor allem: beim Nachmachen!) bitte stets im Hinterkopf.

Geschätzte Lesezeit: 2 Minuten

Hier ist mal wieder ein alter Artikel, den ich jetzt erst zu Ende schreiben konnte…

Zur Problemstellung: es handelt sich um ein Cluster aus 20 Maschinen und 40 GPUs (2 Nvidia GTX 470 pro Maschine); die onBoard-Grafik ist mit der Konsole verbunden, an den GTXen hängt gar nichts, also kein Monitor. Die GPU-Power soll aber voll genutzt werden – was über SSH nicht möglich ist… Um sie zu nutzen sind wir den folgenden Umweg gegangen:

1. Schritt: auf allen 20 Maschinen den X-Server ans Laufen bringen

  • die aktuellen Nvidia-Treiber herunterladen und installieren (zu jenem Zeitpunkt 260.19.44) → initiale Konfig wird erstellt (/etc/X11/XF86Config)
  • Abhängigkeiten installieren: xserver-xorg x11-xserver-utils gdm
  • Nun die BusID der Grafikkarten herausfinden:
$ lspci | grep VGA
01:00.0 VGA compatible controller: ASPEED Technology, Inc. ASPEED Graphics Family (rev 10)
08:00.0 VGA compatible controller: nVidia Corporation Device 06cd (rev a3)
82:00.0 VGA compatible controller: nVidia Corporation Device 06cd (rev a3)

2. Schritt: /etc/X11/XF86Config überarbeiten

Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0" 0 0
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
EndSection

Section "Files"
EndSection

Section "Module"
    Load           "dbe"
    Load           "extmod"
    Load           "type1"
    Load           "freetype"
    Load           "glx"
EndSection

Section "InputDevice"

    # generated from default
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/psaux"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"

    # generated from default
    Identifier     "Keyboard0"
    Driver         "keyboard"
EndSection

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    Option 		"ConnectedMonitor" "CRT"
    BusID		"8:0:0"
EndSection

Section "Device"
    Identifier     "Device1"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    Option 		"ConnectedMonitor" "CRT"
    BusID		"82:0:0"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    DefaultDepth    24
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection

Section "Screen"
    Identifier     "Screen1"
    Device         "Device1"
    DefaultDepth    24
    SubSection     "Display"
        Depth       24
    EndSubSection
EndSection

3. Schritt: Konfiguration testen

$ X -config /etc/X11/XF86Config

Hier Output und Logfiles gucken, eventuelle Fehler beheben; „no screen found“ darf jetzt nicht mehr kommen!

4. Schritt: User „window“ anlegen

$ useradd -m window

5. Schritt: User „window“ soll automatisch eingeloggt werden

## file: "/etc/gdm/custom.conf" 
[daemon]
TimedLoginEnable=false
AutomaticLoginEnable=true
TimedLogin=window
AutomaticLogin=window
TimedLoginDelay=30
DefaultSession=gnome

Das lässt sich dann auch prüfen, nach Reboot:

$ w
 13:17:26 up 32 min,  3 users,  load average: 0.76, 0.73, 0.52
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
window   tty7     :0               12:45   31:57   3.79s  0.05s gnome-session

Nächster Schritt: der window-User macht xhost + – somit erlaubt er allen Hosts, sich zu verbinden. Im Anschluss daran macht User meh ein export DISPLAY=:0.0 und startet dann seine X-Programme → diese Programme werden im X-Kontext des User window ausgeführt

Beispiel: glxgears aufrufen, und zwar am besten einmal ohne die eben erklärte Konfiguration und einmal mit. Anhand der unterschiedlichen Zahlen ist sehr deutlich zu sehen, wann die GPU wirklich genutzt wird und wann nicht. .xprofile anlegen (wird beim Automatischen EInloggen des Users in Gnome dann ausgewertet):

#!/bin/sh
#
# ~/.xprofile
#
# Executed by gdm at login
#
export DISPLAY=:0.0
xhost +

Die Grundidee ist nun, denke ich, einigermaßen klar; natürlich kann (und sollte) das Setup noch eingehend verfeinert und erweitert werden – die Möglichkeiten sind vielfältig.