¿Cómo es posible controlar la velocidad del ventilador de varias GPU NVIDIA de consumo, como Titan y 1080 Ti, en un nodo sin cabeza que ejecuta Linux?
Respuesta1
El siguiente es un método simple que no requiere secuencias de comandos, conexión de monitores falsos ni manipulación y se puede ejecutar a través de SSH para controlar múltiples ventiladores de GPU NVIDIA. Ha sido probado en Arch Linux.
Crear xorg.conf
sudo nvidia-xconfig --allow-empty-initial-configuration --enable-all-gpus --cool-bits=7
Esto creará una /etc/X11/xorg.conf
entrada para cada GPU, similar al método manual.
Nota:Algunas distribuciones (Fedora, CentOS, Manjaro) tienen archivos de configuración adicionales (por ejemplo, en /etc/X11/xorg.conf.d/
o /usr/share/X11/xorg.conf.d/
), que anulan xorg.conf
y configuran AllowNVIDIAGPUScreens
. Esta opción no es compatible con esta guía. Los archivos de configuración adicionales deben modificarse o eliminarse. El archivo de registro de X11 muestra qué archivos de configuración se han cargado.
Alternativa: crear xorg.conf manualmente
Identifique los ID PCI de sus tarjetas:
nvidia-xconfig --query-gpu-info
Encuentra los PCI BusID
campos. Tenga en cuenta que estos no son los mismos que los ID de bus informados en el kernel.
Alternativamente, haga sudo startx
, abra /var/log/Xorg.0.log
(o cualquier ubicación que startX indique en su salida bajo la línea "Archivo de registro:") y busque la línea NVIDIA(0): Valid display device(s) on GPU-<GPU number> at PCI:<PCI ID>
.
Editar/etc/X11/xorg.conf
A continuación se muestra un ejemplo de xorg.conf
una máquina de tres 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
Deben BusID
coincidir con los ID de autobús que identificamos en el paso anterior. La opción AllowEmptyInitialConfiguration
permite que X se inicie incluso si no hay ningún monitor conectado. La opción Coolbits
permite controlar los ventiladores. También puede permitir el overclocking.
Nota:Algunas distribuciones (Fedora, CentOS, Manjaro) tienen archivos de configuración adicionales (por ejemplo, en /etc/X11/xorg.conf.d/
o /usr/share/X11/xorg.conf.d/
), que anulan xorg.conf
y configuran AllowNVIDIAGPUScreens
. Esta opción no es compatible con esta guía. Los archivos de configuración adicionales deben modificarse o eliminarse. El archivo de registro de X11 muestra qué archivos de configuración se han cargado.
Editar/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
Utilizo .xinitrc para ejecutar la configuración de nvidia por conveniencia, aunque probablemente haya otras formas. La primera línea imprimirá todos los ventiladores de GPU del sistema. Aquí, puse los fans al 75%.
Lanzar X
sudo startx -- :0
Puede ejecutar este comando desde SSH. La salida será:
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.
Monitorear temperaturas y velocidades de reloj.
nvidia-smi
y nvtop
se puede utilizar para observar temperaturas y consumo de energía. Las temperaturas más bajas permitirán que la tarjeta registre más y aumente su consumo de energía. Puede usarlo sudo nvidia-smi -pl 150
para limitar el consumo de energía y mantener las tarjetas frías, o usarlo sudo nvidia-smi -pl 300
para permitirles realizar overclock. Mi 1080 Ti funciona a 1480 MHz si se le dan 150 W, y a más de 1800 MHz si se le dan 300 W, pero esto depende de la carga de trabajo. Puede controlar la velocidad de su reloj con nvidia-smi -q
o más específicamente,watch 'nvidia-smi -q | grep -E "Utilization| Graphics|Power Draw"'
Volviendo a la gestión automática de ventiladores.
Reiniciar. No he encontrado otra forma de hacer que los ventiladores sean automáticos.
Respuesta2
Cuando ejecuta fans.py, configura un servidor X temporal para cada GPU con una pantalla falsa adjunta. Luego, recorre las GPU cada pocos segundos y establece la velocidad del ventilador de acuerdo con su temperatura. Cuando el script muere, devuelve el control de los ventiladores a los controladores y limpia los servidores X.
Respuesta3
Según las respuestas a esta pregunta y preguntas similares de StackExchange, escribí un script de shell que establecerá la velocidad del ventilador 100
(o el valor que desee) entodode tus fans entodode sus GPU en una máquina.
Este script supone que su máquina tiene X11 instalado, pero que no lo está utilizando para ofrecer una GUI a un usuario.
/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
Estos cambios en la velocidad del ventilador no persisten durante los reinicios, por lo que escribí un archivo de unidad systemd para ejecutar el script anterior en cada arranque.
/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
Después de crear el archivo anterior, ejecute los siguientes comandos como root para habilitar la ejecución del script al reiniciar.
systemctl enable set-gpu-fan-speed.service
systemctl start set-gpu-fan-speed.service