¿Cómo ajustar la velocidad del ventilador de la GPU NVIDIA en un nodo sin cabeza?

¿Cómo ajustar la velocidad del ventilador de la GPU NVIDIA en un nodo sin cabeza?

¿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.confentrada 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.confy 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 BusIDcampos. 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.confuna 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 BusIDcoincidir con los ID de autobús que identificamos en el paso anterior. La opción AllowEmptyInitialConfigurationpermite que X se inicie incluso si no hay ningún monitor conectado. La opción Coolbitspermite 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.confy 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-smiy nvtopse 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 150para limitar el consumo de energía y mantener las tarjetas frías, o usarlo sudo nvidia-smi -pl 300para 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 -qo 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

Escribí un script Python instalable por pip para hacer algo similar a la sugerencia de @AlexsandrDubinsky.

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

información relacionada