Wie kann ich die Lüftergeschwindigkeit der NVIDIA-GPU auf einem Headless-Knoten anpassen?

Wie kann ich die Lüftergeschwindigkeit der NVIDIA-GPU auf einem Headless-Knoten anpassen?

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.confund 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 BusIDFelder. 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.conffü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 BusIDmüssen mit den Bus-IDs übereinstimmen, die wir im vorherigen Schritt ermittelt haben. Die Option AllowEmptyInitialConfigurationermöglicht den Start von X, auch wenn kein Monitor angeschlossen ist. Die Option Coolbitsermö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.confund 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-smiund nvtopkann 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 150um den Stromverbrauch zu begrenzen und die Karten kühl zu halten, oder verwenden, sudo nvidia-smi -pl 300um 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 -qoder 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

Ich habe ein Pip-installierbares Python-Skript geschrieben, um etwas Ähnliches wie den Vorschlag von @AlexsandrDubinsky zu tun.

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

verwandte Informationen