Wie ist es möglich, die Lüftergeschwindigkeit mehrerer NVIDIA-GPUs für Verbraucher wie Titan und 1080 Ti auf einem Headless-Knoten mit Linux zu steuern?
Antwort1
Das Folgende ist eine einfache Methode, die kein Skripting, den Anschluss von Fake-Monitoren oder Fummelei erfordert und über SSH ausgeführt werden kann, um die Lüfter mehrerer NVIDIA-GPUs zu steuern. Sie wurde unter Arch Linux getestet.
Erstellen Sie xorg.conf
sudo nvidia-xconfig --allow-empty-initial-configuration --enable-all-gpus --cool-bits=7
Dadurch wird /etc/X11/xorg.conf
, ähnlich der manuellen Methode, für jede GPU ein Eintrag erstellt.
Notiz:Einige Distributionen (Fedora, CentOS, Manjaro) haben zusätzliche Konfigurationsdateien (z. B. in /etc/X11/xorg.conf.d/
oder /usr/share/X11/xorg.conf.d/
), die überschreiben xorg.conf
und festlegen AllowNVIDIAGPUScreens
. Diese Option ist mit dieser Anleitung nicht kompatibel. Die zusätzlichen Konfigurationsdateien sollten geändert oder gelöscht werden. Die X11-Protokolldatei zeigt, welche Konfigurationsdateien geladen wurden.
Alternative: xorg.conf manuell erstellen
Identifizieren Sie die PCI-IDs Ihrer Karten:
nvidia-xconfig --query-gpu-info
Suchen Sie die PCI BusID
Felder. Beachten Sie, dass diese nicht mit den im Kernel gemeldeten Bus-IDs identisch sind.
Alternativ können Sie auch ausführen sudo startx
, öffnen /var/log/Xorg.0.log
(oder den Speicherort, den startX in seiner Ausgabe unter der Zeile „Protokolldatei:“ auflistet) und nach der Zeile suchen NVIDIA(0): Valid display device(s) on GPU-<GPU number> at PCI:<PCI ID>
.
Bearbeiten/etc/X11/xorg.conf
Hier ist ein Beispiel xorg.conf
für eine Maschine mit drei GPUs:
Section "ServerLayout"
Identifier "dual"
Screen 0 "Screen0"
Screen 1 "Screen1" RightOf "Screen0"
Screen 1 "Screen2" RightOf "Screen1"
EndSection
Section "Device"
Identifier "Device0"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BusID "PCI:5:0:0"
Option "Coolbits" "7"
Option "AllowEmptyInitialConfiguration"
EndSection
Section "Device"
Identifier "Device1"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BusID "PCI:6:0:0"
Option "Coolbits" "7"
Option "AllowEmptyInitialConfiguration"
EndSection
Section "Device"
Identifier "Device2"
Driver "nvidia"
VendorName "NVIDIA Corporation"
BusID "PCI:9:0:0"
Option "Coolbits" "7"
Option "AllowEmptyInitialConfiguration"
EndSection
Section "Screen"
Identifier "Screen0"
Device "Device0"
EndSection
Section "Screen"
Identifier "Screen1"
Device "Device1"
EndSection
Section "Screen"
Identifier "Screen2"
Device "Device2"
EndSection
Die BusID
müssen mit den Bus-IDs übereinstimmen, die wir im vorherigen Schritt ermittelt haben. Die Option AllowEmptyInitialConfiguration
ermöglicht den Start von X, auch wenn kein Monitor angeschlossen ist. Die Option Coolbits
ermöglicht die Steuerung von Lüftern. Sie kann auch Übertaktung ermöglichen.
Notiz:Einige Distributionen (Fedora, CentOS, Manjaro) haben zusätzliche Konfigurationsdateien (z. B. in /etc/X11/xorg.conf.d/
oder /usr/share/X11/xorg.conf.d/
), die überschreiben xorg.conf
und festlegen AllowNVIDIAGPUScreens
. Diese Option ist mit dieser Anleitung nicht kompatibel. Die zusätzlichen Konfigurationsdateien sollten geändert oder gelöscht werden. Die X11-Protokolldatei zeigt, welche Konfigurationsdateien geladen wurden.
Bearbeiten/root/.xinitrc
nvidia-settings -q fans
nvidia-settings -a [gpu:0]/GPUFanControlState=1 -a [fan:0]/GPUTargetFanSpeed=75
nvidia-settings -a [gpu:1]/GPUFanControlState=1 -a [fan:1]/GPUTargetFanSpeed=75
nvidia-settings -a [gpu:2]/GPUFanControlState=1 -a [fan:2]/GPUTargetFanSpeed=75
Ich verwende der Einfachheit halber .xinitrc, um nvidia-settings auszuführen, obwohl es wahrscheinlich auch andere Möglichkeiten gibt. Die erste Zeile gibt alle GPU-Lüfter im System aus. Hier habe ich die Lüfter auf 75 % eingestellt.
Starten Sie X
sudo startx -- :0
Sie können diesen Befehl von SSH aus ausführen. Die Ausgabe lautet:
Current version of pixman: 0.34.0
Before reporting problems, check http://wiki.x.org
to make sure that you have the latest version.
Markers: (--) probed, (**) from config file, (==) default setting,
(++) from command line, (!!) notice, (II) informational,
(WW) warning, (EE) error, (NI) not implemented, (??) unknown.
(==) Log file: "/var/log/Xorg.0.log", Time: Sat May 27 02:22:08 2017
(==) Using config file: "/etc/X11/xorg.conf"
(==) Using system config directory "/usr/share/X11/xorg.conf.d"
Attribute 'GPUFanControlState' (pushistik:0[gpu:0]) assigned value 1.
Attribute 'GPUTargetFanSpeed' (pushistik:0[fan:0]) assigned value 75.
Attribute 'GPUFanControlState' (pushistik:0[gpu:1]) assigned value 1.
Attribute 'GPUTargetFanSpeed' (pushistik:0[fan:1]) assigned value 75.
Attribute 'GPUFanControlState' (pushistik:0[gpu:2]) assigned value 1.
Attribute 'GPUTargetFanSpeed' (pushistik:0[fan:2]) assigned value 75.
Überwachen Sie Temperaturen und Taktraten
nvidia-smi
und nvtop
kann verwendet werden, um Temperaturen und Stromverbrauch zu beobachten. Niedrigere Temperaturen ermöglichen es der Karte, höher zu takten und ihren Stromverbrauch zu erhöhen. Sie können verwenden, sudo nvidia-smi -pl 150
um den Stromverbrauch zu begrenzen und die Karten kühl zu halten, oder verwenden, sudo nvidia-smi -pl 300
um sie übertakten zu lassen. Meine 1080 Ti läuft mit 1480 MHz, wenn sie 150 W erhält, und über 1800 MHz, wenn sie 300 W erhält, aber das hängt von der Arbeitslast ab. Sie können ihre Taktfrequenz mit nvidia-smi -q
oder genauer überwachen,watch 'nvidia-smi -q | grep -E "Utilization| Graphics|Power Draw"'
Zurück zur automatischen Lüftersteuerung.
Neustart. Ich habe keine andere Möglichkeit gefunden, die Lüfter zu automatisieren.
Antwort2
Wenn Sie fans.py ausführen, richtet es für jede GPU einen temporären X-Server mit angeschlossenem Fake-Display ein. Anschließend durchläuft es alle paar Sekunden eine Schleife über die GPUs und stellt die Lüftergeschwindigkeit entsprechend ihrer Temperatur ein. Wenn das Skript beendet wird, gibt es die Steuerung der Lüfter an die Treiber zurück und bereinigt die X-Server.
Antwort3
Basierend auf Antworten auf diese Frage und ähnliche StackExchange-Fragen habe ich ein Shell-Skript geschrieben, das die Lüftergeschwindigkeit 100
(oder einen beliebigen Wert) aufalleIhrer Fans aufalleIhrer GPUs auf einer Maschine.
Dieses Skript geht davon aus, dass auf Ihrem Computer X11 installiert ist, Sie es aber nicht verwenden, um einem Benutzer eine GUI bereitzustellen.
/bin/set-gpu-fan-speed.sh:
#!/bin/bash
set -Eeuxo pipefail
# Kill any existing X servers.
killall Xorg || true
sleep 5
# Create a NVIDIA-friendly Xorg config.
nvidia-xconfig -a --cool-bits=28 --allow-empty-initial-configuration --enable-all-gpus
# Start a new X server for nvidia-settings to use.
export XDG_SESSION_TYPE=x11
export DISPLAY=:0
startx -- $DISPLAY &
sleep 5
# Determine the number of GPUs and fans on this machine.
NUM_GPUS=$(nvidia-settings -q gpus | grep -c 'gpu:')
NUM_FANS=$(nvidia-settings -q fans | grep -c 'fan:')
# For each GPU, enable fan control.
for ((i=0; i < NUM_GPUS; i++))
do
nvidia-settings --verbose=all -a "[gpu:$i]/GPUFanControlState=1"
done
# For each fan, set fan speed to 100%.
for ((i=0; i < NUM_FANS; i++))
do
nvidia-settings --verbose=all -a "[fan:$i]/GPUTargetFanSpeed=100"
done
# Kill the X server that we started.
killall Xorg || true
Diese Änderungen der Lüftergeschwindigkeit bleiben nach Neustarts nicht erhalten, daher habe ich eine systemd-Unit-Datei geschrieben, um das obige Skript bei jedem Start auszuführen.
/etc/systemd/system/set-gpu-fan-speed.service:
[Unit]
Description="Sets the GPU fan speed"
[Service]
Type=oneshot
User=root
ExecStart=/bin/set-gpu-fan-speed.sh
[Install]
WantedBy=multi-user.target
Nachdem Sie die obige Datei erstellt haben, führen Sie die folgenden Befehle als Root aus, um das beim Neustart ausgeführte Skript zu aktivieren.
systemctl enable set-gpu-fan-speed.service
systemctl start set-gpu-fan-speed.service