Comment ajuster la vitesse du ventilateur GPU NVIDIA sur un nœud sans tête?

9

Comment contrôler la vitesse du ventilateur de plusieurs GPU NVIDIA grand public tels que Titan et 1080 Ti sur un nœud sans tête exécutant Linux?

Aleksandr Dubinsky
la source

Réponses:

5

Ce qui suit est une méthode simple qui ne nécessite pas de script, de connexion de faux moniteurs ou de violon et peut être exécutée via SSH pour contrôler plusieurs fans de GPU NVIDIA. Il a été testé sur Arch Linux.

Identifiez les ID PCI de vos cartes:

Edit : je ne sais pas maintenant quelle est la meilleure méthode. Auparavant, je l'ai suggéré lspci -k | grep -A 2 -E "(VGA|3D)". Cependant, cela ne donne pas les ID corrects sur mon nouveau système Threadripper.

Ce qui a fonctionné était d' sudo startxouvrir, /var/log/Xorg.0.log(ou n'importe quel emplacement les listes startX dans sa sortie sous la ligne "Fichier journal:"), et de rechercher la ligne NVIDIA(0): Valid display device(s) on GPU-<GPU number> at PCI:<PCI ID>.

Éditer /etc/X11/xorg.conf

Voici un exemple pour une machine à trois GPU:

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

Le BusIDdoit correspondre à l'ID PCI que nous avons identifié à l'étape précédente. L'option AllowEmptyInitialConfigurationpermet à X de démarrer même si aucun moniteur n'est connecté. L'option Coolbitspermet de contrôler les ventilateurs. Il peut également permettre l'overclocking, mais cela n'a pas été testé par moi.

Éditer /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

cat

J'utilise .xinitrc pour exécuter les paramètres nvidia pour plus de commodité, bien qu'il existe probablement d'autres façons. Ici, j'ai réglé les fans à 75%. J'empêche le serveur X de se fermer avec la catcommande vide . Ce n'est pas strictement nécessaire, mais je trouve que j'ai parfois des problèmes avec les cartes qui refusent de quitter l'état de faible puissance du P8 si X se ferme. La première ligne imprimera chaque ventilateur GPU du système.

Lancer X

sudo startx -- :0

Vous pouvez exécuter cette commande à partir de SSH. La sortie sera:

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.

Surveillez les températures et les vitesses d'horloge

nvidia-smipeut être utilisé pour observer les températures et la consommation d'énergie. Des températures plus basses permettront à la carte de cadencer plus haut et d'augmenter sa consommation d'énergie. Vous pouvez utiliser sudo nvidia-smi -pl 150pour limiter la consommation d'énergie et garder les cartes au frais, ou utiliser sudo nvidia-smi -pl 300pour les laisser overclocker. Mon 1080 Ti fonctionne à 1480 MHz si 150W, et à plus de 1800 MHz si 300W, mais cela dépend de la charge de travail. Vous pouvez surveiller leur vitesse d'horloge avec nvidia-smi -qou plus précisément,watch 'nvidia-smi -q | grep -E "Utilization| Graphics|Power Draw"'

Retour à la gestion automatique des ventilateurs.

Redémarrez. Je n'ai pas trouvé d'autre moyen de rendre les fans automatiques.

Aleksandr Dubinsky
la source
Pouvez-vous contrôler individuellement les ventilateurs sur chaque GPU de cette façon? J'ai vu que les cartes EVGA 1080 Ti utilisant cette méthode ne changent que le n ° 1 (sur 3 fans). Des recommandations pour les marques compatibles Linux qui n'utilisent pas de méthodes de configuration non standard (comme EVGA le fait)?
ehiller
@ehiller Je n'ai que des cartes Founder's Edition qui ont un seul ventilateur de type souffleur. Un tel refroidisseur fonctionne mieux lorsque plusieurs cartes sont dans un système. Que nvidia-settings -q fansmontre-t-on? (Vous pouvez l'exécuter dans .xinitrc) Peut-être pouvez-vous régler tous les ventilateurs si vous les adressez correctement.
Aleksandr Dubinsky
1
@Arin Pas sûr, mais est-il AllowEmptyInitialConfigurationcorrectement défini pour l'ID PCI correct dans xorg.conf? Ce fichier peut être délicat.
Aleksandr Dubinsky
1
Il y a un outil fourni par NVIDIA pour générer automatiquement le fichier xorg.conf et ça marche plutôt bien:nvidia-xconfig --allow-empty-initial-configuration --enable-all-gpus --cool-bits=28 --separate-x-screens
Hubert Perron
1
Afaik, vous ne pouvez pas sous-tension les GPU NVIDIA sans jouer avec le BIOS personnalisé. Au lieu de cela , je suis définir une valeur limite de puissance du logiciel en watts: nvidia-smi -pl 120. Cela limitera la consommation d'énergie de chaque GPU à 120 W. Vous pouvez également overclocker / sous-cadrer le noyau et mem en utilisant nvidia-smiou nvidia-settings. Il y a un exemple d'overclocking dans le nvidia-smidoc ici: devblogs.nvidia.com/… Si vous avez nvidia-settingsinstallé vous pouvez appliquer un décalage d'horloge sans avoir à utiliser d'horloge spécifique:nvidia-settings -a [gpu]/GPUGraphicsClockOffset[3]=100
Hubert Perron
2

J'ai écrit un script Python installable par pip pour faire quelque chose de similaire à la suggestion de @ AlexsandrDubinsky .

Lorsque vous exécutez fans.py, il configure un serveur X temporaire pour chaque GPU avec un faux écran attaché. Ensuite, il passe en boucle sur les GPU toutes les quelques secondes et définit la vitesse du ventilateur en fonction de leur température. Lorsque le script meurt, il rend le contrôle des ventilateurs aux pilotes et nettoie les serveurs X.

Andy Jones
la source
Merci! Quelque chose que j'ai essayé de comprendre mais que je ne pouvais pas, c'est comment faire tout cela dans Docker et éviter d'installer le serveur X. Avez-vous essayé cela?
Aleksandr Dubinsky
Je n'ai pas essayé, j'ai peur, et je ne peux pas penser à un moyen de le faire sans que le serveur X soit accessible. Aurait à régler la vitesse du ventilateur d'une autre manière quenvidia-settings
Andy Jones
Eh bien, le pilote nvidia est accessible dans des conteneurs et peut être utilisé pour exécuter par exemple CUDA. Je pense qu'il devrait être possible de lancer le serveur X et de le faire parler au pilote nvidia, mais je n'ai pas eu de chance jusqu'à présent.
Aleksandr Dubinsky du